单片机/MCU论坛
登录
直播中
木1234
7年用户
15经验值
私信
关注
[问答]
1602LCD设计的可调式电子钟无法显示时间
开启该帖子的消息推送
电子钟
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define DelayNOP(){_nop_();_nop_();_nop_();_nop_();}
***it K1 =P1^0;
***it K2 =P1^1;
***it K3 =P1^2;
***it K4 =P1^3;
***it SPK =P3^0;
***it LCD_RS =P2^0;
***it LCD_RW =P2^1;
***it LCD_EN =P2^2;
bit LCD_Busy_Check();
void LCD_Ini
ti
alize();
void LCD_Set_POS(uchar);
void LCD_Write_Command(uchar);
void LCD_Write_Data(uchar);
void Display_String(uchar *,uchar);
uchar code Str1[]=" Current Time ";
uchar code Str2[]="Set New Time...";
uchar HMS_String[]=" 12:30:00 ";
bit Settime=0;
bit Change_H_or_M=1;
uchar MilliSecond, Hour=12, Minute=30, Second=0;
void DelayX(uint x)
{
uchar i;
while(x--) for(i=0;i<120;i++);
}
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||K2==0||K3==0)
{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);
Settime=0;
TR0=1;
}
Display_HMS(Hour,Minute,Second);
}
}
void Time0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(++MilliSecond==20)
{
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;
SPK=0;
LCD_Initialize();
Display_String(Str1,0x00);
TR0=1;
P1=0xFF;
while(1);
{
Display_HMS(Hour,Minute,Second);
DelayX(500);
Change_Time();
}
}
// 1602LCD显示驱动函数
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define DelayNOP( ){_nop_( ); _nop_( ); _nop_( ); _nop_( );}
***it LCD_RS = P2^0;
***it LCD_RW = P2^1;
***it LCD_EN = P2^2;
bit LCD_Busy_Check( );
void LCD_Initialize( );
void LCD_Set_POS(uchar);
void LCD_Write_Command(uchar);
void LCD_Write_Date(uchar);
// 延时
void DelayMS(uint ms)
{
uchar t;
while(ms--) for (t =0;t < 120;t++);
}
// LCD忙检查
bit LCD_Busy_Check( )
{
bit Result;
LCD_RS = 0; LCD_RW = 1; LCD_EN = 1;DelayNOP( );
Result = (bit)(P0 & 0x80);
LCD_EN = 0;
return Result;
}
// 向LCD写指令
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check() );
LCD_RS = 0; LCD_RW = 0; LCD_EN = 0;
_nop_( ); _nop_( );
P0 = cmd; DelayNOP( );
LCD_EN = 1;DelayNOP( );
LCD_EN = 0;
}
// 向LCD写数据
void LCD_Write_Date(uchar str)
{
while(LCD_Busy_Check() );
LCD_RS = 1; LCD_RW = 0; LCD_EN = 0;P0 = str; DelayNOP( );
LCD_EN = 1; DelayNOP( );LCD_EN = 0;
}
// 初始化LCD
void LCD_Initialize( )
{
DelayMS(5); LCD_Write_Command(0x38);
DelayMS(5); LCD_Write_Command(0x0c);
DelayMS(5); LCD_Write_Command(0x06);
DelayMS(5); LCD_Write_Command(0x01);
DelayMS(5);
}
// 设置显示位置
void LCD_Set_POS(uchar Position)
{
LCD_Write_Command(Position | 0x80);
}
//显示函数,在LCD指定行上显示字符串
void Display_String(uchar *str,uchar LineNO)
{
uchar k;
LCD_Set_POS(LineNO);
for (k = 0;k < 16;k++) LCD_Write_Date(str[k]);
}
回帖
(1)
人中狼
2017-5-12 21:38:55
试试自己设定一个时间来显示,看看是显示函数的问题,还是数据格式转换的问题
试试自己设定一个时间来显示,看看是显示函数的问题,还是数据格式转换的问题
举报
更多回帖
rotate(-90deg);
回复
相关问答
电子钟
基于
LCD1602
电子钟
2017-05-01
5569
关于
1602LCD
的一个小问题
2014-10-10
4113
如何将外界温度
显示
在
1602LCD
上?
2022-01-24
632
请问ATMEGA16如何驱动
1602LCD
?
2021-09-24
873
求具有走数功能
1602LCD
的c语言实现动态数据
显示
2019-01-10
1774
如何实现cubesuit+中按键值在
1602LCD
中
显示
2015-07-21
1982
求一份用汇编写的DS12C887+
lcd1602
的
电子钟
,最好有proteus仿真。
2016-09-20
3005
1602LCD
2014-04-28
2877
用DS1302的一个
LCD
液晶
电子钟
显示
85,求大神修改啊!
2013-10-08
5648
求
电子钟
仿真电路和程序
2013-05-07
1981
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分