PIC16F1789 & MPUトレーナー 6 / 7 セグメント LED を使う 2 / 外部スイッチで何かを表示する

  f:id:ti-nspire:20170314072414p:plain


main.c

#include "mcc_generated_files/mcc.h"

#define PUSH_SW0    RA3
#define PUSH_SW1    RB7
#define PUSH_SW2    RE3

#define DIG1    RE0 //千の位
#define DIG2    RE1 //百の位
#define DIG3    RE2 //十の位
#define DIG4    RC1 //一の位

volatile int msCnt = 0;
void delay_ms(int cnt) {
	msCnt = cnt;
	while(msCnt);
}

void SelectDig(int dig) {
	DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0;
	if((dig < 0) || (dig > 3)) {return;}
	switch(dig) {
		case 0: DIG4 = 1; break;
		case 1: DIG3 = 1; break;
		case 2: DIG2 = 1; break;
		case 3: DIG1 = 1; break;
	}
}

void ShowSeg(int val) {
	char pat[] = {
		//ABCDEFGP
		0b11111100, //0
		0b01100000, //1
		0b11011010, //2
		0b00000000, //all off
	};
	PORTD = pat[val];
}

void ShowData(int dat) {
	int i;
	int val;
	for(i = 0; i < 4; i++) {
		val = (dat & 0x000f);
		ShowSeg(val);
		SelectDig(i);
		delay_ms(1);
		SelectDig(-1);
		dat >>= 4;
	}
}

void main(void) {
	SYSTEM_Initialize();

	INTERRUPT_GlobalInterruptEnable();
	INTERRUPT_PeripheralInterruptEnable();

	/*
	while(1) {
		if(!PUSH_SW0) {ShowData(0x3330);} //XXX0
		if(!PUSH_SW1) {ShowData(0x3313);} //XX1X
		if(!PUSH_SW2) {ShowData(0x3233);} //X2XX

		if(!PUSH_SW1 && !PUSH_SW0) {ShowData(0x3310);}              //XX10
		if(!PUSH_SW2 && !PUSH_SW0) {ShowData(0x3230);}              //X2X0
		if(!PUSH_SW2 && !PUSH_SW1) {ShowData(0x3213);}              //X21X
		if(!PUSH_SW2 && !PUSH_SW1 && !PUSH_SW0) {ShowData(0x3210);} //X210

		if(PUSH_SW2 && PUSH_SW1 && PUSH_SW0) {ShowData(0x3333);} //XXXXX
	}
	*/
	while(1) {
		int str = 0x3333;
		if(!PUSH_SW0) {str = str - 0x0003;}
		if(!PUSH_SW1) {str = str - 0x0020;}
		if(!PUSH_SW2) {str = str - 0x0100;}
		ShowData(str);
	}
}

PIC16F1789 & MPUトレーナー 5 / 7 セグメント LED を使う 1

参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), p.61, pp.64-65
youtu.be
f:id:ti-nspire:20170305193901p:plain:h200 f:id:ti-nspire:20170304151145p:plain:h200


main.c

#include "mcc_generated_files/mcc.h"

#define DIG1   RE0 //千の位
#define DIG2   RE1 //百の位
#define DIG3   RE2 //十の位
#define DIG4   RC1 //一の位

// 遅延函数
volatile int msCnt = 0;
void delay_ms(int cnt) {
	msCnt = cnt;
	while(msCnt);
}

//表示する桁を選択する。
void SelectDig(int dig) {
	DIG1 = 0;
	DIG2 = 0;
	DIG3 = 0;
	DIG4 = 0;
	if((dig < 0) || (dig > 3)) {
		return;
	}
	switch(dig) {
		case 0:  DIG4 = 1; break;
		case 1:  DIG3 = 1; break;
		case 2:  DIG2 = 1; break;
		case 3:  DIG1 = 1; break;
	}
}

// 1 桁分のデータを出力する。
void ShowSeg(int val) {
	char pat[16] = {
		//ABCDEFGP
		0b11111100, //0
		0b01100000, //1
		0b11011010, //2
		0b11110010, //3
		0b01100110, //4
		0b10110110, //5
		0b10111110, //6
		0b11100100, //7
		0b11111110, //8
		0b11100110, //9
		0b11101110, //A
		0b00111110, //b
		0b00011010, //c
		0b01111010, //d
		0b10011110, //E
		0b10001110, //F
	};
	PORTD = pat[val]; // たとえば val = 1 のときは RD7 ~ 1 に 01100000 がセットされる。
}

// 4 桁の数字を表示する。
void ShowData(int dat) {
	int i;
	int val;
	for(i = 0; i < 4; i++) {
		val = (dat & 0x000f); // 16 進 4 桁の最下位桁だけ取り出して、
		ShowSeg(val);         // それを 1 桁分のデータとしてセットし、
		SelectDig(i);         // i 桁目に出力し、
		delay_ms(1);          // 目に焼きつけてから残像が消えないうちに、
		SelectDig(-1);        // 全桁の表示を一旦消し、
		dat >>= 4;            // 16 進 4 桁の最下位桁を追い出して消す。これを 4 桁ぶん繰り返す。
	}
}

void main(void) {
	SYSTEM_Initialize();

	// 割り込みを使うときは以下のマクロを使う。
	INTERRUPT_GlobalInterruptEnable();
	INTERRUPT_PeripheralInterruptEnable();

	// 確かめてみる。
	while (1) {
		for(int i = 1; i < 0xffff; i++) {
			ShowData(i);
		}
	}
}

PIC16F1789 & MPUトレーナー 4 / 外部スイッチで LED を点滅する

参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), p.59
f:id:ti-nspire:20170304145742p:plain:h250


main.c

#include "mcc_generated_files/mcc.h"

#define LED0    RB2
#define LED1    RB3
#define LED2    RB4

#define PUSH_SW0 RA3
#define PUSH_SW1 RB7
#define PUSH_SW2 RE3

#define LED_ON  1
#define LED_OFF 0

void main(void) {
    SYSTEM_Initialize();

    while (1) {
        if( PUSH_SW0) {LED0 = LED_OFF;}
        if(!PUSH_SW0) {LED0 = LED_ON ;}
        if( PUSH_SW1) {LED1 = LED_OFF;}
        if(!PUSH_SW1) {LED1 = LED_ON ;}
        if( PUSH_SW2) {LED2 = LED_OFF;}
        if(!PUSH_SW2) {LED2 = LED_ON ;}
    }
}