/******************************************************************************* * 實(shí)驗(yàn)名 : 定時(shí)器實(shí)驗(yàn) * 使用的IO : * 實(shí)驗(yàn)效果 :1602顯示時(shí)鐘,按K3進(jìn)入時(shí)鐘設(shè)置,按K1選擇設(shè)置的時(shí)分秒,按K2選擇 *選擇設(shè)置加1。 * 注意 : *******************************************************************************/ #include<reg51.h> #include"lcd.h" sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; void Delay1ms(unsigned int c); void TimerConfiguration(); void Int0Configuration(); unsigned char Time; //用來計(jì)時(shí)間的值 unsigned char SetPlace; //設(shè)置修改位 /******************************************************************************* * 函 數(shù) 名 : main * 函數(shù)功能 : 主函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void main(void) { unsigned char hour=13,minute=14,second=00; unsigned char H2[]=" I LOVE YOU!!! "; //可以改成任意16個(gè)字符。 unsigned int i; TimerConfiguration(); Int0Configuration(); LcdInit(); LcdWriteCom(0x84); LcdWriteData('0'+hour/10); LcdWriteData('0'+hour%10); LcdWriteData(':'); LcdWriteData('0'+minute/10); LcdWriteData('0'+minute%10); LcdWriteData(':'); LcdWriteData('0'+second/10); LcdWriteData('0'+second%10); LcdWriteCom(0xc0); for(i=0;i<16;i++) //第2行顯示的字符 { LcdWriteData(H2); } while(1) { if(TR0==0) { if(K1==0) //檢測按鍵K1是否按下 { Delay1ms(10); //消除抖動(dòng) if(K1==0) { SetPlace++; Delay1ms(100); if(SetPlace>=3) SetPlace=0; } while((i<50)&&(K1==0)) //檢測按鍵K1是否松開 { Delay1ms(1); i++; } i=0; } switch(SetPlace) {case 0 : {LcdWriteCom(0x8b); //定位置 LcdWriteCom(0x0f); Delay1ms(100); if(K2==0) //檢測按鍵K2是否按下 { Delay1ms(10); //消除抖動(dòng) if(K2==0) { second++; Delay1ms(100); if(second>=60) second=0; } } LcdWriteCom(0x8a); //定位置 LcdWriteData('0'+second/10); LcdWriteData('0'+second%10); LcdWriteCom(0x8b); }break; case 1 : {LcdWriteCom(0x88); //定位置 LcdWriteCom(0x0f); Delay1ms(100); if(K2==0) //檢測按鍵K2是否按下 { Delay1ms(10); //消除抖動(dòng) if(K2==0) { minute++; Delay1ms(100); if(minute>=60) minute=0; } } LcdWriteCom(0x87); //定位置 LcdWriteData('0'+minute/10); LcdWriteData('0'+minute%10); LcdWriteCom(0x88); }break; case 2 : {LcdWriteCom(0x85); //定位置 LcdWriteCom(0x0f); Delay1ms(100); if(K2==0) //檢測按鍵K2是否按下 { Delay1ms(10); //消除抖動(dòng) if(K2==0) { hour++; Delay1ms(100); if(hour>=24) hour=0; } } LcdWriteCom(0x84); //定位置 LcdWriteData('0'+hour/10); LcdWriteData('0'+hour%10); LcdWriteCom(0x85); }break; } } else { LcdWriteCom(0x0c); if(Time>=20) //一秒鐘來到改變數(shù)值 { Time=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; } } } } //--顯示時(shí)鐘--// LcdWriteCom(0x84); LcdWriteData('0'+hour/10); LcdWriteData('0'+hour%10); LcdWriteData(':'); LcdWriteData('0'+minute/10); LcdWriteData('0'+minute%10); LcdWriteData(':'); LcdWriteData('0'+second/10); LcdWriteData('0'+second%10); } } } /******************************************************************************* * 函 數(shù) 名 : Delay1ms() * 函數(shù)功能 : 延時(shí)1ms * 輸 入 : c * 輸 出 : 無 *******************************************************************************/ void Delay1ms(unsigned int c) //誤差 0us { unsigned char a,b; for (; c>0; c--) { for(b=199;b>0;b--) { for(a=1;a>0;a--); } } } /******************************************************************************* * 函 數(shù) 名 : TimerConfiguration() * 函數(shù)功能 : 配置定時(shí)器值 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void TimerConfiguration() { TMOD = 0x01; //選擇工作方式1 TH0 = 0x3C; //設(shè)置初始值 50ms TL0 = 0xB0; EA = 1; //打開總中斷 ET0 = 1; //打開定時(shí)器0中斷 TR0 = 1; //啟動(dòng)定時(shí)器0 } /******************************************************************************* * 函 數(shù) 名 : Timer0() * 函數(shù)功能 : 定時(shí)器0中斷函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Timer0() interrupt 1 { TH0 = 0x3C; //設(shè)置初始值 50ms TL0 = 0xB0; Time++; } /******************************************************************************* * 函 數(shù) 名 : Int0Configuration() * 函數(shù)功能 : 配置外部中斷0 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Int0Configuration() { //設(shè)置INT0 IT0=1;//跳變沿出發(fā)方式(下降沿) EX0=1;//打開INT0的中斷允許。 EA=1;//打開總中斷 } /******************************************************************************* * 函 數(shù) 名 : Int0() interrupt 0 * 函數(shù)功能 : 外部中斷0的中斷函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Int0() interrupt 0 { Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=0; } } 書上原來的程序,可以實(shí)現(xiàn)1602顯示時(shí)鐘,按K3進(jìn)入時(shí)鐘設(shè)置,按K1選擇設(shè)置的時(shí)分秒,按K2選擇加1。 但是進(jìn)入設(shè)置后,正在設(shè)置的哪一位沒有光標(biāo)提示,不夠人性化。我在原程序的基礎(chǔ)上,加以修改,進(jìn)入設(shè)置功能后,正在設(shè)置哪一位,有了光標(biāo)閃爍提示。
|