本帖最后由 yhb306724368 于 2017-6-2 13:02 編輯
#include <reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit rs=P3^5;
sbit rw = P3^6;
sbit en=P3^4;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
sbit ding=P2^3; //蜂鳴器
u8 code disp1[]=" Design clock";
u8 code disp2[]=" 23:59:40 ";
u8 num,ad; //全局變量
char miao,fen,shi;
void delay(u16 z) //延時函數
{
u16 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(u8 com) //寫指令
{
rs=0;
rw=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_date(u8 date) //讀指令
{
rs=1;
rw=0;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void init_lcd() //lcd液晶初始化
{ shi=23;
fen=59;
miao=40;
ding=1;
k1=1;
k2=1;
k3=1;
rs=0;
rw=0;
en=0;
write_com(0x06);
write_com(0x0c);
write_com(0x38);
write_com(0x01);
write_com(0x80);
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
}
void lcd_dis(u8 add,u8 shu) //顯示函數
{
u8 shi,ge;
shi=shu/10;
ge=shu%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void hed() //蜂鳴器響一次
{
ding=0;
delay(10);
ding=1;
}
void key() //調時函數
{
if(k1==0)
{
delay(5);//消抖
if(k1==0)
{
hed();
ad++;
while(!k1)
if(ad==1)
{
TR0=0; //關閉定時器0
write_com(0x80+0x40+10);//秒位
write_com(0x0f); //開光標
}
}
if(ad==2)
{
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(ad==3)
{
write_com(0x80+0x40+4);
write_com(0x0f);
}
if(ad==4)
{
write_com(0x0c);
TR0=1; //開啟定時器0
ad=0;
}
}
}
void jia() //加函數
{
if(ad!=0)
{
if(k2==0)
{
delay(5);
if(k2==0)
{
while(!k2);hed();
if(ad==1)
{
miao++;
if(miao==60)
{
miao=0;
}
lcd_dis(10,miao);
write_com(0x80+0x40+10);
}
if(ad==2)
{
fen++;
if(fen==60)
{
fen=0;
}
lcd_dis(7,fen);
write_com(0x80+0x40+7);
}
if(ad==3)
{
shi++;
if(shi==24)
{
shi=0;
}
lcd_dis(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void jian()//減函數
{
if(ad!=0)
{
if(k3==0)
{
delay(5);
if(k3==0)
{
while(!k3);hed();
if(ad==1)
{
miao--;
if(miao==0)
{
miao=59;
}
lcd_dis(10,miao);
write_com(0x80+0x40+10);
}
if(ad==2)
{
fen--;
if(fen==0)
{
fen=59;
}
lcd_dis(7,fen);
write_com(0x80+0x40+7);
}
if(ad==3)
{
shi--;
if(shi==0)
{
shi=24;
}
lcd_dis(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()//主函數
{
init_lcd();
for(num=0;num<14;num++)//lcd液晶顯示初值
{
write_date(disp1[num]);
delay(10);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_date(disp2[num]);
}
delay(10);
TR0=1;
while(1)
{
key();
jia();
jian();
}
}
void timer0() interrupt 0//定時器中斷0函數
{
u8 a;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
a++;
if(a==20)
{
a=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
lcd_dis(4,shi);
}
lcd_dis(7,fen);
}
lcd_dis(10,miao);
}
}
|