历史上的今天

今天是:2024年08月31日(星期六)

2021年08月31日 | 51单片机-串口&液晶屏Ⅲ

发布者:trendsetter9 来源: eefocus关键字:51单片机  串口  液晶屏 手机看文章 扫描二维码
随时随地手机看文章

1.题目要求


这次我们使用串口来实现液晶屏功能函数的执行,也就是说我们电脑端发送字符串“LcdFullClear();”给单片机,单片机就让液晶屏执行整屏清除;电脑端发送“LcdShowStr(1,0,"Good Good Study");”给单片机,液晶屏就在第一行显示“Good Good Study”。需要注意的是,我们的代码对这两个功能函数的判别是有严格规定的,如果发送的字符串中间有多出的空格,


也就是说当“LcdShowStr(1, 0, "Good Good Study");”逗号之间多出空格单片机则无法正常执行功能代码,所以要严格按照要求来发送字符串才能实现功能代码。


下面的代码笔者就不一一讲解实现的原理了,大家先下载进开发板,然后跟着教程去实践,后面再回过头分析原理。


2.main.c测试代码


#include  

#include //详见第六章第8讲

#include       //详见第十一章第3讲

#include      //详见第十章第4讲

    

u8 i=0;

u8 pdata RXDBUF[64];

void COUNT_TIMES()

{

    TMOD&=0xF0;   //清0低四位

    TMOD|=0x01;   //设置定时器0为工作模式1

}

  

void UART_LcdFullClear()

{

    if(  RXDBUF[0]== 'L'&&RXDBUF[1]== 'c'&&RXDBUF[2]== 'd'&&RXDBUF[3]=='F'

       &&RXDBUF[4]== 'u'&&RXDBUF[5]== 'l'&&RXDBUF[6]== 'l'&&RXDBUF[7]== 'C'

       &&RXDBUF[8]== 'l'&&RXDBUF[9]== 'e'&&RXDBUF[10]=='a'&&RXDBUF[11]=='r' )                             

    {

        LcdFullClear();//整屏清除

    }

}

  

void UART_LcdShowStr()

{

    u8 lcd_x,lcd_y,z;

    

    if(  RXDBUF[0]=='L'&&RXDBUF[1]=='c'&&RXDBUF[2]=='d'&&RXDBUF[3]=='S'&&RXDBUF[4]=='h'

       &&RXDBUF[5]=='o'&&RXDBUF[6]=='w'&&RXDBUF[7]=='S'&&RXDBUF[8]=='t'&&RXDBUF[9]=='r')                               

    {

        //以下是确定要在哪个位置开始显示,也就是知道坐标位置

        if(RXDBUF[12]>='0'&&RXDBUF[12]<='9') //RXDBUF[11]接收到的肯定是字符'0'~'9',如果RXDBUF[12]接收到的也是字符'0'~'9',

        {                                    //那么可以知道x坐标系是大于等于10的

        

            lcd_x=(RXDBUF[11]-'0')*10;       //比如我们发送的是“LcdShowStr(13,0,"YES");”,

            lcd_x+=RXDBUF[12]-'0';           //则有RXDBUF[11]==‘1’,RXDBUF[12]==‘3’

        }

        else lcd_x=RXDBUF[11]-'0';           //如果x坐标小于10,也就是只是个位数,则只需处理RXDBUF[11]

       

        if(RXDBUF[14]>='0'&&RXDBUF[14]<='9') //如果RXDBUF[12]接收到的是字符'0'~'9',    

        {                                    //那么RXDBUF[13]==',',RXDBUF[14]就是决定y坐标

        

            lcd_y=RXDBUF[14]-'0';

        }      

        else lcd_y=RXDBUF[13]-'0';           //如果RXDBUF[14]接收到的不是字符'0'~'9',那么x坐标为个位数,则由RXDBUF[13]决定y坐标

                                             //以下是判断两种结果,一种是如果x坐标是小于10,也就是只有个位数,

                                             //那么RXDBUF[15]肯定是等于'"',如果x坐标是大于等于10,则RXDBUF[16]才是等于'"'

       

        if(RXDBUF[15]=='"')

        {

            for(z=1; ;z++)

            {

                if(RXDBUF[15+z]=='"')             //当遇到第二个'"'时,表明要显示的字符串已经确定,此时需要添加结束符,然后退出for循环

                {

                    RXDBUF[15+z]='';            //添加结束符

                    break;

                }

            }

            LcdShowStr(lcd_x,lcd_y,RXDBUF+15+1);  //如果电脑端这样发送过来“LcdShowStr(0,0,"DAN PIAN JI");”,

                                                  //那液晶屏上要显示的就是“DAN PIAN JI”

        }

        else if(RXDBUF[16]=='"')

        {

            for(z=1; ;z++)

            {

                if(RXDBUF[16+z]=='"')

                {

                    RXDBUF[16+z]='';//添加结束符

                    break;

                }

            }

            LcdShowStr(lcd_x,lcd_y,RXDBUF+16+1);

        }    

    }

}

  

void main()

{  

    u8 x;   

    EA = 1;                                  //闭合总中断开关

    COUNT_TIMES();                           //初始化计数器

    ConfigUART(9600);

    InitLcd1602();                           //初始化液晶屏 

    LcdShowStr(1, 0, "Good Good Study");     //第一行显示"Good Good Study"

    LcdShowStr(3, 1, "Day Day Up!");         //第二行显示"Day Day Up" 

    

    while(1)

    {      

        if(TH0>=200)                         //判断是否把数据接收完毕

        {

            TR0=0;                           //关闭定时器,停止计时

         

            UART_LcdFullClear();             //查看串口发送来的信息是否满足清屏的条件

            UART_LcdShowStr();               //查看串口发送来的信息是否满足液晶屏显示字符串的条件

         

            TH0=0;                           //清零定时器的寄存器,下次再从0开始计时  

            TL0=0;

            i=0;                             //i归0是为了下次接收新的字符串是从RXDBUF[0]开始存取数据

            for(x=0;x<64;x++)RXDBUF[x]=0x00; //内存区全部清除数据,统一改为0x00以便下次接收新的字符串

        }

    } 

}

    

void InterruptUART() interrupt 4

{  

    if (RI)   //接收到字节

    {

        RI = 0;

        TH0=0;//每接收到一个字节数据就清0寄存器的值,定时时间又是从0开始计时,直到TH0大于等于200的时候,

        TL0=0;//时间超过50ms,也就是没有再接收到数据,因为接收到数据都会进入“if (RI)”把TH0和TL0清0,TH0大于等于200,

              //超出了等待时间,证明后面没有数据发送过来了   

        TR0=1;//接收到第一个数据就打开定时器开始计时,后面接收到第二,第三个数据照样打开定时器计时,直到在主函数里面被关闭为止

       

        RXDBUF[i]=SBUF; //接收一个字节数据

        i++;            //RXDBUF从0号元素不停往下存取数据   

    }

}


3.实践操作


首先下载进开发板看到液晶屏显示有“Good Good Study  Day Day Up!”。


我们在电脑端的串口调试助手上输入清屏函数的字符串

15.8.png

点击发送即可看到液晶屏显示的内容全部清屏。


接着如果我们要在哪个地方显示什么内容,那么在串口调试助手中输入类似这样的字符串“LcdShowStr(0,0,"DAN PIAN JI!");”,记住逗号之间不要留有空格。

15.9.png

点击发送就可以看到液晶屏上显示“DAN PIAN JI!”了。

关键字:51单片机  串口  液晶屏 引用地址:51单片机-串口&液晶屏Ⅲ

上一篇:51单片机-串口&液晶屏Ⅱ
下一篇:51单片机-串口&EEPROM

推荐阅读

在Uber上市前夕,丰田汽车宣布向其投资5亿美元,双方将联合推出自动驾驶车队。丰田投资后,Uber估值重回700亿美元上方,达到720亿美元。 一位接近交易的人士向记者透露,丰田此次注资获得了Uber的一小部分股权。不过双方没有公开披露丰田持有Uber的股份比例。 曾考虑出售自动驾驶业务值得注意的是,就在本月初,丰田汽车向东南亚出行服务平台Grab投资10...
如今,“收快递”已经成为人们日常生活不可或缺的一部分,根据中国智慧物流研究院报告显示,自2017年5月以来,全国快递服务企业日均快递业务量超过1亿件,标志着我国已经常态化进入单日快递“亿件时代”。在快递业务配送单量、外卖频次与日俱增的情况下,消费者对于配送速度、服务质量等个性化的需求越来越高。尤其在快递业务旺季,剧增的订单业务往往导致...
任何一个时代,核心技术决定企业的竞争力。那些百年企业之所有能在残酷的市场竞争中屹立不倒,正是源于核心技术的积累。2018年,随着光伏政策的变化,产业通过竞价降低度电成本,迈向平价上网是必然趋势,因此以技术创新为突破口,降低度电成本、减少补贴依赖成为光伏产业健康发展的新方向。同时,光伏新政让工商业分布式光伏异军突起,工商业屋顶面积大,...
据台湾经济日报报道,全球第四大积层陶瓷电容(MLCC)厂日商太阳诱电发函客户,旗下位于马来西亚主要供货苹果的厂区受疫情干扰,部分制程即日起停工至9月10日。业界人士认为,值苹果新品拉货之际,太阳诱电必须调度其他厂区产能,补足原本应由大马厂供应苹果的量,将打乱其MLCC供应步调,国巨(2327)、华新科等台厂可望得利。法人指出,疫情打乱全球MLCC供...

史海拾趣

问答坊 | AI 解惑

mdkarm3.05问题target not created

初学arm,用keil老生成不了目标文件,请高手指教,怎么解决啊 build target \'lpc2106\' assembling startup.s... /cygdrive/c/cygnus/arm-tools/bin/../lib/gcc-lib/arm-thunb-elf/3.3.1/../../../../arm-thumb-elf/bin/ld: warning:cannot fin ...…

查看全部问答∨

红外灯介绍

红外灯主要有以下三种: 卤素灯泡加滤光片:照射距离较远,功率较大,但能量损失也大,因为加有滤光片,大部分可见光被滤掉而转变成热能,所以这种红外灯寿命很短,售后服务问题很多; 激光管:照射距离最远,但角度很小,如果角度调大以后,由于能 ...…

查看全部问答∨

印刷电子当选2010年影响世界的十大潜力新技术

2. 印刷电子      能快速印刷出多个导体/绝缘体或半导体层以形成电路的技术,可望催生比目前采用传统制程生产之IC成本更低芯片。通常印刷半导体意味着使用性能与硅大不相同 的有机材料,甚至所生产之组件尺寸也能超越硅材料的 ...…

查看全部问答∨

编译交叉工具时遇到的问题

我想在cygwin下编译基于目标cpu i960的交叉编译工具链 在编译bootrap gcc的时候遇到一个libgcc1.a的问题 mv libgcc1.a libgcc1.cross || (echo You must find a way to make libgcc1.a; false) mv: cannot stat `libgcc1.a\': No such file or d ...…

查看全部问答∨

超级终端下输入显示乱码,而在dnw下输入显示正常

我这几天用笔记本串口连接开发板(之前用台式机正常),但是在超级终端下输入显示乱码,而在dnw下输入显示正常。开发板像超级终端输出显示正常。 怎么才能在超级终端下正常输入呢,请指教,谢谢!…

查看全部问答∨

杭州,嵌入式项目开发合作,有兴趣的进来看看

准备上个项目,人手不够,打算找人合作。 杭州有产品经验,有业余时间,熟悉工业级ARM,51,tcp/ip,RTOS等之一的技术便可。 有兴趣的回个贴。 技术专长,业余时间,要求等。 sssbang@163.com …

查看全部问答∨

Pocket PC怎样通过activesync连接到局域网?

我已经安装好Activesync4.2,Pocket PC通过USB线连接到我的电脑上,连接成功.我的电脑是连在局域网上的,怎样将Pocket PC连到局域网上呢?…

查看全部问答∨

是不是现在支持STM32F的GCC编译器开发环境都是命令行模式的

我下载了一个WINARM20080331里面没找到XP可以运行的程序CodeSourcery 里面用的好象也是命令行模式 …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved