登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] 串口发送字符串至液晶屏显示

[复制链接]
发表于 2022-1-25 15:03:09 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 单片机
开始时间: 2022-01-25
结束时间: 2022-01-25
本帖最后由 房一鹏 于 2022-1-25 15:06 编辑

此程序看似是在发送字符串,但仍是一个字符一个字符的发送,我本想用数组保存下所有的字符,待所有的字符发送完毕后再启动LCD1602显示,但这样的话,字符串的长度需要与数组的长度相等,并且例如a[ ]这样的没有定义变量个数的数组无法通过编辑,总之用数组保存字符串我没有写出来(实际一定是能写出来的,望哪位大佬能写出来),并且我这个程序在串口接收数据时,会被定时器0中断打断,导致接受数据不全,调整中断优先级可以解决,自己看看吧。

程序
#include<reg52.h>
#define LCD1602_DB P0

sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_E=P1^2;

unsigned char T0RH=0;
unsigned char T0RL=0;
unsigned char a;
unsigned char cnt=0;
bit over=0;

void configUART(unsigned int baud);
void configTimer0(unsigned char ms);
void initlcd1602();
void LCDshowstr(unsigned char *str);
void LcdWritecmd(unsigned char cmd);

void main()
{
        EA=1;
        configUART(9600);
        configTimer0(1);
        initlcd1602();
        LcdWritecmd(0x80+0x00);
        while(1)
        {
          if(over)
          {
                        over=0;
            LCDshowstr(&a);
          }
        }
}


void delay()
{
        unsigned char i=5;
        while(i--);
}

void configUART(unsigned int baud)
{
        SCON=0x50;
        TMOD&=0x0F;
        TMOD|=0x20;
        TH1=255-(32768000/12/32)/baud;
        TL1=TH1;
        ET1=0;
        TR1=1;
        ES=1;
}
void configTimer0(unsigned char ms)
{
        unsigned long tmp=0;
        tmp=32768000/12;
        tmp=(tmp*ms)/1000;
        tmp=65536-tmp;
        T0RH=(unsigned char)(tmp>>8);
        T0RL=(unsigned char)tmp;
        TMOD&=0xF0;
        TMOD|=0x01;
        TR0=1;
        ET0=1;
}
void LcdWaitReady()
{
        unsigned char sta;
        LCD1602_DB=0xFF;
        LCD1602_RS=0;
        LCD1602_RW=1;
        do
        {
                LCD1602_E=1;
                sta=LCD1602_DB;
                LCD1602_E=0;
        }
        while(sta&0x80);
}
void LcdWritecmd(unsigned char cmd)
{
        LcdWaitReady();
        LCD1602_RS=0;
        LCD1602_RW=0;
        LCD1602_DB=cmd;
        delay();
        LCD1602_E=1;
        delay();
        LCD1602_E=0;
}
void LcdWriteDat(unsigned char dat)
{
        LcdWaitReady();
        LCD1602_RS=1;
        LCD1602_RW=0;
        LCD1602_DB=dat;
        delay();
        LCD1602_E=1;
        delay();
        LCD1602_E=0;
}
void LCDshowstr(unsigned char *str)
{
        while(*str!='\0')
        {
                LcdWriteDat(*str++);
        }
}
void initlcd1602()
{
        LcdWritecmd(0x38);     
        LcdWritecmd(0x0C);   
        LcdWritecmd(0x06);
        LcdWritecmd(0x01);
}

void interruptUART() interrupt 4
{
        if(RI)
        {
                RI=0;
                cnt++;
                a=SBUF;
                SBUF=a;
                over=1;
        }
        if(TI)
        {
                TI=0;
        }
}

void interruptTimer0() interrupt 1
{
        unsigned char m=0;
        TH0=T0RH;
        TL0=T0RL;
        
        if(cnt>=16)
        {
                cnt=0;
                initlcd1602();
        }
}

IMG20220125145107.jpg
IMG20220125145115.jpg
好懒~~不想说~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表