Dotcpp  >  编程教程  >  混合例程  >  串口&液晶屏Ⅱ

串口&液晶屏Ⅱ

点击打开在线编译器,边学边练

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


本文固定URL:https://www.dotcpp.com/course/406

上一课:

串口&液晶屏Ⅰ

下一课:

串口&液晶屏Ⅲ

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

单片机教程
第一章 单片机入门
第二章 LED及入门
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)