動態(tài)顯示PIC定時器1實現(xiàn)秒計數(shù)
//利用T1中斷實現(xiàn)每秒加1功能 //
//PORTC為段選控制端a-g,D0-D4分別控制共陽極數(shù)碼管的位選,
#include
#include
#define uint unsigned int
#define uchar unsigned char
const char table[10]= //恒定不變0-9(由數(shù)碼管型號確定)
{
// 0x21,0xE7,0x32,0x38,0x6C,0xA8,0xA0,0x3D,0x20,0x28,
0xFD,0x91,0xE7,0x6F,0x1F,0x7B,0xFB,0x2D,0xFF,0x7F,
};
uchar count=0 ;
uchar data1=0;
void Delay(char x)
{
char i;
while(x--)
for(i=0;i<200;i++);
}
////////////系統(tǒng)初始化////////////////////////
void initial()
{
TRISB=0x00; //端口設(shè)置
TRISC=0x00;
TRISD=0x00;
PORTB=0xFF; //開始都關(guān)
PORTC=0xFF; //共陽極
PORTD=0x00;
INTCON=0x00; //關(guān)中斷
PIE1=0x00 ;
PIR1=0x00 ;
}
//////////T0初始化///////////////////////////
void time1_init()
{
T1CON=0x08; //16位定時方式,
TMR1IE=1; //中斷允許位
TMR1IF=0; //清中斷標(biāo)志位
TMR1H=0xD9; //設(shè)置初始值
TMR1L=0x00;
}
////////////中斷查詢并處理///////////////////
//////////////////顯示/////////////////////
display(uchar data)
{ uchar a,b,c,d;
a=(data/1000); //千位
b=(data%1000/100); //百位
c=(data%100/10); //十位
d=(data%10); //個位
PORTD=0xFE;
PORTB=table[a]; //顯示個位
Delay(2);
PORTD=0xFD;
PORTB=table[b]; //顯示十位
Delay(2);
PORTD=0xFB;
PORTB=table[c]; //顯示百位
Delay(2);
PORTD=0xF7;
PORTB=table[d]; //顯示千位
Delay(2);
PORTD=0xFF;
}
void interrupt time1_ISR()
{
if(TMR1IF==1) //10ms中斷
{
TMR1H=0xD9 ; //重載計數(shù)初始值
TMR1L=0x00 ;
TMR1IF=0 ; //清中斷
count=count+1 ;
if(count==100)
{ count=0; //每1秒清count ,重新開始等待1秒
data1=data1+1 ; //每1秒+1,并顯示
}
}
}
//////////////主程序/////////////////////////
main()
{
//uchar i;
initial();
time1_init();
INTCON=INTCON|0xC0; //GIE=1,PEIE=1;
TMR1ON=1; //打開定時器1
while(1)
{
display(data1);
}
}