//中斷的應(yīng)用二
//★★★★★★★★★數(shù)字鐘★★★★★★★★★★★\
//單征機型號:PIC16F877A
//功能描述:數(shù)字鐘功能,初始顯示時間為12點,且?guī)謩诱{(diào)整時間功能。
//端口定義:RA0~RA5數(shù)碼管位控制口、RD0~RD7數(shù)碼管段控制口、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}; //位選,數(shù)碼管1~8
unsigned char dispbuf[8]={0,0,16,0,0,16,0,0}; //時間數(shù)據(jù)寄存器
unsigned int tcnt; //百分之一秒計數(shù)器
unsigned char second; //秒計數(shù)器
unsigned char minite; //分計數(shù)器
unsigned char hour; //時計數(shù)器
unsigned char dispbitcnt; //顯示子程序中段與位顯示計數(shù)器
bit keyb0,keyb1,keyb2; //RB0,RB1,RB2按鍵作用標志位
//========================================================================
//功能描述:延時子程序
//函數(shù)名稱:delay);
void delay()
{
int i;
for(i=80;i>0;i--);
}
//========================================================================
//功能描述:顯示子程序
//函數(shù)名稱:disp();
void disp()
{
PORTA=dispbitcode[dispbitcnt];
PORTD=dispcode[dispbuf[dispbitcnt]];
dispbitcnt++;
if(dispbitcnt==8)
{
dispbitcnt=0;
}
delay();
}
//========================================================================
//功能描述:端口初始化
//函數(shù)名稱:portinit();
void portinit()
{
TRISA=0x00; //PA口設(shè)為輸出
TRISB=0xff; //PB口設(shè)為輸入
TRISC=0x00; //PC口設(shè)為輸出
TRISD=0x00; //PC口設(shè)為輸出
PORTA=0x00; //PA口設(shè)為輸出為0
PORTB=0x00;
PORTC=0x00;
PORTD=0;
tcnt=0;
second=0;
minite=0;
hour=12;
dispbitcnt=0;
keyb0=0;
keyb1=0;
keyb2=0;
}
//=====================================================================
//功能描述:定時中斷服務(wù)
//函數(shù)名稱: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; //清除標志
}
//========================================================================
//功能描述:中斷設(shè)置
//函數(shù)名稱:IdsInit();
void IdsInit(void)
{
OPTION = 0x87; //分頻因子
TMR0 = 0x3d; //定時初值
T0IE = 1; //開啟定時
GIE = 1; //準許中斷
}
//========================================================================
//功能描述:手動調(diào)時子程序
//函數(shù)名稱: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;
}
//========================================================================
//功能描述:主程序
//函數(shù)名稱:main();
main()
{
portinit(); //端口初始化
IdsInit(); //TMR0初始化
while(1)
{
disp();
key();
}
}