#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define KEY_IO P3
#define LCD_IO P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
sbit SPK = P1^2;
sbit LED = P2^4;
bit new_s, modify = 0;
char t0, sec = 50, min = 59, hour = 23;
char code LCD_line1[] = "Clock!";
char code LCD_line2[] = " 00:00:00 ";
char Timer_buf[] = "23:59:50"; //---------------------------------------------------
void delay(uint z)
{
uint x, y;
for(x = z; x > 0; x--)
for(y = 100; y > 0; y--);
}
//---------------------------------------------------
void W_LCD_Com(uchar com) //写指令
{
LCD_RS = 0;
LCD_IO = com; // LCD_RS和R/W都为低电平时,写入指令
LCD_EN = 1;
delay(5);
LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_Dat(uchar dat) //写数据
{
LCD_RS = 1;
LCD_IO = dat; // LCD_RS为高、R/W为低时,写入数据
LCD_EN = 1;
delay(5);
LCD_EN = 0; //用EN输入一个高脉冲
}
//---------------------------------------------------
void W_LCD_STR(uchar *s) //写字符串
{
while(*s)
W_LCD_Dat(*s++);
}
//---------------------------------------------------
void W_BUFF(void) //填写显示缓冲区
{
Timer_buf[7] = sec % 10 + 48;
Timer_buf[6] = sec / 10 + 48;
Timer_buf[4] = min % 10 + 48;
Timer_buf[3] = min / 10 + 48;
Timer_buf[1] = hour % 10 + 48;
Timer_buf[0] = hour / 10 + 48;
W_LCD_Com(0xc0 + 7);
W_LCD_STR(Timer_buf);
}
//---------------------------------------------------
uchar read_key(void)
{
uchar x1, x2;
KEY_IO = 255;
x1 = KEY_IO;
if (x1 != 255)
{
delay(100);
x2 = KEY_IO;
if (x1 != x2)
return 255;
while(x2 != 255)
x2 = KEY_IO;
if(x1 == 0x7f)
return 0;
else if
(x1 == 0xbf)
return 1;
else if (x1 == 0xdf)
return 2;
else if (x1 == 0xef)
return 3;
else if (x1 == 0xf7)
return 4;
}
return 255;
}
//---------------------------------------------------
void Init()
{
LCD_RW = 0;
W_LCD_Com(0x38);
delay(50);
W_LCD_Com(0x0c);
W_LCD_Com(0x06);
W_LCD_Com(0x01);
W_LCD_Com(0x80);
W_LCD_STR(LCD_line1);
W_LCD_Com(0xC0);
W_LCD_STR(LCD_line2);
TMOD = 0x01; //T0定时方式1
TH0 = 0x4c;
TR0 = 1; //启动T0
PT0 = 1; //高优先级, 以保证定时精度
ET0 = 1;
EA = 1;
} //---------------------------------------------------
void main()
{
uint i, j;
uchar Key;
Init();
while(1)
{
//-------------------------------
if (new_s)
{
//如果出现了新的一秒, 修改时间
new_s = 0;
sec++;
sec %= 60;
if(!sec)
{
min++;
min %= 60;
if(!min)
{
hour++;
hour %= 24;
}
}
W_BUFF(); //写显示
//-------------------------------
if (!sec && !min)
{
//整点报时
for (i = 0; i < 200; i++)
{
SPK = 0;
for (j = 0; j < 100; j++);
SPK = 1;
for (j = 0; j < 100; j++);
}
}
} //-------------------------------
Key = read_key(); //读出按键
switch(Key)
{
//分别处理四个按键
case 0: modify = 1; break;
case 1: if(modify)
{
min++;
min %= 60;
W_BUFF();
break;
}
case 2: if(modify)
{
hour++;
hour %= 24;
W_BUFF();
break;
}
case 3: modify = 0; break; }
}
}
//---------------------------------------------------
void timer0(void) interrupt 1 //T0中断函数, 50ms执行一次
{
TH0 = 0x4c;
t0++;
t0 %= 20;
//20, 一秒钟
if(t0 == 0)
{
new_s = 1;
LED = ~LED;
}
if(modify)
LED = 0;
}
LCD显示时钟
最新推荐文章于 2025-05-23 13:36:39 发布
本文介绍了一个基于51单片机的时钟程序设计,该程序能够实时更新并显示时间,并具备整点报时功能。通过四个按键可以调整小时和分钟。程序还实现了简单的中断处理和服务功能。

1763

被折叠的 条评论
为什么被折叠?



