1、可以顯示星期和時間的電子1602液晶電子時鐘
2、但沒有調整時間的子程序,誰會調整時間的子程序,可以完善。
3. 液晶的端口大家可按你自己的電路隨便修改就在程序的上部
4. 此程序在51hei單片機開發板上測試成功全部的代碼及頭文件
下載地址:http://www.zg4o1577.cn/ziliao/51hei-5/電子時鐘+1602液晶.rar
#include <reg52.h> #include "51hei.h" #define uchar unsigned char sbit RW=P2^7; sbit RS=P3^5; sbit E=P3^4; sbit duan=P2^6; bit at=0; //sbit busy_bit=P1^7; uchar code shen[]={"I love you!!"}; uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x20,0x2d,0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07}; uchar code ri[]={0x1f,0x19,0x19,0x1f,0x19,0x19,0x1f,0x00}; //自定義符號 :周日 uchar code yi[]={0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00};/*自定義符號:周一 */ uchar code er[]={0x00,0x00,0x0e,0x00,0x1f,0x00,0x00,0x00};/*自定義符號: 周二2*/ uchar code san[]={0x00,0x1f,0x00,0x0e,0x00,0x1f,0x00,0x00};/*自定義符號: 周三2*/ uchar code si[]={0x00,0x1f,0x1a,0x1a,0x11,0x11,0x00,0x00}; //自定義符號 :周四 uchar code wu[]={0x00,0x1f,0x08,0x1f,0x09,0x1f,0x00,0x00}; //自定義符號 :周五 uchar code liu[]={0x08,0x04,0x1f,0x0a,0x11,0x10,0x00,0x00}; //自定義符號 :周五 uchar dispbuf[10],ri1,h,m,s,counter; void delay() { uchar i; for(i=0;i<255;i++); } /*******寫命令**********/ void lcd_wmc(uchar i) { P0=i; RS=0; RW=0; E=0; delay(); E=1; } /*******寫數據***********/ void lcd_wmd(uchar i) { P0=i; RS=1; RW=0; E=0; delay(); E=1; } /*******初始化液晶*******/ void lcd_init() { uchar i; lcd_wmc(0x01); lcd_wmc(0x38); //功能設置指令-5 顯示模式設置:16×2顯示,5×7點陣,8位數據接口 lcd_wmc(0x0c); // 顯示開關控制指令 0x0c--顯示功能開無光標,即光標不閃爍。00x0f--顯示功能開,有光標并閃爍 lcd_wmc(0x06); //顯示模式設置:光標右移,字符不移 輸入模式設置指令 -3 lcd_wmc(0x82); // 0xc9 =0x80 | 0x49 設置DDRAM地址指令--8 PPt第8 ox82=0x80|0x02 for(i=0;i<12;i++) lcd_wmd(shen[i]); //顯示 I love you !! 字符串 lcd_wmc(0xc0); } /*******更新緩沖區子程序*******/ void newbuf() { dispbuf[0]=s%10; dispbuf[1]=s/10; dispbuf[3]=m%10; dispbuf[4]=m/10; dispbuf[6]=h%10; dispbuf[7]=h/10; dispbuf[9]=ri+13; } /*******顯示子程序**********/ void disp(uchar dispadd) { uchar tmp; //定義 一個uchar 變量 lcd_wmc(dispadd); // 調用 寫指令 函數 把DDRAM 地址 指令寫進 tmp=dispbuf[9]; //星期 //以下同理 tmp=word[tmp]; lcd_wmd(tmp); tmp=dispbuf[8]; tmp=word[tmp]; lcd_wmd(tmp); tmp=dispbuf[7]; //第2行 把值賦給 tmp tmp=word[tmp]; //把要顯示的 數 給tmp lcd_wmd(tmp); //寫數據 函數 把要顯示的數字 顯示在顯示屏上 tmp=dispbuf[6]; //以下同理 tmp=word[tmp]; lcd_wmd(tmp); tmp=dispbuf[5]; tmp=word[tmp]; lcd_wmd(tmp); tmp=dispbuf[4]; tmp=word[tmp]; lcd_wmd(tmp); //分鐘 tmp=dispbuf[3]; tmp=word[tmp]; lcd_wmd(tmp); tmp=dispbuf[2]; //顯示 是兩個點 在閃爍 tmp=word[tmp]; lcd_wmd(tmp); tmp=dispbuf[1]; tmp=word[tmp]; //秒 lcd_wmd(tmp); tmp=dispbuf[0]; tmp=word[tmp]; lcd_wmd(tmp); } /*********************初始化子程序**********************/ void init() { TMOD=0x01; TH0=0x4c; TL0=0x00; EA=1; ET0=1; TR0=1; counter=0; h=23;m=59;s=0; ri1=6; dispbuf[2]=10; dispbuf[5]=10; dispbuf[8]=12; } /***************************主程序************************/ void main(void) { guanled(); guandz(); init(); lcd_init(); while(1) { if(!at) { //閃爍 if(counter<10) { dispbuf[2]=10; dispbuf[5]=10; } else { dispbuf[2]=11; dispbuf[5]=11; } //更新顯示緩沖區及調用顯示程序 if(counter==0) { newbuf(); disp(0xc4); } else if(counter==10) disp(0xc4); } } } /*************************定時器0的中斷**********************/ void Time0() interrupt 1 using 2 //再次強調中斷子程序執行時間越短越好 { TH0=(65536-46075)/256; TL0=(65536-46075)%256; counter++; if(counter==20) { s++; counter=0; if(s==60) { m++; s=0; if(m==60) { h++; m=0; if(h==24) h=0; ri1++; if(ri1==7) { ri1=0; } } } } }