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);
		}
	}
}