51单片机lcd1602显示时间,带有闹钟功能
时间: 2023-08-18 20:03:49 浏览: 136
下面是一个简单的示例代码,可以在51单片机上驱动LCD1602显示时间,并具有闹钟功能。你可以根据需要进行修改和优化。
```
#include <reg52.h>
#include <intrins.h>
#define LCD_DATA P0
sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_EN = P2^2;
unsigned char hour = 0, minute = 0, second = 0;
unsigned char alarm_hour = 0, alarm_minute = 0;
bit alarm_flag = 0;
void delay(unsigned int i)
{
while(i--);
}
void write_command(unsigned char command)
{
LCD_RS = 0;
LCD_RW = 0;
LCD_DATA = command;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
delay(5);
}
void write_data(unsigned char data)
{
LCD_RS = 1;
LCD_RW = 0;
LCD_DATA = data;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
delay(5);
}
void init_lcd()
{
write_command(0x38); // 8位数据接口,2行显示,5x7点阵字符
write_command(0x0c); // 显示开,光标不显示
write_command(0x06); // 光标右移,字符不移动
write_command(0x01); // 显示清屏
}
void display_time()
{
write_command(0x80); // 第一行第1个字符
write_data(hour/10+'0');
write_data(hour%10+'0');
write_data(':');
write_data(minute/10+'0');
write_data(minute%10+'0');
write_data(':');
write_data(second/10+'0');
write_data(second%10+'0');
write_command(0xc0); // 第二行第1个字符
write_data('A');
write_data('l');
write_data('a');
write_data('r');
write_data('m');
write_data(':');
write_data(alarm_hour/10+'0');
write_data(alarm_hour%10+'0');
write_data(':');
write_data(alarm_minute/10+'0');
write_data(alarm_minute%10+'0');
}
void timer0_init()
{
TMOD &= 0xf0;
TMOD |= 0x01; // 16位定时器
TH0 = 0xfc; // 1ms
TL0 = 0x18;
ET0 = 1;
TR0 = 1;
}
void interrupt_timer0() interrupt 1
{
TH0 = 0xfc; // 1ms
TL0 = 0x18;
second++;
if (second >= 60)
{
second = 0;
minute++;
}
if (minute >= 60)
{
minute = 0;
hour++;
}
if (hour >= 24)
{
hour = 0;
}
if (hour == alarm_hour && minute == alarm_minute)
{
alarm_flag = 1;
}
display_time();
}
void main()
{
init_lcd();
timer0_init();
while (1)
{
if (alarm_flag)
{
// 响铃操作
alarm_flag = 0;
}
}
}
```
以上代码使用定时器0中断来实现时间的更新和显示,每1ms中断一次,计算秒、分、时并在LCD上显示。同时,将闹钟设定的时间与当前时间进行比较,如果相等,则设置闹钟标志位,等待响铃操作。
在实际应用中,你可能需要加入更多的功能,如按键设置时间、闹钟等,这需要根据具体情况进行修改和扩展。
阅读全文