#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);//打開定時(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);//打開定時(shí)器中斷 SREG|=BIT(7);//打開總中斷 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.zg4o1577.cn/f/dzza.rar