7セグメントLED表示器関係のプログラムコード
*アナログ入力もUSBも使用しないため、基本設定は標準的なものとなります。
(1)関数宣言
void InitInterTimer0 (void);でタイマー0の初期設定をおこないます。
(2)マイコン動作周波数(48MHz)の設定
#define _XTAL_FREQ 48000000 //__delay_ms
(3)グローバル変数宣言
unsigned char CH[10] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
*0から9までの値に対する7セグメントLED表示器の点灯パターンを定義shています。
unsigned char gCT=0;
*タイマー0割込み毎のカウンタ値です。(0から3まで変化)
unsigned short gNo=0,gNo3,gNo2,gNo1,gNo0;
* gNoは4桁の10進値を設定します。(この値が表示されます。)
*gNo3,gNo2,gNo1,gNo0は各桁毎の1桁の値です。
(3)void main (void)
void main(void)
{
int i,j;
init();
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
unsigned short L1,L2,L3,L4;
while(1)
{
for(i=0;i<10;i++)
{
for(j=0;j<100;j++){__delay_ms( 10 );}
gNo++;
L1=gNo/10;
L2=L1/10;
L3=L2/10;
L4=L3/10;
gNo3=(L3-L4*10);
gNo2=(L2-L3*10);
gNo1=(L1-L2*10);
gNo0=(gNo-L1*10);
}
}
}
(4)タイマ0割込み設定関数
// タイマ0割込み設定関数
void InitInterTimer0 (void)
{
// クロック源を内部クロックに設定
T0CS = 0;
// プリスケーラをタイマ0に割り当て
PSA = 0;
// プリスケーラ値を128に設定
T0CONbits.T0PS0 = 1;//PIC18F4553
T0CONbits.T0PS1 = 1;//PIC18F4553
T0CONbits.T0PS2 = 0;//PIC18F4553
// TMR0レジスタをクリア
TMR0 = 0x0000;
// タイマ0割込みフラグをクリア
T0IF = 0;
// タイマ0割込みの許可
T0IE = 1;
}
(5)割込みサービスルーチン
// 割込みサービスルーチン
static void interrupt isr()
{
switch (gCT)
{
case 0:
gCT++;
PORTD=~CH[gNo3];
PORTB=0X01;
break;
case 1:
gCT++;
PORTD=~CH[gNo2];
PORTB=0X02;
break;
case 2:
gCT++;
PORTD=~CH[gNo1];
PORTB=0X04;
break;
case 3:
gCT++;
PORTD=~CH[gNo0];
PORTB=0X08;
break;
default:
gCT=0;
break;
}
// タイマ0割込みフラグをクリア
T0IF = 0;
}