/******************************************************************************* * 實驗名 : 定時器實驗 * 使用的IO : * 實驗效果 :1602顯示時鐘,按K3進入時鐘設置,按K1選擇設置的時分秒,按K2選擇 *選擇設置加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; //用來計時間的值 unsigned char SetPlace; //設置修改位 /******************************************************************************* * 函 數 名 : main * 函數功能 : 主函數 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void main(void) { unsigned char hour=13,minute=14,second=00; unsigned char H2[]=" I LOVE YOU!!! "; //可以改成任意16個字符。 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); //消除抖動 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); //消除抖動 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); //消除抖動 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); //消除抖動 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) //一秒鐘來到改變數值 { Time=0; second++; if(second==60) { second=0; minute++; if(minute==60) { minute=0; hour++; if(hour==24) { hour=0; } } } } //--顯示時鐘--// 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); } } } /******************************************************************************* * 函 數 名 : Delay1ms() * 函數功能 : 延時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--); } } } /******************************************************************************* * 函 數 名 : TimerConfiguration() * 函數功能 : 配置定時器值 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void TimerConfiguration() { TMOD = 0x01; //選擇工作方式1 TH0 = 0x3C; //設置初始值 50ms TL0 = 0xB0; EA = 1; //打開總中斷 ET0 = 1; //打開定時器0中斷 TR0 = 1; //啟動定時器0 } /******************************************************************************* * 函 數 名 : Timer0() * 函數功能 : 定時器0中斷函數 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Timer0() interrupt 1 { TH0 = 0x3C; //設置初始值 50ms TL0 = 0xB0; Time++; } /******************************************************************************* * 函 數 名 : Int0Configuration() * 函數功能 : 配置外部中斷0 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Int0Configuration() { //設置INT0 IT0=1;//跳變沿出發方式(下降沿) EX0=1;//打開INT0的中斷允許。 EA=1;//打開總中斷 } /******************************************************************************* * 函 數 名 : Int0() interrupt 0 * 函數功能 : 外部中斷0的中斷函數 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void Int0() interrupt 0 { Delay1ms(10); if(K3==0) { TR0=~TR0; SetPlace=0; } } 書上原來的程序,可以實現1602顯示時鐘,按K3進入時鐘設置,按K1選擇設置的時分秒,按K2選擇加1。 但是進入設置后,正在設置的哪一位沒有光標提示,不夠人性化。我在原程序的基礎上,加以修改,進入設置功能后,正在設置哪一位,有了光標閃爍提示。
|