#include sbit LCD_RS=P1^0;//定義接腳 sbit LCD_RW=P1^1; sbit LCD_E=P1^2; #define LCD_Data P2 void WriteDataLCD(char WDLCD); void WriteCommandLCD(char WCLCD); void LCDInit(void); //void ChangeCursor(char X,char Y); void DisplayListChar(char code *DData); void display(char num); void delay_us(unsigned int t); char code Str1[] = "00:00:00"; //LCD最初顯示的狀態 unsigned char subsec,second,minute,hour; //主程式開始 void main(void) { LCDInit(); //LCM初始化 subsec = 2; //時間比實際快10倍, 如要跟實際的一樣, 請將此數值調整成20 second = 0; minute = 0; hour = 0; TMOD = 0x01; //設定timer 0工作於 mode 1 TH0 = (65536-49990) / 256; //設定計數49990次 TL0 = (65536-49990) % 256; TR0 = 1; //啟動計時器0 IE = 0x82; //啟動計時器0 中斷 DisplayListChar(Str1); while(1); } void timer0_isr(void) interrupt 1 //計時器0的中斷函數, 使用中斷向量1 { TH0 = (65536-49990) / 256; //重新設定計數49990次 TL0 = (65536-49990) % 256; subsec--; if (subsec == 0) //判斷是否計數200次(1秒鐘) { subsec = 2; //重新設定計數次數, 時間比實際快10倍, 如要跟實際的一樣, 請將此數值調整成20 second++; //buffer內的值加1 if (second == 60) //判斷是否已經60秒 { second = 0; minute ++; if (minute == 60) //判斷是否已經60秒 { minute = 0; hour++; WriteCommandLCD(0x80); //調整游標位置 display(hour); //顯示 小時 } WriteCommandLCD(0x80+3); //調整游標位置 display(minute); //顯示 分 } WriteCommandLCD(0x80+6); //調整游標位置 display(second); //顯示 秒 } } void display(char num) //將2位數數值顯示於LCD { WriteDataLCD(num/10 + 0x30); WriteDataLCD(num%10 + 0x30); } void delay_us(unsigned int t) { while(t--); } //寫資料到LCD副程式 void WriteDataLCD(char WDLCD) { LCD_Data = WDLCD; LCD_RS = 1; LCD_RW = 0; LCD_E = 1; //產生負緣 delay_us(100); //延遲等訊號穩定 LCD_E = 0; delay_us(100); //延遲等訊號處裡完畢 } //寫指令到LCD副程式 void WriteCommandLCD(char WCLCD) //BuysC為0時忽略忙檢測 { LCD_Data = WCLCD; LCD_RS = 0; LCD_RW = 0; LCD_E = 1; delay_us(100); //延遲等訊號穩定 LCD_E = 0; delay_us(100); //延遲等訊號處裡完畢 } void LCDInit(void) //LCM初始化 { WriteCommandLCD(0x38); // 設定LCD介面8位元,2行,5*7字型 WriteCommandLCD(0x06); // 設定寫資料至LCD時,顯示不要動,游標向右移動 WriteCommandLCD(0x0c); // 設定螢幕顯示及 沒有游標和不閃爍 WriteCommandLCD(0x01); // 清除顯示器 delay_us(5000); } //顯示一串字串 void DisplayListChar(char code *DData) { char x; x=0; while (DData[x]!=0) //若到達字串尾則退出 { WriteDataLCD(DData[x]); //顯示單個字 x++; //指到下一個字 } }