使用 C语言驱动51单片机红外遥控修改DS12864液晶显示屏时间程序
时间: 2023-08-14 18:02:56 浏览: 75
以下是一个使用C语言驱动51单片机和红外遥控修改DS12864液晶显示屏时间的程序示例:
```c
#include <reg51.h>
#define LCD_DATA P2 // DS12864液晶显示屏数据线连接的引脚
sbit RS = P1^0; // DS12864液晶显示屏RS引脚连接的引脚
sbit RW = P1^1; // DS12864液晶显示屏RW引脚连接的引脚
sbit E = P1^2; // DS12864液晶显示屏E引脚连接的引脚
#define IR_DATA P3 // HS0038红外接收器数据线连接的引脚
unsigned char time_hour = 0; // 时间-小时
unsigned char time_minute = 0; // 时间-分钟
void delay_us(unsigned int us) {
while (us--) {
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms) {
while (ms--) {
delay_us(1000);
}
}
void lcd_write_cmd(unsigned char cmd) {
RS = 0; // 设置为命令模式
RW = 0; // 设置为写模式
LCD_DATA = cmd; // 发送命令
E = 1; // 使能信号置高
delay_us(10); // 延时10us
E = 0; // 使能信号置低
}
void lcd_write_data(unsigned char dat) {
RS = 1; // 设置为数据模式
RW = 0; // 设置为写模式
LCD_DATA = dat; // 发送数据
E = 1; // 使能信号置高
delay_us(10); // 延时10us
E = 0; // 使能信号置低
}
void lcd_init() {
lcd_write_cmd(0x30); // 8位数据总线,基本指令集
delay_ms(5); // 延时5ms
lcd_write_cmd(0x0C); // 显示开,光标不显示
delay_ms(5); // 延时5ms
lcd_write_cmd(0x01); // 清除显示,并设置地址指针归零
delay_ms(5); // 延时5ms
lcd_write_cmd(0x06); // 设置输入方式为右移,地址自动增加
delay_ms(5); // 延时5ms
}
void lcd_display_time() {
lcd_write_cmd(0x80); // 设置显示位置为第一行第一列
lcd_write_data('T');
lcd_write_data('i');
lcd_write_data('m');
lcd_write_data('e');
lcd_write_data(':');
lcd_write_data((time_hour / 10) + '0');
lcd_write_data((time_hour % 10) + '0');
lcd_write_data(':');
lcd_write_data((time_minute / 10) + '0');
lcd_write_data((time_minute % 10) + '0');
}
void ir_init() {
TMOD &= 0xF0; // 清除定时器0的模式设置
TMOD |= 0x01; // 将定时器0设置为16位定时器模式
TH0 = 0xFC; // 设定重装值,定时1ms
TL0 = 0x18;
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
}
void ir_receive() interrupt 1 {
unsigned char ir_data;
if (IR_DATA) { // 检测引脚状态,判断是否为起始位
delay_us(560); // 延时560us,等待起始位结束
if (IR_DATA) { // 检测引脚状态,判断是否为起始位
ir_data = 0; // 初始化红外数据
while (!IR_DATA); // 等待高电平结束
for (unsigned char i = 0; i < 8; i++) {
delay_us(560); // 延时560us,等待一个bit的时间
ir_data >>= 1; // 右移一位
if (IR_DATA) {
ir_data |= 0x80; // 最高位置1
}
while (!IR_DATA); // 等待高电平结束
}
switch (ir_data) {
case 0x45: // 按键1,增加小时
time_hour++;
if (time_hour > 23) {
time_hour = 0;
}
lcd_display_time();
break;
case 0x46: // 按键2,减少小时
if (time_hour > 0) {
time_hour--;
} else {
time_hour = 23;
}
lcd_display_time();
break;
case 0x47: // 按键3,增加分钟
time_minute++;
if (time_minute > 59) {
time_minute = 0;
}
lcd_display_time();
break;
case 0x44: // 按键4,减少分钟
if (time_minute > 0) {
time_minute--;
} else {
time_minute = 59;
}
lcd_display_time();
break;
default:
break;
}
}
}
TF0 = 0; // 清除定时器0溢出标志位
}
void main() {
lcd_init();
ir_init();
lcd_display_time();
while (1);
}
```
这段代码使用C语言驱动51单片机和红外遥控模块,通过DS12864液晶显示屏显示时间,并通过红外遥控修改时间。在程序中,使用`lcd_write_cmd()`和`lcd_write_data()`函数来向DS12864液晶显示屏发送命令和数据。`lcd_init()`函数用于初始化显示屏。`lcd_display_time()`函数用于显示当前时间。`ir_receive()`函数是红外接收中断服务函数,用于接收红外遥控信号并根据信号执行相应的操作。
在主函数`main()`中,首先进行了液晶显示屏的初始化和时间的显示。然后进入一个无限循环,等待红外遥控信号的接收和处理。
请注意,以上代码仅提供了基本的功能,你可能需要根据具体的硬件连接和红外遥控器的协议,进行适当的调整和修改。