1.题目要求
在上一讲代码测试中,电脑端发送过来的数据单片机这边需要用数组存取起来,再把这些数据通过液晶屏显示出来,不过我们也可以把接收到的数据直接写进液晶屏的RAM中让它实时显示。
比如在电脑端那边发送“DAN ”(DAN后面有一个空格),液晶屏就从第一格开始显示“DAN ”,
接着在电脑端上我们删除之前发送过的内容,打上“PIAN ”然后发送,
删除之前发送过的内容打上“JI”发送,观察液晶屏的显示情况。
2.main.c测试代码
#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);”就是写入那个字符的数据了。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程