#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DelayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit K1 =P1^0; //选择调整小时,分钟
sbit K2 =P1^1; //增加
sbit K3 =P1^2; //减小
sbit K4 =P1^3;
sbit SPK=P3^0;
sbit RS =P2^0;
sbit RW =P2^1;
sbit E =P2^2;
uchar code Str1[] =" now Time "; //一下两个字符串的串长均为16
uchar code Str2[] =" Set New Time";
uchar HMS_String[]=" 00:00:00 ";//带显示的时间串
bit Settime=0; //是否修改时间
bit Change_H_or_M =1;//1表示修改时.0表示修改分
uchar MilliSecond,Hour =23,Minute=59, Second =50; //延时函数
void DelayMS(uint x)
{
uchar i;
while(x--)
for(i=0;i<120;i++);
}
//LCD忙状态检测
bit LCD_Busy_Check()
{
bit result;
RS = 0;RW = 1;E = 1;DelayNOP();result = (bit)(P0 & 0x80);E = 0;
return result;
} //写LCD命令
void LCD_Write_Command(uchar cmd)
{
while(LCD_Busy_Check());//判断LCD是否忙碌
RS = 0;RW = 0;E = 0;_nop_();_nop_();P0 = cmd; DelayNOP(); E = 1;DelayNOP();E = 0; } //设置LCD显示位置
void LCD_Set_Pos(uchar pos)
{
LCD_Write_Command(pos | 0x80);
}
//写LCD数据
void LCD_Write_Data(uchar dat)
{
while(LCD_Busy_Check());//判断LCD是否忙碌
RS = 1;RW = 0;E = 0; P0 = dat; DelayNOP(); E = 1;DelayNOP();E = 0;
} //LCD初始化
void LCD_Initialize()
{
LCD_Write_Command(0x38);DelayMS(1);
LCD_Write_Command(0x0c);DelayMS(1);
LCD_Write_Command(0x06);DelayMS(1);
LCD_Write_Command(0x01);DelayMS(1);
}
// 显示函数,在LCD指定的行上显示字符串
void Display_String(uchar*str,uchar LineNo)
{
uchar k;
LCD_Set_Pos(LineNo);
for(k=0;k<16;k++) LCD_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[5] = h%10 + '0'; //时个位 HMS_String[5] = h%10 + '0';
HMS_String[7] = m/10 + '0'; //分 HMS_String[8] = m/10 + '0';
HMS_String[8] = m%10 + '0'; //分 HMS_String[8] = m%10 + '0';
HMS_String[10]= s/10 + '0'; //秒 HMS_String[11]= s/10 + '0';
HMS_String[11]= 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);
} //外层While在这里结束
}
//定时器0中断
void Time0() interrupt 1
{
TH0 = (65536 -50000)/256;
TL0 = (65536 -50000)%256; //重新装入50MS定时
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;
SPK = 0;
LCD_Initialize();
Display_String(Str1,0x00); //第一行显示
TR0 = 1;
P1 = 0xFF;
while(1)
{
Display_HMS(Hour,Minute,Second); //第二行显示时分秒
DelayMS(500);
Change_Time(); //显示过程中允许修改时间
}
}
491636051964082简易电子时钟.rar
需积分: 0 146 浏览量
2022-12-17
19:43:48
上传
评论
收藏 96KB RAR 举报
铁柱来也
- 粉丝: 2
- 资源: 1