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-16 23:56

单片机怎样才能不死机之串口Overrun
闲言少叙,先上Code,大家看一下下面这段代码有没有问题? // Note: USART demo code runs on STM32F030#include “main.h” static __IO uint32_t TimingDelay; RCC_ClocksTypeDef RCC_Clocks; uint8_t uart_buffer[100]; // GPIO Configurationvoid GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_1
[单片机]
51单片机电子时钟程序
这是用单片机仿真软件做的一个电子时钟程序 电路图在下面: #include reg52.h #include intrins.h #include stdlib.h #define uint unsigned int #define uchar unsigned char sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; sbit d=P2^3; unsigned char code string ={ Test Result }; unsigned char code digit ={ 0123456789 }; void delay1ms() { un
[单片机]
<font color='red'>51单片机</font>电子时钟程序
基于51单片机多功能太阳能路灯的设计与实现
随着社会发展的步伐日益加快,人们对新型能源地开发利用程度不断加大,太阳能作为一种新型能源,越来越受到人们的重视,合理有效的利用好太阳能,已逐步成为节能环保的一种趋势。西藏太阳能资源居中国首位,也是世界上最丰富的地区之一,全年平均日照时数在3 000小时左右。因此为了更环保、更加节能,合理有效地利用太阳能,我们设计出一款多功能太阳能路灯。文中采用C8051F020作为主控芯片,通过51单片机控制片内高速AD对紫外线传感器、温度传感器、光照度传感器等进行采样,对拉萨环境进行监测(特别是紫外线强度的监测),相关数据参数经过LCD显示,用户可通过需要显示广告信息,如进行公益广告,商业广告相关信息的宣传;同时利用具有高效节能的LED灯作为
[单片机]
基于<font color='red'>51单片机</font>多功能太阳能路灯的设计与实现
51单片机—软件看门狗
这是第一次写一写下自己的学习的过程,这只是个开始,呵呵,当然没有结束的一个开始 今天没有事情,就看看单片机的书,突然发现自己学了这么长的时间还没有用过看门狗这个东东~~表示很惭愧,(*^__^*) 嘻嘻 既然这是自己的第一篇文章,那就来个简单,但是也好写的东东吧~~~ 001.软件看门狗 当程序跑飞到一个临时构成的死循环中时,这是如果没有人为的操作(也就是按下复位键 ),那么软件系统将完全瘫痪。那么我们就要让MCU自己实现监视系统运行的情况,这就是程序运行监视系统(WatchDog)。 简单来说吧,好比一个主人养了一条狗,主人在正常工作时总是不忘记每隔一段时间就喂一次狗,狗吃过东西就安静下来,这样也就不会影响主人生活。
[单片机]
<font color='red'>51单片机</font>—软件看门狗
51单片机入门 - UART串口
对于单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。 1、初步认识 一位一位的发送出去的,要发送 8 次才能发送完一个字节。 STC89C52有两个引脚是专门用来做 UART串行通信的,一个是 P3.0一个是 P3.1,它们还分别有另外的名字叫做 RXD和TXD,由它们组成的通信接口就叫做串行接口,简称串口。 波特率:发送二进制数据位的速率,习惯上用 baud 表示;即我们发送一位二进制数据的持续时间=1/baud。 通信过程:在UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0
[单片机]
<font color='red'>51单片机</font>入门 - UART<font color='red'>串口</font>
技术科:你知道51单片机如何存储程序吗
MCS-51使用哈弗结构,它的程序空间和数据空间是分开编址的,即各自有各自的地址空间,互不重叠。所以即使地址一样,但因为分开编址,所以依然要说哪一个空间内的某地址。而ARM(甚至是x86)这种冯诺依曼结构的MCU/CPU,它的地址空间是统一并且连续的,代码存储器/RAM/CPU寄存器,甚至PC机的显存,都是统一编址的,只是不同功能的存储器占据不同的地址块,各自为政。 好,说回MCS-51。 对于程序存储器,有片内和片外两部分。而且无论片内程序存储器,还是片外程序存储器,他们的地址是共享的。如果片内4k ROM的话,地址就是0x0000-0x0FFF,从0x1000-0xFFFF就是外部ROM的地址空间。可外部ROM的0x0
[单片机]
技术科:你知道<font color='red'>51单片机</font>如何存储程序吗
初步认识51单片机-2.3单片机控制DS18B20温度传感器模块
通过前面LCD1602的例子我相信对IO口的控制和延时基本有所了解,下面再来一个例子温度传感器,同样只需要IO口操作和延时。先来个DS18B20温度传感器的简介。既然是温度传感器,那么一定有个感知温度的感应器。这个感应器能把它周围的温度直接转成数字并存储在scratchpad存储器中。这个感知温度和转换成数字信号的过程我们可以不用理解。我们要做的事情就是读存储器的内容及其他一些配置。其原理图如下: 图1 DS18B20温度传感器概述 在DS18B20中有一个温度传感器(如上图所示),它能感知周围环境温度,并能将温度的结果直接转成数字信号存储起来。温度信号转成数字信号的过程我们可以不用关心。那么数字信号存在哪里了?DS18B
[单片机]
初步认识<font color='red'>51单片机</font>-2.3单片机控制DS18B20温度传感器模块
C#与51单片机串口通信
C#与51单片机串口通信 51接受数据,PC发送数据。 通过单片机的数码管将PC发送的16进制数据显示出来。 51接受数据代码: #include reg51.h #include string.h #include intrins.h sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制 sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制 sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制 unsigned char ch; bit read_flag= 0 ; //此表为 LED 的
[单片机]

推荐帖子

关于STM32F105R8的Flash操作的问题
遇到一个问题,我准备用STM32F105R8的Flash进行一段数据的存储,主要是串口的信息,和一些用户信息进行存储,但是我找了几个例程,可以实现对Flash的操作,但无法对信息区进行操作(0x1ffff800~0x1fffffff)区域进行操作,或者可以进行写的操作,但无法进行擦除,希望大神能给点指导,是不是读写程序区和信息区是有区别的?如果在信息区是0xff的话,可以将数据写入,但是无法进行第二次的写入,也即是无法擦除。附件是我的工程,希望能给点指导。关于STM32F105R8的Fla
zheng522 stm32/stm8
使用OpenGL ES 2.0画一个最简单的三角形
求一段代码,需要使用OpenGLES2.0,画一个简单的三角形,平面的就好。使用OpenGLES2.0画一个最简单的三角形
wangtianji 嵌入式系统
MPLAB® Harmony之学习篇(三)-- 创建一个Harmony项目
本文转自Microchip麦田论坛——作者:chongcw通过本文希望大家了解在MPLAB®Harmony框架下,如何创建工程。本文讨论以下内容:创建工程所需工具如何创建应用工程创建工程所需工具集成开发平台MPLAB®XIDE点击下载MPLAB®XIDE编译器:XC32点击下载XC
橙色凯 Microchip MCU
RFID原理
一本讲述RFID的书,希望对大家有帮助RFID原理我要看看啊好的谢谢了啊啊啊啊啊好我要看看啊希望那个对我有用Re:RFID原理好贴中的好贴,大力顶啊。大力顶支持楼主!顶一个.非常感谢楼主!我顶一个先Re:RFID原理非常感谢楼主!我顶一个先!Re:RFID原理非常感谢楼主!我顶一个先!Re:RFID原理非常感谢楼主!我顶一个先Re:RFID原理非常感谢!!!!!!!!!!!!!!Re:RFID原理谢谢楼主!!!!!Re:
wenhuawu RF/无线
新型双环900MHz、1800MHz频段数字调谐系统
摘 要:研究了DDS+双PLL构成的新型数字调谐系统:A环产生DDS所需的时钟信号,B环产生高频输出。B环使调谐器输出频率f0作较大变化,A环和DDS使f0作小变动。该系统工作频率为850MHz~925MHz和1700MHz~1850MHz,频率分辨率可达25kHz。在单片微机控制下,可实现跳频。新型双环900MHz、1800MHz频段数字调谐系统
feifei FPGA/CPLD
想找关于初学模拟电子技术基础的教材
各位大佬你们好,有没有关于初学模拟电子技术基础的教材和练习,推荐一下,谢谢想找关于初学模拟电子技术基础的教材本版就有这么一个帖子模拟电子技术、数字电子技术---童诗白、华成英、阎石、康华光---整理下载。教材推荐 《模拟电子技术基础》(童诗白、华成英主编) 特点:该书是国内高校电子、通信、自动化等专业广泛使用的教材,内容全面,讲解深入浅出,适合初学者。书中不仅详细介绍了模拟电子技术的基本原理和分析方法,还包含大量的例题和习题,有助于读者巩固所学知识。
15996790391 模拟电子
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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