51单片机lcd1602显示时间按键可调时间,带有闹钟功能C代码
时间: 2023-12-06 12:45:34 浏览: 118
以下是一个简单的51单片机LCD1602显示时间并带有闹钟功能的C代码:
```c
#include <reg51.h>
sbit RS = P2^0; // LCD1602 控制线
sbit RW = P2^1; // LCD1602 控制线
sbit EN = P2^2; // LCD1602 控制线
unsigned char hour=0, min=0, sec=0; // 时间变量
unsigned char alarm_hour=0, alarm_min=0; // 闹钟变量
unsigned char flag_alarm=0; // 闹钟标志
void delay_ms(unsigned int ms) // 延时函数
{
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<100; j++);
}
void lcd_init() // LCD1602 初始化函数
{
RW = 0;
EN = 0;
delay_ms(15);
P0 = 0x38;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
P0 = 0x38;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
P0 = 0x38;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
P0 = 0x0c;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
P0 = 0x06;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
P0 = 0x01;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
}
void lcd_write_cmd(unsigned char cmd) // 写命令函数
{
RS = 0;
P0 = cmd;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
}
void lcd_write_data(unsigned char dat) // 写数据函数
{
RS = 1;
P0 = dat;
EN = 1;
delay_ms(5);
EN = 0;
delay_ms(5);
}
void lcd_set_pos(unsigned char x, unsigned char y) // 设置光标位置函数
{
unsigned char pos;
if(x == 0)
pos = y;
else
pos = y + 0x40;
lcd_write_cmd(pos | 0x80);
}
void lcd_clear() // 清屏函数
{
lcd_write_cmd(0x01);
delay_ms(5);
}
void display_time() // 显示时间函数
{
lcd_set_pos(0, 0);
lcd_write_data(hour/10+'0');
lcd_write_data(hour%10+'0');
lcd_write_data(':');
lcd_write_data(min/10+'0');
lcd_write_data(min%10+'0');
lcd_write_data(':');
lcd_write_data(sec/10+'0');
lcd_write_data(sec%10+'0');
}
void display_alarm() // 显示闹钟时间函数
{
lcd_set_pos(1, 0);
lcd_write_data(alarm_hour/10+'0');
lcd_write_data(alarm_hour%10+'0');
lcd_write_data(':');
lcd_write_data(alarm_min/10+'0');
lcd_write_data(alarm_min%10+'0');
}
void update_time() // 更新时间函数
{
sec++;
if(sec >= 60)
{
sec = 0;
min++;
if(min >= 60)
{
min = 0;
hour++;
if(hour >= 24)
hour = 0;
}
}
}
void check_alarm() // 检查闹钟函数
{
if(hour == alarm_hour && min == alarm_min && flag_alarm == 0)
{
flag_alarm = 1;
lcd_set_pos(1, 13);
lcd_write_data('A');
lcd_write_data('L');
lcd_write_data('A');
lcd_write_data('R');
lcd_write_data('M');
}
}
void main()
{
lcd_init();
lcd_clear();
lcd_set_pos(0, 3);
lcd_write_data('T');
lcd_write_data('I');
lcd_write_data('M');
lcd_write_data('E');
lcd_set_pos(1, 3);
lcd_write_data('A');
lcd_write_data('L');
lcd_write_data('A');
lcd_write_data('R');
lcd_write_data('M');
while(1)
{
display_time();
display_alarm();
update_time();
check_alarm();
if(P3 == 0x01) // 按键处理
{
delay_ms(10);
if(P3 == 0x01)
{
hour++;
if(hour >= 24)
hour = 0;
lcd_clear();
}
}
if(P3 == 0x02)
{
delay_ms(10);
if(P3 == 0x02)
{
min++;
if(min >= 60)
min = 0;
lcd_clear();
}
}
if(P3 == 0x04)
{
delay_ms(10);
if(P3 == 0x04)
{
alarm_hour++;
if(alarm_hour >= 24)
alarm_hour = 0;
lcd_clear();
}
}
if(P3 == 0x08)
{
delay_ms(10);
if(P3 == 0x08)
{
alarm_min++;
if(alarm_min >= 60)
alarm_min = 0;
lcd_clear();
}
}
}
}
```
在这个代码中,我们使用了一个计时器来更新时间,并使用一个标志变量来检查闹钟是否已经响铃。按键可以调整时间和闹钟时间。当闹钟响铃时,在LCD1602屏幕上显示“ALARM”字样。
阅读全文