完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 lmb312 于 2013-7-15 20:51 编辑
做一个lcd数字时钟,51程序已经写好没有错误,大家看看能不能实现功能,仿真出不来怎么回事。 程序要求: 以51单片机为核心的时钟,在LCD显示器上显示当前的时间: 使用字符型LCD显示器显示当前时间。 显示格式为“时时:分分:秒秒”。 用4个功能键操作来设置当前时间。功能键K1~K4功能如下。 K1—进入设置现在的时间。 K2—设置小时。 K3—设置分钟。•K4—确认完成设置。程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00:00”,然后开始计时 写好的程序: #include #include #define uchar unsigned char #define uint unsigned int ***it K1 =P1^0; ***it K2 =P1^1; ***it K3 =P1^2; ***it K4 =P1^3; ***it RS=P2^0; ***it RW=P2^1; ***it E=P2^2; uchar code Str1[] =" Current time"; uchar code Str2[] =" Set New Time"; uchar HMS_String[]=" 00:00:00 ";//带显示的时间串 int Settime=0; int Change_H_or_M =1;//1修改时 uchar MilliSecond,Hour=23,Minute=59,Second=50; void delay(uint x)//延时函数 { uchar i; while(x--) for(i=0;i<120;i++); } void write_com(uchar cmd)//LCD写指令程序 { RS=0; RW=0; P0=cmd; E=1; delay(5); E=0; } void write_data(uchar dat) //LCD写数据 { RS=1; RW=0; P0=dat; E=1; delay(5); E=0; } void init() { E=0; write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口 write_com(0x0c); //设置开显示,不显示光标 write_com(0x06); //写一个字符后地址指针加1 write_com(0x01); //显示清零,数据指针清零 } void weizhi(uchar pos)//lcd显示位置 { write_com(pos|0x80);//按位或10000000(80) } void Display_String(uchar str[],uchar LineNo) { uchar k; weizhi(LineNo); for(k=0;k<16;k++) write_data(str[k]); } void Display_HMS(uchar h,m,s) //显示时分秒 { if(Settime)HMS_String[3]= '>'; else HMS_String[3]=' '; HMS_String[4]=h/10+'0'; HMS_String[5]=h%10+'0'; HMS_String[7]=m/10+'0'; HMS_String[8]=m%10+'0'; HMS_String[10]=s/10+'0'; HMS_String[11]=s%10+'0'; Display_String(HMS_String,0x40);//这里不是很懂 } void Change_Time() { Settime=0; if(K1==0) //按下k1键即进入修改状态 { TR0 = 0; Display_String(Str2,0x00); //第一行提示修改时间 Settime = 1; } while (Settime) { if(K1 == 0) //确定调整小时还是分钟 { while(K1 == 0) Change_H_or_M = !Change_H_or_M; } else if(K2 == 0) //增加 { while(K2 == 0); if(Change_H_or_M==1) { if(Hour++ == 24) Hour = 0; } else { if(Minute++ == 60) Minute = 0; } } else if(K3 == 0) //减少 { while(K3 == 0); if(Change_H_or_M == 1) { if(Hour-- == 0xff) Hour = 23; } else { if(Minute --== 0xff) Minute = 59;} } else if(K4 == 0) //确定 { while(K4 == 0); Display_String(Str1,0x00); //第一行还原显示str1 Settime = 0; TR0 = 1; } Display_HMS(Hour,Minute,Second); } } void Time0() interrupt 1 { TH0 = (65536 -50000)/256; TL0 = (65536 -50000)%256; //重新装入50MS定时 MilliSecond++; if(MilliSecond == 20) //50*20=1s { MilliSecond = 0; if(Second ++== 60) { Second = 0; if(Minute++ == 60) { Minute = 0; if(Hour++ == 24) { Hour = 0; Minute = 0; Second = 0; } } } } } void main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; IE=0x82; init(); Display_String(Str1,0x00);//第一行显示 TR0=1;//启动TO计时器 P1=0xFF; while(1) { Display_HMS(Hour,Minute,Second); //第二行显示时分秒 Change_Time(); } } 仿真图见附件
|
|
相关推荐
|
|
4301 浏览 3 评论
5584 浏览 1 评论
5862 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
7587 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1212 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 12:32 , Processed in 0.588436 second(s), Total 78, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号