51单片机-串口&液晶屏Ⅲ

发布者:trendsetter9最新更新时间:2021-10-14 来源: 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

推荐阅读最新更新时间:2024-11-11 13:16

51单片机P2口介绍
P2.0 P2.7为P2口的8位双向口线,第一功能为基本输入/输出;第二功能是在系统扩展时作为高8位地址总线使用。 P2口内部结构及其功能描述 如图是P2口内部1位的电路结构。注意与P0结构的不同之处。 P2端口是一个准双向端口; 第一功能: 当P2端口作为通用I/O使用时,单片机控制二选一复用器倒向P2.x锁存器的Q端,此时P2端口的功能和使用方法都类似于P1端口;系统复位时,端口锁存器自动置1,输出的下拉驱动器截止,P2端口可直接作为输入口使用。 第二功能: P2端口在系统扩展外围总线时输出高8位地址,此时P2不可作为通用I/O端口使用; P2端口输出高8位地址时,硬
[单片机]
数码显示管显示按键总个数 89c51单片机编程实例
;AT89C51单片机P1口接8个按键(switch),P2口接1个共阴极数码显示管,数码显示管显示按键按下的个数 ;注:连接电路图时,将实例2.1中的八个button按键换成switch按键 org 00h sjmp start org 30h start: mov p2,#3fh mov dptr,#table cc: mov r3,#0 next: mov a,p1 cpl a clr c mov r4,#8 bb: rlc a jnc aa inc r3 aa: djnz r4, bb mov a,r3 movc a,@
[单片机]
51单片机+315M无线射频模块接受程序
用的就是那种最普通的 最便宜的 大约几块钱 的315兆的无线模块接受发射,不带解码的,433m的程序也是一样的不用修改 压缩包中的内容: 上位机以及完整程序在文件夹中,大家可自己下载 地址是: http://www.51hei.com/bbs/dpj-19033-1.html 下面是接受端的源代码: #include AT89X52.H #include string.h //液晶块 #define LCM_RW P3_6 //定义引脚 #define LCM_RS P3_5 #define LCM_E P3_7 #define LCM_Data P1 #define Busy 0x80 //用
[单片机]
<font color='red'>51单片机</font>+315M无线射频模块接受程序
ADC0809与51单片机的连接方式
模数转换器定位为单片机的外部RAM单元,因此与单片机的连接就有很多种。大体上说ADC0809在整个单片机系统中是作为外部RAM的一个单元定位的。具体到某一个连接方式,定位又有区别。adc0809与单片机典型的连接有以下三种: ADC0809与51单片机的第一种连接方式 这是数据线对数据线、地址线对地址线的标准连接方式,如图2.2所示。由于ADC0809片内没有时钟,可利用单片机提供的地址锁存信号ALE经D触发器2分频后获得,ALE引脚的频率是单片机时钟频率的1/6,如果单片机时钟频率采用6MHz,则ALE引脚的输出频率为1MHz,再经过2分频后为500kHz,恰好符合0809对时钟的要求。 由于ADC0809具有输出
[单片机]
ADC0809与<font color='red'>51单片机</font>的连接方式
stm32-led-串口-PWM
因为项目需要,学习了一下stm32的GPIO,串口,PWM,中断部分,在这里做个小结, 共同学习,所有程序均经过实际测试,输出正确。 将GPIO,串口,PWM(定时器)的配置程序粘贴如下 1、使能外设的时钟:APB1ENR,APB2ENR 2、配置寄存器或者说是控制寄存器。在配置stm32外设时,任何时候都要先使能该外设的时钟!而每个控制寄存器,很有可能包括了,1模式寄存器,2使能寄存器,3才可能是我们认为的数据寄存器或者内容寄存器。 3、使能外设。即使配置好了,没有使能外设,则外设永远不会工作,这一点比较容易遗忘。 寄存器配置,请查看 http://wenku.baidu.com/link?url=NE4
[单片机]
STM32串口下载方式简单总结
这里简单说明一下一键下载电路的原理,我们知道, STM32 串口下载的标准方法是 2 个步 骤: 1, 把 B0 接 V3.3(保持 B1 接 GND)。 2, 按一下复位按键。 通过这两个步骤,我们就可以通过串口下载代码了,下载完成之后,如果没有设置从 0X08000000 开始运行,则代码不会立即运行,此时,你还需要把 B0 接回 GND,然后再按一 次复位,才会开始运行你刚刚下载的代码。所以整个过程,你得跳动 2 次跳线帽,还得按 2 次 复位,比较繁琐。而我们的一键下载电路,则利用串口的 DTR 和 RTS 信号,分别控制 STM32 的复位和 B0,配合上位机软件(mcuisp),设置: DTR 的低电平复位, RTS
[单片机]
STM32<font color='red'>串口</font>下载方式简单总结
51单片机定时器设置入门 (STC89C52RC)
STC单片机定时器设置 STC单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。 2.尽量用形像的方法记忆 比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像 TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)    定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 其格式
[单片机]
51单片机中data,idata,xdata,pdata的区别
说来惭愧,一直以来,在学校也算是搞了不少东西,不过反而是51单片机这个基础的东西没有认真去做过,当初刚自学51没一个多星期呢,就转到飞思卡尔16位单片机上去了,以至于51还没透彻的弄个明白。 就不如我很清楚s12单片机什么片内ram啊,flash大小啊,反而是51的不敢肯定的回答哦。 比如今天再次看到的这个问题,以前就看到过,但因为一直不怎么搞汇编程序,所以对51单片机中的data、idata、xdata和pdata一直不清楚,不过今天不再脱了,决定一定弄清楚。 ------------------------------------------------------------------------------------
[单片机]

推荐帖子

飞行器的要注意啦!B题补充说明
本帖最后由paulhyde于2014-9-1503:34编辑四旋翼飞行器(B题)补充说明文章日期:2013-09-0414:25:35文章点击率:956四旋翼飞行器(B题)补充说明四旋翼飞行器(B题)说明(2)中提到的“飞行控制”,包括飞行姿态及导航控制,必须采用组委会统一下发的R5F100LEA完成。全国大学生电子设计竞赛组委会秘书处2013年9月4日飞行器的要注意啦!B题补充说明本帖最后由paulhyde于2014-
Leo417love 电子竞赛
51单片机课程设计 C语言编的
采用ADC0809设计的数字电压表(用LED数码管显示)51单片机课程设计C语言编的网上这种历程太多了吧我怎么找不到嗯下载呢??
天使小鹏哥 51单片机
5 - 65 MHz 24 位色彩 FPD 链接 II 至 FPD 链接转换器
5-65MHz24位色彩FPD链接II至FPD链接转换器(DS90UR908Q)将FPD-LinkII转换为FPD-Link。它将一个单对线(FPD-LinkII)上具有嵌入时钟的高速串行化接口转换为4个低压差分信令(LVDS)数据/控制数据流和1个LVDS时钟对(FPD-Link)。这个串行总线方案消除了时钟和数据间的偏差问题,从而大大简化了系统设计,减少了控制器引脚数量,并且减少了互连线尺寸、重量和成本,并从总体上简化
Aguilera 微控制器 MCU
请教:选择哪款芯片?
请教做两个任务j,d,选择哪款芯片合适,stc可以吗?~for{j+d=p;p==20;d=2;j=y=k;y=5(y++)//if(y57)y=y+1;if(y714)y=j+1;if(y1519)y=k+1;elsej=5;}请教:选择哪款芯片?楼主,请把具体任务说清楚,你任务都不说,别人不知道该怎样回答正如楼上所说,具体任务说清楚,stc也有很多芯片。如果只是简单的判断功能,stc51系列可以完成。就楼主贴出的代码而言,如果是运行该代码
newstudent 单片机
接受7楼建议,终止这个讨论
接受7楼提议,这类题目应当在《初学者园地》栏目进行类似内容的讨论。暂时保留2日后转移。从<电子设计1000例>选出这个电路,我的问题是:如何利用交流等效电路的方法,半定量的分析解释这个电路的工作原理.(本主题原是对thtlj 主题的回复:https://bbs.eeworld.com.cn/viewthread.php?tid=52107&extra=&page=1 )SoundMixer/AmplifierBothinputsignalsc
xiaoxif 电源技术
FPGA各种数字电路模拟
FPGA各种数字电路模拟很好的电子书,值得一读,下载保存了,谢谢分享
至芯科技FPGA大牛 FPGA/CPLD
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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