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);”就是写入那个字符的数据了。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)