历史上的今天

今天是: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

推荐阅读

一辆特斯拉Model S在加州圣何塞的101公路上,撞上一辆停在路边的消防车,车内两名乘客受了轻伤,37岁的司机因涉嫌酒后驾车被捕。这起事故,是今年特斯拉第三次撞上消防车了,特斯拉为啥老喜欢撞消防车呢?  Autopilot下的特斯拉事故根据警方的一份报告,这位司机告诉警察:“我想我已经开启了自动驾驶功能(Autopilot)”。特斯拉的一位发言人则表示,...
据消息报道,可口可乐欧洲合作伙伴(CCEP)正在英国一个主题公园配送服务,利用一款自动驾驶机器人配送饮料…… 黑科技,前瞻技术,自动驾驶,可口可乐英国公园,可口可乐自动驾驶,可口可乐自动驾驶配送,可口可乐自动驾驶送货机器人,汽车新技术 据消息报道,可口可乐欧洲合作伙伴(CCEP)旗下创新投资基金CCEP Ventures正与自动驾驶专家leRetail合...
近期驱动IC市场供应吃紧,联咏、敦泰早有涨价规划,随着华为主动加价抢货,恐使得市场供不应求状况更严重,推升价格涨势更激烈,联咏、敦泰等供应商本季旺季营运更旺。业界人士分析,造成此波驱动IC供不应求,主要与8吋晶圆代工产能吃紧有关,尤其疫情带来众多新应用需求都需要8吋晶圆代工产能支援,但8吋厂产能近年并未明显增加,直接排挤驱动IC产出。驱...
全球缺芯潮愈演愈烈,从上游晶圆缺货,到供货商囤积居奇,再到国际形势不容乐观的种种景象,都在预示着芯片问题不断加剧。而无论是消费,还是汽车制造,对芯片的需求都只增不减,如何迅速提高产能,成为半导体行业从晶圆制造到封装的众企业亟待解决的难题。 今天分享的案例中,斯坦德机器人通过一套解决方案,帮助半导体行业在扩建厂房、扩大产能方面迈...

史海拾趣

问答坊 | AI 解惑

MCU/DSP/FPGA呈现多元化发展趋势

MCU/DSP/FPGA呈现多元化发展趋势 MCU凭借其强大的控制功能,广泛地用于消费类电子、通信、汽车电子、工业等领域。有资料显示,MCU产品需求量每年不断增长,2008年全球MCU市场将增长到160亿美元。DSP则以其卓越的数据处理能力以及优秀的数据算 ...…

查看全部问答∨

最基本的电子技术知识

色环电阻读数方法:先找出金或银色的一端,从这一端开始,依次为精度,有效数字后添零的个数,个位,十位(五环电阻还有百位),精度一般不管。色环与数值对应关系为从1到0依次为:棕红橙黄绿 蓝紫灰白黑 (注:金色或银色若出现在倒数第二环则分别 ...…

查看全部问答∨

模拟电子技术重点难点及典型题精解

模拟电子技术重点难点及典型题精解,继续!…

查看全部问答∨

设置Linker 标准库函数为Redlib(semihost),避免link时undefined reference错误

    昨天晚上用LPCXpresso v3.3新建一个project,完成以后编译出错:sqrt.c:(\" />\" />\" />.text.sqrt+0xfc): undefined reference to `errno\'。     对比LPCXpresso 带的例子终于发现:MCU Linker下面的T ...…

查看全部问答∨

▓▓▓如何获得数据总线的宽度(windows mobile 6)▓▓▓

▓▓▓如何获得数据总线的宽度(windows   mobile   6)▓▓▓ 用什么API…

查看全部问答∨

wince 共同研究探讨

研究wince  有些时间了 . 多数时间是一个人在研究, 好多问题 从网上找资料, 学习 希望多一些朋友 共同研究 交流 新弄了个qq群:8248438…

查看全部问答∨

请高手指点一下Wince下如何画三角形Button

CreatePolygonRgn()这个API不能用了,请问我怎么样得到一个三角形的HRGN类型。 请高手指点一下,小弟感激不尽。…

查看全部问答∨

MSP430预计要到12月份才有货!!

有想学430的坛友,TI公司回复说要到12月份才有430的板子下来,现在应该是处于无货状态,这段时间大家如果想学习的,最好在12份之前下订单,顺便说一下,430网上购买用的是美元,你必须有一个双币值的信用卡才能购买。…

查看全部问答∨

CPLD

最近自己在做一个CPLD的最小系统。可是碰到了ISE无法检测到CPLD的板子。我用的FPGA的并口下载线,是不是CPLD和FPGA不能公用啊?还是在JTAG的引脚上有怎样的设置?求教啊。。。。…

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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