51单片机lcd实现时间显示,可调时间和闹钟c语言
时间: 2023-12-14 12:37:28 浏览: 28
以下是一个基于51单片机的LCD实现时间显示、可调时间和闹钟的C语言程序:
```c
#include <reg51.h>
#define LCD_Data_Port P2
#define LCD_Command_Port P3
sbit RS = P0^0;
sbit RW = P0^1;
sbit EN = P0^2;
unsigned char second = 0;
unsigned char minute = 0;
unsigned char hour = 0;
unsigned char alarm_hour = 0;
unsigned char alarm_minute = 0;
unsigned char alarm_flag = 0;
void delay(unsigned int time) {
unsigned int i, j;
for(i = 0; i < time; i++) {
for(j = 0; j < 1275; j++);
}
}
void lcd_write_command(unsigned char command) {
LCD_Data_Port = command;
RS = 0;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void lcd_write_data(unsigned char data) {
LCD_Data_Port = data;
RS = 1;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void lcd_init() {
lcd_write_command(0x38); // 8-bit data, 2-line display, 5x7 font
lcd_write_command(0x0C); // Display on, cursor off, blink off
lcd_write_command(0x01); // Clear display
lcd_write_command(0x06); // Entry mode: increment, no shift
lcd_write_command(0x80); // Set DDRAM address to 0
}
void display_time() {
lcd_write_command(0x80); // Set DDRAM address to 0
lcd_write_data(hour / 10 + '0');
lcd_write_data(hour % 10 + '0');
lcd_write_data(':');
lcd_write_data(minute / 10 + '0');
lcd_write_data(minute % 10 + '0');
lcd_write_data(':');
lcd_write_data(second / 10 + '0');
lcd_write_data(second % 10 + '0');
}
void display_alarm() {
lcd_write_command(0xC0); // Set DDRAM address to 40
lcd_write_data('A');
lcd_write_data('L');
lcd_write_data('A');
lcd_write_data('R');
lcd_write_data('M');
lcd_write_data(':');
lcd_write_data(alarm_hour / 10 + '0');
lcd_write_data(alarm_hour % 10 + '0');
lcd_write_data(':');
lcd_write_data(alarm_minute / 10 + '0');
lcd_write_data(alarm_minute % 10 + '0');
}
void interrupt timer0_isr() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x67;
second++;
if(second == 60) {
second = 0;
minute++;
if(minute == 60) {
minute = 0;
hour++;
if(hour == 24) {
hour = 0;
}
}
}
}
void main() {
TMOD = 0x01; // Timer0 mode 1: 16-bit timer
TH0 = 0xFC; // Initialize timer0 to generate interrupt every 500ms
TL0 = 0x67;
TR0 = 1; // Start timer0
ET0 = 1; // Enable timer0 interrupt
EA = 1; // Enable global interrupt
lcd_init();
while(1) {
display_time();
if(alarm_flag == 1 && hour == alarm_hour && minute == alarm_minute) {
lcd_init();
display_alarm();
while(1); // Wait for reset
}
if(P1_0 == 0) { // Increment hour
delay(20);
if(P1_0 == 0) {
hour++;
if(hour == 24) {
hour = 0;
}
while(P1_0 == 0);
}
}
if(P1_1 == 0) { // Increment minute
delay(20);
if(P1_1 == 0) {
minute++;
if(minute == 60) {
minute = 0;
}
while(P1_1 == 0);
}
}
if(P1_2 == 0) { // Set alarm
delay(20);
if(P1_2 == 0) {
alarm_hour = hour;
alarm_minute = minute;
alarm_flag = 1;
lcd_init();
display_alarm();
while(P1_2 == 0);
}
}
}
}
```
该程序使用定时器0以1秒为单位跟踪时间,并且可以通过按下按钮来增加小时和分钟,以设置时间和闹钟。如果闹钟时间到达,LCD将显示“ALARM: HH:MM”,并且程序将停止,直到被重置。