参考: 定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ), p.61, pp.64-65
youtu.be
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); } } }