1、可以顯示星期和時間的電子1602液晶電子時鐘
2、但沒有調整時間的子程序,誰會調整時間的子程序,可以完善。
3. 液晶的端口大家可按你自己的電路隨便修改就在程序的上部
4. 此程序在51hei單片機開發板上測試成功全部的代碼及頭文件
下載地址:http://www.raoushi.com/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;
}
}
}
}
}
