熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2024-12-15 16:29
正文摘要:pc機(jī)通信實(shí)驗(yàn)及雙機(jī)通信實(shí)驗(yàn),按按鍵不接收數(shù)據(jù),發(fā)送第2次數(shù)據(jù)時(shí),lcd不清屏之前的數(shù)據(jù),要想實(shí)現(xiàn)清屏,怎么修改 #include <REGX51.H> #define uchar unsigned char #define uint unsigned int // 定 ... |
已經(jīng)解決了,是我仿真圖接多了根線,謝謝大佬們了 |
zpwgf 發(fā)表于 2024-12-16 09:19 不太行,和我的結(jié)果差不多 |
您好,大佬,用了您的代碼現(xiàn)在是可以實(shí)現(xiàn)了清屏的操作,但不知道為什么,按按鍵發(fā)送還是接收不到,請問這種是什么情況 |
![]()
|
#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; // 定義數(shù)據(jù)數(shù)組 uchar received_data; // 延時(shí)函數(shù) void delayms(uint ms) { uchar i; while (ms--) for (i = 0; i < 123; i++); } // 向LCD寫指令函數(shù) void w_com(uchar com) { RS = 0; RW = 0; E = 1; P0 = com; delayms(1); E = 0; } // 向LCD寫數(shù)據(jù)函數(shù) void w_dat(uchar dat) { RS = 1; RW = 0; E = 1; P0 = dat; delayms(1); E = 0; } // LCD初始化函數(shù) void lcd_ini(void) { delayms(10); w_com(0x38); // 8位數(shù)據(jù)接口, 2行顯示, 5x7點(diǎn)陣 delayms(10); w_com(0x0c); // 顯示開, 光標(biāo)關(guān) delayms(10); w_com(0x06); // 文字不動(dòng), 地址自動(dòng)+1 delayms(10); w_com(0x01); // 清屏 delayms(10); } // LCD清屏函數(shù) void lcd_clear(void) { w_com(0x01); // 清屏指令 delayms(10); // 等待清屏完成 } // 通過串口發(fā)送一個(gè)字節(jié)數(shù)據(jù) void send_data(uchar data_to_send) { SBUF = data_to_send; while (TI == 0); TI = 0; } // 串口初始化函數(shù) void uart_init() { SCON = 0x50; // 8位數(shù)據(jù), 可變波特率 TMOD &= 0x0F; // 清除定時(shí)器1模式位 TMOD |= 0x20; // 設(shè)定定時(shí)器1為8位自動(dòng)重裝方式 TL1 = 0xFD; // 設(shè)定定時(shí)初值 (9600波特率 @ 11.0592MHz) TH1 = 0xFD; // 設(shè)定定時(shí)器重裝值 TR1 = 1; // 啟動(dòng)定時(shí)器1 EA = 1; // 開啟總中斷 ES = 1; // 開啟串口中斷 } // 主函數(shù) 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); } } } } // 串口中斷服務(wù)函數(shù) void uart_interrupt() interrupt 4 { if (RI) { RI = 0; received_data = SBUF; // 更新LCD顯示,這里可能需要設(shè)置LCD的地址,確保數(shù)據(jù)寫入正確位置 // 假設(shè)每次接收的數(shù)據(jù)都覆蓋顯示,這里簡單地從第一列開始顯示 w_com(0x80); // 設(shè)置LCD DDRAM起始地址為第一行第一列 for (uchar j = 0; j < 1; j++) // 這里假設(shè)每次只接收一個(gè)字符,如果需要接收多個(gè),需要調(diào)整邏輯 { w_dat(received_data); } } } |
Powered by 單片機(jī)教程網(wǎng)