![]() |
發布時間: 2024-12-15 16:29
正文摘要:pc機通信實驗及雙機通信實驗,按按鍵不接收數據,發送第2次數據時,lcd不清屏之前的數據,要想實現清屏,怎么修改 #include <REGX51.H> #define uchar unsigned char #define uint unsigned int // 定 ... |
已經解決了,是我仿真圖接多了根線,謝謝大佬們了 |
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); } } } |