首页  /  单片机教程  /  串口&液晶屏Ⅰ  /  

串口&液晶屏Ⅰ

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

1.题目要求

这一次我们将上一讲的代码作为基础,要实现的任务就是电脑端发送过来的字符串单片机把它们显示在液晶屏上,由于液晶屏只能显示ASCII码的字符,无法显示汉字,所以电脑端发送过来的字符串也必须是英文输入法下打出的字符。

当单片机接收完字符串之后液晶屏显示“Reception  Complete!”表示接收完成,持续一秒之后,蜂鸣器响一下,然后把接收到的字符串显示在液晶屏上,发送过来的字符串的字符数不能超过32个,因为液晶屏的显示范围只有32个格。


2.main.c测试代码

#include <reg52.h> 
#include <function.h> //详见第六章第8讲
#include <lcd.h>      //详见第十一章第3讲
#include <uart.h>     //详见第十章第4讲
 
u8 uart_i=0;
u8 pdata RXDBUF[64];
void COUNT_TIMES()
{
    TMOD&=0xF0;   //清0低四位
    TMOD|=0x01;   //设置定时器0为工作模式1
}
 
void main()
{  
    u8 x;  
    u16 n,j;          //用来实现蜂鸣器鸣叫定义的变量
    EA = 1;           //闭合总中断开关
    COUNT_TIMES();    //初始化计数器
    ConfigUART(9600);
    InitLcd1602();    //初始化液晶屏 
  
    while(1)
    {      
        if(TH0>=200)  //判断是否把数据接收完毕
        {
            TR0=0;    //关闭定时器,停止计时
    
            LcdFullClear();                 //整屏清除
            LcdShowStr(3, 0, "Reception");  //显示“接收完成”的英文字幕  
            LcdShowStr(3, 1, "Complete!");
    
            while(uart_i<32)                //液晶屏能显示的有32个字符,尽管接收到的字符串没有32个字节也要把RXDBUF数组的前32个元素补充空格字符的字节,避免液晶屏显示乱码
            {
                RXDBUF[uart_i]=' ';         //增加空格
                uart_i++;
            }
    
            TH0=0;                          //清零定时器的寄存器,下次再从0开始计时  
            TL0=0;
    
            delay_ms(1000);                 //停顿1秒
    
            for(j=0;j<1000;j++)             //蜂鸣器鸣叫一下
            {
                BEEP=!BEEP;
                for(n=0;n<25;n++);          //延时接近0.125ms,给P1.6保持了0.125ms高电平时间
            } 
    
            LcdFullClear();                      //整屏清除
            LcdShowStr_len(0, 0,RXDBUF, 16);     //显示前16个字符
            LcdShowStr_len(0, 1,RXDBUF+16, 16);  //显示后16个字符
            uart_i=0;                            //uart_i归0是为了下次接收新的字符串是从RXDBUF[0]开始存取数据
    
            for(x=0;x<32;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[uart_i]=SBUF; //接收一个字节数据
        uart_i++;            //RXDBUF从0号元素不停往下存取数据   
    }
}

下载完程序进去时会有蜂鸣器响一下,大家复位一下开发板就可以了,这是因为我们下载程序进去也是通过串口下进去的,所以会触发程序里的接收完成部分的代码而使蜂鸣器鸣叫一声。

我们试着发送一下这个字符串“LcdShowStr_len(0, 0,RXDBUF, 16);”给单片机,看看液晶屏有什么显示

15.7.png


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

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