1.題目要求
在上一講代碼測(cè)試中,電腦端發(fā)送過(guò)來(lái)的數(shù)據(jù)單片機(jī)這邊需要用數(shù)組存取起來(lái),再把這些數(shù)據(jù)通過(guò)液晶屏顯示出來(lái),不過(guò)我們也可以把接收到的數(shù)據(jù)直接寫進(jìn)液晶屏的RAM中讓它實(shí)時(shí)顯示。
比如在電腦端那邊發(fā)送“DAN ”(DAN后面有一個(gè)空格),液晶屏就從第一格開始顯示“DAN ”,
接著在電腦端上我們刪除之前發(fā)送過(guò)的內(nèi)容,打上“PIAN ”然后發(fā)送,
刪除之前發(fā)送過(guò)的內(nèi)容打上“JI”發(fā)送,觀察液晶屏的顯示情況。
2.main.c測(cè)試代碼
#include <reg52.h> #include <function.h> //詳見(jiàn)第六章第8講 #include <lcd.h> //詳見(jiàn)第十一章第3講 #include <uart.h> //詳見(jiàn)第十章第4講 u8 i=0; u8 pdata RXDBUF[64]; void main() { EA = 1; //閉合總中斷開關(guān) ConfigUART(9600); InitLcd1602(); //初始化液晶屏 LcdSetCursor(0, 0); while(1); } void InterruptUART() interrupt 4 { static u8 i; if (RI) //接收到字節(jié) { RI = 0; LcdWriteDat(SBUF); //接收到一個(gè)字節(jié)數(shù)據(jù)就寫進(jìn)液晶屏的RAM中讓它實(shí)時(shí)顯示 i++; if(i==16)LcdSetCursor(0, 1); //換行顯示 if(i>32) { i=0; LcdFullClear(); //整屏清除 LcdSetCursor(0, 0); //又從起點(diǎn)開始顯示 LcdWriteDat(SBUF); } } }
第一次下載進(jìn)去之后都需要復(fù)位一下開發(fā)板,因?yàn)橐婚_始在液晶屏上都會(huì)看到個(gè)別亂碼。
還有,如果此時(shí)的液晶屏被我們用串口寫滿了32格,下次再寫的時(shí)候,必須只能寫一個(gè)字符,然后發(fā)送,如果在滿屏的時(shí)候?qū)憙蓚€(gè)字符及以上的話,比如寫“AB”,就會(huì)顯示“BB”。
這是因?yàn)殡娔X端發(fā)送的數(shù)據(jù)間隔時(shí)間都是很快的,我們?cè)凇癷f(i>32)”的內(nèi)容里執(zhí)行整屏清除,設(shè)置坐標(biāo)從“0,0”開始,這些任務(wù)占用了CPU資源,導(dǎo)致錯(cuò)過(guò)了電腦端發(fā)送的連續(xù)的字符。如果只發(fā)送一個(gè)字符,那么SBUF會(huì)一直保留住這個(gè)數(shù)據(jù),等到清屏函數(shù)之類的任務(wù)執(zhí)行完了,“LcdWriteDat(SBUF);”就是寫入那個(gè)字符的數(shù)據(jù)了。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程