动态显示PIC定时器1实现秒计数
扫描二维码
随时随地手机看文章
//利用T1中断实现每秒加1功能 //
//PORTC为段选控制端a-g,D0-D4分别控制共阳极数码管的位选,
#include
#include
#define uint unsigned int
#define uchar unsigned char
const char table[10]= //恒定不变0-9(由数码管型号确定)
{
// 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++);
}
////////////系统初始化////////////////////////
void initial()
{
TRISB=0x00; //端口设置
TRISC=0x00;
TRISD=0x00;
PORTB=0xFF; //开始都关
PORTC=0xFF; //共阳极
PORTD=0x00;
INTCON=0x00; //关中断
PIE1=0x00 ;
PIR1=0x00 ;
}
//////////T0初始化///////////////////////////
void time1_init()
{
T1CON=0x08; //16位定时方式,
TMR1IE=1; //中断允许位
TMR1IF=0; //清中断标志位
TMR1H=0xD9; //设置初始值
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 ; //重载计数初始值
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);
}
}