本帖最后由 in发烧友ing 于 2013-3-3 10:39 编辑
//液晶数字时钟(重影问题还有待于解决)
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;//数码管
sbit rs=P3^5;
sbit rw=P2^7;
sbit e=P3^4;//液晶
sbit scom=P3^7;
sbit s18=P3^0;//功能键
sbit s19=P3^1;//增加键
sbit s20=P3^2;//减小键
uchar code table1[]=" GOOD! 2013.2.28";
uchar code table2[]=" 00:00:00";
uchar count,keynum;// 计数,注意 char比int省内存些,
单片机一般用char
char shi,fen,miao;//注意是有符号型
void delay(uint z)//延时函数
{
uint
x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void write_zl(uchar zl)//写指令函数
{
rs=0;
rw=0;//写
P0=zl;
delay(5);
//e一个高脉冲(初始为低)
e=1;//e拉高
delay(5);
e=0;//e拉低
}
void write_date(uchar date)//写数据函数
{
rs=1;
rw=0;
P0=date;
delay(5);
e=1;
delay(5);
e=0;
}
void write_change(uchar add,uchar numb)//调整时钟写显示
{
uchar
sw,gw;
//将数字拆分为十位和个位
sw=numb/10;
gw=numb%10;
write_zl(0x80+0x40+add);//指针地址
write_date(0x30+sw);//写十位
write_date(0x30+gw);//写个位
}
void write_key()//按键调整时钟
{
scom=0;
keynum=0;
if(s18==0)//功能键按下
{
delay(5);
if(s18==0)//消抖
{
keynum++;
while(!s18);//等待松手
if(keynum==1)//按键次数
{
TR0=0;//关定时器
write_zl(0x80+0x40+10);//指针指向秒(特别注意10是十进制的)
write_zl(0x0f);//光标闪烁
}
if(keynum==2)
{
write_zl(0x80+0x40+7);//指针指向分
}
if(keynum==3)
{
write_zl(0x80+0x40+4);//指针指向时
}
if(keynum==4)
{
keynum=0;
write_zl(0x0c);
TR0=1;//继续定时器
}
}
}
if(keynum!=0)
{
if(s19==0)//增加键按下
{
delay(5);
if(s19==0)
{
while(!s19);
if(keynum==1)
{
miao++;
if(miao==60)
miao=0;
write_change(10,miao);
write_zl(0x80+0x40+10);//指针回到秒的个位处
}
if(keynum==2)
{
fen++;
if(fen==60)
fen=0;
write_change(7,fen);
write_zl(0x80+0x40+7);//指针回到秒的个位处(防止上一步跑到十位处)
}
if(keynum==3)
{
shi++;
if(shi==24)
shi=0;
write_change(4,shi);
write_zl(0x80+0x40+4);//指针回到秒的个位处(防止上一步跑到十位处)
}
}
}
if(s20==0)//减小键按下
{
delay(5);
if(s20==0)
{
while(!s20);
if(keynum==1)
{
miao--;
if(miao==-1)
miao=59;
write_change(10,miao);
write_zl(0x80+0x40+10);
}
if(keynum==2)
{
fen--;
if(fen==-1)
fen=59;
write_change(7,fen);
write_zl(0x80+0x40+7);
}
if(keynum==3)
{
shi--;
if(shi==-1)
shi=23;
write_change(4,shi);
write_zl(0x80+0x40+4);
}
}
}
}
}
void init()//初始化函数
{
uchar
num;
wela=0;
dula=0;//关数码管
e=0;//初始为低
write_zl(0x38);//写显示模式指令
write_zl(0x0c);//开显示,不显示光标,不闪烁
write_zl(0x06);//读或写时指针自动加一
write_zl(0x01);//清屏
write_zl(0x80);//指针指向第一行
for(num=0;num<16;num++)
{
write_date(table1[num]);//显示第一行
delay(20);
}
write_zl(0x80+0x40);//指针指向第二行
for(num=0;num<12;num++)
{
write_date(table2[num]);//显示第二行
delay(20);
}
TMOD=0x01;//定时器0方式1
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//装初值50毫秒
EA=1;//开总中断
ET0=1;//开定时器中断
TR0=1;//启动定时器
}
void main()//主函数
{
init();
while(1)
{
write_key();
}
}
void
timer() interrupt 1//定时器中断
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//装初值50毫秒
count++;
if(count==20)//一秒(50*20)
{
count=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_change(4,shi);//显示动态的时
}
write_change(7,fen);//显示动态的分
}
write_change(10,miao);//显示动态的秒
}
}
-
一周热门 更多>