#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define setb(val,bitn) (val|=(1<<(bitn)))//設(shè)置某IO口某位為1
#define clr(val,bitn) (val&=~(1<<(bitn)))//設(shè)置某IO口某位為0
#define get(val,bitn) (val&(1<<(bitn)))//讀取某位狀態(tài)
uchar shi=20,fen=39,miao,a=0xff,num;
#pragma interrupt_handler zhong:9//它所對(duì)應(yīng)的位置
#pragma data:code//定義程序存在ROM里面
const uchar table[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,
0x8e
};
/***********************************************/
/*******************延時(shí)子程序******************/
/***********************************************/
void delay(uchar z)
{
uchar x,y;
for(x=0;x<255;x++)
for(y=0;y<z;y++);
}
/***********************************************/
/*******************響一聲子程序****************/
/***********************************************/
void bbtt()
{
DDRA|=BIT(1);
clr(PORTA,1);
delay(250);
setb(PORTA,1);
delay(250);
}
/***********************************************/
/*******************顯示子程序******************/
/***********************************************/
void xian(uchar shia,uchar fena)
{
PORTB=table[shia/10];//小時(shí)十位
clr(PORTC,3);
delay(2);
setb(PORTC,3);
if(a==0)//如果標(biāo)志位等于0xff,則關(guān)閉小時(shí)個(gè)位數(shù)碼管
PORTB=table[shia%10]|0x80;//小時(shí)個(gè)位
else//否則
PORTB=table[shia%10]&0x7f;//小時(shí)個(gè)位數(shù)碼管強(qiáng)行點(diǎn)亮
clr(PORTC,2);
delay(2);
setb(PORTC,2);
PORTB=table[fena/10];//分鐘十位
clr(PORTC,1);
delay(2);
setb(PORTC,1);
PORTB=table[fena%10];//分鐘個(gè)位
clr(PORTC,0);
delay(2);
setb(PORTC,0);
}
/***********************************************/
/*****************按鍵處理子程序****************/
/***********************************************/
void sk()
{
uchar k;//定義一個(gè)變量來(lái)存數(shù)
DDRD&=0Xf0;//設(shè)置PD IO口為輸入方式,高4位不管
PORTD|=0X0f;//設(shè)置IO口低4位為輸入方式且?guī)侠娮,即高電?/***********************************************/
/****************主功能鍵產(chǎn)生鍵值***************/
/***********************************************/
if(!get(PIND,0))//如果鍵值為0則說(shuō)明有按鍵按下了
{
delay(1);//消抖一下
if(!get(PIND,0))//再次判斷一下
{
bbtt();//調(diào)用鈴聲
num++;//鍵值標(biāo)志加1
a=0x00;//標(biāo)志位變?yōu)?
if(num==4)//如果標(biāo)志位為4則清0
{
num=0;
TIMSK|=BIT(2);//打開(kāi)定時(shí)器中斷
a=0x00;
}
}
while(!get(PIND,0));//按鍵松手檢測(cè),即如果鍵值處理程序
為1則說(shuō)明有鍵按下,
}
/***********************************************/
/*****************鍵值判斷控制******************/
/***********************************************/
switch(num)
{
/*****************如果鍵值等于1時(shí)******************/
case 1:
TIMSK&=~BIT(2);//關(guān)閉定時(shí)器中斷
break;
/*****************如果鍵值等于2時(shí)******************/
case 2:
if(!get(PIND,1))//如果鍵值為0則說(shuō)明有按鍵按下了
{
delay(1);//消抖一下
if(!get(PIND,1))//再次判斷一下
{
bbtt();
shi++;//將小時(shí)加1
if(shi==24)
shi=0;
while(!get(PIND,1));//按鍵松手檢測(cè),
即如果鍵值處理程序?yàn)?則說(shuō)明有鍵按下,
}
}
if(!get(PIND,2))//如果鍵值為0則說(shuō)明有按鍵按下了
{
delay(1);//消抖一下
if(!get(PIND,2))//再次判斷一下
{
bbtt();
shi--;//將小時(shí)減1
if(shi==(0-1))
shi=23;
while(!get(PIND,2));//按鍵松手檢測(cè),
即如果鍵值處理程序?yàn)?則說(shuō)明有鍵按下,
}
}
break;
/*****************如果鍵值等于3時(shí)******************/
case 3:
if(!get(PIND,1))//如果鍵值為0則說(shuō)明有按鍵按下了
{
delay(1);//消抖一下
if(!get(PIND,1))//再次判斷一下
{
bbtt();
fen++;//分鐘加1
if(fen==60)
shi=59;
while(!get(PIND,1));//按鍵松手檢測(cè),
即如果鍵值處理程序?yàn)?則說(shuō)明有鍵按下,
}
}
if(!get(PIND,2))//如果鍵值為0則說(shuō)明有按鍵按下了
{
delay(1);//消抖一下
if(!get(PIND,2))//再次判斷一下
{
bbtt();
fen--;//分鐘減1
if(fen==(0-1))
shi=59;
while(!get(PIND,2));//按鍵松手檢測(cè),
即如果鍵值處理程序?yàn)?則說(shuō)明有鍵按下,
}
}
break;
}
}
/***********************************************/
/*******************主程序*********************/
/***********************************************/
void main()
{
DDRB=0XFF;//設(shè)置PA口為輸出方式
DDRC|=0x0f;//設(shè)置兩位為輸出方式
TCCR1B=0X04;//設(shè)置256分頻 6M晶體=6000000/256分頻-65535化成16
進(jìn)制
TCNT1H=0XD2;//給它高位賦值
TCNT1L=0X38;//給它低位賦值
TIMSK|=BIT(2);//打開(kāi)定時(shí)器中斷
SREG|=BIT(7);//打開(kāi)總中斷
while(1)
{
sk();//按鍵調(diào)用
xian(shi,fen);//顯示調(diào)用
}
}
/***********************************************/
/*****************中斷服務(wù)子程序***************/
/***********************************************/
void zhong()
{
TCNT1H=0XD2;//給它高位賦值
TCNT1L=0X38;//給它低位賦值
miao++;//將變量加1
a=~a;//將標(biāo)志位取反,小數(shù)點(diǎn)閃爍標(biāo)志位
if(miao==120)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
完整代碼下載地址:http://www.torrancerestoration.com/f/dzza.rar