PIC中断的应用(二)
扫描二维码
随时随地手机看文章
//中断的应用二
//★★★★★★★★★数字钟★★★★★★★★★★★\
//单征机型号:PIC16F877A
//功能描述:数字钟功能,初始显示时间为12点,且带手动调整时间功能。
//端口定义:RA0~RA5数码管位控制口、RD0~RD7数码管段控制口、RB0秒增一、RB1分增一、RB2时增一。
#include
__CONFIG(0xf73A); //芯片配置字
const unsigned char dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选0~9
unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位选,数码管1~8
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //时间数据寄存器
unsigned int tcnt; //百分之一秒计数器
unsigned char second; //秒计数器
unsigned char minite; //分计数器
unsigned char hour; //时计数器
unsigned char dispbitcnt; //显示子程序中段与位显示计数器
bit keyb0,keyb1,keyb2; //RB0,RB1,RB2按键作用标志位
//========================================================================
//功能描述:延时子程序
//函数名称:delay);
void delay()
{
int i;
for(i=80;i>0;i--);
}
//========================================================================
//功能描述:显示子程序
//函数名称:disp();
void disp()
{
PORTA=dispbitcode[dispbitcnt];
PORTD=dispcode[dispbuf[dispbitcnt]];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
delay();
}
//========================================================================
//功能描述:端口初始化
//函数名称:portinit();
void portinit()
{
TRISA=0x00; //PA口设为输出
TRISB=0xff; //PB口设为输入
TRISC=0x00; //PC口设为输出
TRISD=0x00; //PC口设为输出
PORTA=0x00; //PA口设为输出为0
PORTB=0x00;
PORTC=0x00;
PORTD=0;
tcnt=0;
second=0;
minite=0;
hour=12;
dispbitcnt=0;
keyb0=0;
keyb1=0;
keyb2=0;
}
//=====================================================================
//功能描述:定时中断服务
//函数名称:TimeInt();
void interrupt TimeInt(void)
{
tcnt++;
if(tcnt==20)
{
tcnt=0;
second++;
if(second==60)
{
second=0;
minite++;
if(minite==60)
{
minite=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
dispbuf[0]=hour/10;
dispbuf[1]=hour%10;
dispbuf[2]=minite/10;
dispbuf[3]=minite%10;
dispbuf[4]=second/10;
dispbuf[5]=second%10;
dispbuf[6]=tcnt/10;
dispbuf[7]=tcnt%10;
TMR0 = 0x3d; //定时初值
T0IF = 0; //清除标志
}
//========================================================================
//功能描述:中断设置
//函数名称:IdsInit();
void IdsInit(void)
{
OPTION = 0x87; //分频因子
TMR0 = 0x3d; //定时初值
T0IE = 1; //开启定时
GIE = 1; //准许中断
}
//========================================================================
//功能描述:手动调时子程序
//函数名称:key();
void key()
{
if(RB0==0)
{
delay();
if(RB0==0)
{
if(keyb0==0)
{
keyb0=1;
second++;
if(second==60)
{second=0;}
}
}
}
else keyb0=0;
if(RB1==0)
{
delay();
if(RB1==0)
{
if(keyb1==0)
{
keyb1=1;
minite++;
if(minite==60)
{minite=0;}
}
}
}
else keyb1=0;
if(RB2==0)
{
delay();
if(RB2==0)
{
if(keyb2==0)
{
keyb2=1;
hour++;
if(hour==24)
{hour=0;}
}
}
}
else keyb2=0;
}
//========================================================================
//功能描述:主程序
//函数名称:main();
main()
{
portinit(); //端口初始化
IdsInit(); //TMR0初始化
while(1)
{
disp();
key();
}
}