![]() |
已经解决了,是我仿真图接多了根线,谢谢大佬们了 |
zpwgf 发表于 2024-12-16 09:19 不太行,和我的结果差不多 |
您好,大佬,用了您的代码现在是可以实现了清屏的操作,但不知道为什么,按按键发送还是接收不到,请问这种是什么情况 |
![]()
|
#include <REGX51.H> #define uchar unsigned char #define uint unsigned int // 定义LCD控制引脚 sbit RS = P1^0; sbit RW = P1^1; sbit E = P1^2; // 定义按键引脚 sbit KEY = P1^6; // 定义数据数组 uchar received_data; // 延时函数 void delayms(uint ms) { uchar i; while (ms--) for (i = 0; i < 123; i++); } // 向LCD写指令函数 void w_com(uchar com) { RS = 0; RW = 0; E = 1; P0 = com; delayms(1); E = 0; } // 向LCD写数据函数 void w_dat(uchar dat) { RS = 1; RW = 0; E = 1; P0 = dat; delayms(1); E = 0; } // LCD初始化函数 void lcd_ini(void) { delayms(10); w_com(0x38); // 8位数据接口, 2行显示, 5x7点阵 delayms(10); w_com(0x0c); // 显示开, 光标关 delayms(10); w_com(0x06); // 文字不动, 地址自动+1 delayms(10); w_com(0x01); // 清屏 delayms(10); } // LCD清屏函数 void lcd_clear(void) { w_com(0x01); // 清屏指令 delayms(10); // 等待清屏完成 } // 通过串口发送一个字节数据 void send_data(uchar data_to_send) { SBUF = data_to_send; while (TI == 0); TI = 0; } // 串口初始化函数 void uart_init() { SCON = 0x50; // 8位数据, 可变波特率 TMOD &= 0x0F; // 清除定时器1模式位 TMOD |= 0x20; // 设定定时器1为8位自动重装方式 TL1 = 0xFD; // 设定定时初值 (9600波特率 @ 11.0592MHz) TH1 = 0xFD; // 设定定时器重装值 TR1 = 1; // 启动定时器1 EA = 1; // 开启总中断 ES = 1; // 开启串口中断 } // 主函数 void main() { uchar data_to_send[8] = "12345678"; uchar i; lcd_ini(); uart_init(); while (1) { if (KEY == 0) { delayms(20); if (KEY == 0) { lcd_clear(); // 清屏 for (i = 0; i < 8; i++) { send_data(data_to_send[i]); } while (KEY == 0); } } } } // 串口中断服务函数 void uart_interrupt() interrupt 4 { if (RI) { RI = 0; received_data = SBUF; // 更新LCD显示,这里可能需要设置LCD的地址,确保数据写入正确位置 // 假设每次接收的数据都覆盖显示,这里简单地从第一列开始显示 w_com(0x80); // 设置LCD DDRAM起始地址为第一行第一列 for (uchar j = 0; j < 1; j++) // 这里假设每次只接收一个字符,如果需要接收多个,需要调整逻辑 { w_dat(received_data); } } } |