在上一讲代码测试中,电脑端发送过来的数据单片机这边需要用数组存取起来,再把这些数据通过液晶屏显示出来,不过我们也可以把接收到的数据直接写进液晶屏的RAM中让它实时显示。
比如在电脑端那边发送“DAN ”(DAN后面有一个空格),液晶屏就从第一格开始显示“DAN ”,
接着在电脑端上我们删除之前发送过的内容,打上“PIAN ”然后发送,
删除之前发送过的内容打上“JI”发送,观察液晶屏的显示情况。
#include <reg52.h> #include <function.h> //详见第六章第8讲 #include <lcd.h> //详见第十一章第3讲 #include <uart.h> //详见第十章第4讲 u8 i=0; u8 pdata RXDBUF[64]; void main() { EA = 1; //闭合总中断开关 ConfigUART(9600); InitLcd1602(); //初始化液晶屏 LcdSetCursor(0, 0); while(1); } void InterruptUART() interrupt 4 { static u8 i; if (RI) //接收到字节 { RI = 0; LcdWriteDat(SBUF); //接收到一个字节数据就写进液晶屏的RAM中让它实时显示 i++; if(i==16)LcdSetCursor(0, 1); //换行显示 if(i>32) { i=0; LcdFullClear(); //整屏清除 LcdSetCursor(0, 0); //又从起点开始显示 LcdWriteDat(SBUF); } } }
第一次下载进去之后都需要复位一下开发板,因为一开始在液晶屏上都会看到个别乱码。
还有,如果此时的液晶屏被我们用串口写满了32格,下次再写的时候,必须只能写一个字符,然后发送,如果在满屏的时候写两个字符及以上的话,比如写“AB”,就会显示“BB”。
这是因为电脑端发送的数据间隔时间都是很快的,我们在“if(i>32)”的内容里执行整屏清除,设置坐标从“0,0”开始,这些任务占用了CPU资源,导致错过了电脑端发送的连续的字符。如果只发送一个字符,那么SBUF会一直保留住这个数据,等到清屏函数之类的任务执行完了,“LcdWriteDat(SBUF);”就是写入那个字符的数据了。
本文固定URL:https://www.dotcpp.com/course/406