登录  | 立即注册

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

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] LCD1602+串口+蜂鸣器

[复制链接]
发表于 2022-2-8 18:17:57 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机
学习安排: 单片机
开始时间: 2022-02-08
结束时间: 2022-02-08
金沙滩1602与串口示例的最后一个程序
1、main函数
#include<reg52.h>

sbit BUZZ=P1^3;

bit flagBUZZon=0;
unsigned char T0RH=0;
unsigned char T0RL=1;

void configTimer0(unsigned char ms);
extern void configUART(unsigned int baud);
extern void initlcd1602();
extern void UartRxMonitor(unsigned char ms);
extern void Uartdrive();
extern void LcdAreaClean(unsigned char x,unsigned char y,unsigned char len);
extern void LcdShowstr(unsigned char x,unsigned char y,unsigned char *str);
extern void UartWrite(unsigned char *buf,unsigned char len);       

void main()
{
        EA=1;
        configTimer0(1);
        configUART(9600);
        initlcd1602();
        while(1)
        {
                Uartdrive();
        }
}

bit CmpMemory(unsigned char *part1,unsigned char *part2,unsigned char len)
{
        while(len--)
        {
                if(*part1++!=*part2++)
                {
                        return 0;
                  break;
                }
        }
        return 1;
}

void Uartaction(unsigned char *buf,unsigned char len)
{
        unsigned char i;
        unsigned char code cmd0[]="buzz on";
        unsigned char code cmd1[]="buzz off";
        unsigned char code cmd2[]="showstr ";
        unsigned char code cmdlen[]={
                sizeof(cmd0)-1,sizeof(cmd1)-1,sizeof(cmd2)-1
        };
        unsigned char code *cmdptr[]={
                &cmd0[0],&cmd1[0],&cmd2[0]
        };
       
        for(i=0;i<sizeof(cmdlen);i++)
        {
                if(len>=sizeof(cmdlen[i]))
                {
                        if(CmpMemory(buf,cmdptr[i],cmdlen[i]))
                        {
                                break;
                        }
                }
        }
        switch(i)
        {
                case 0:flagBUZZon=1;break;
                case 1:flagBUZZon=0;break;
                case 2:
                        buf[len]='\0';
                  LcdShowstr(0,0,buf+cmdlen[2]);
                  i=len-cmdlen[2];
                if(i<16)
                {
                        LcdAreaClean(i,0,16-i);
                }       
                break;
                default:
                        UartWrite("bad.command\r\n",sizeof("bad.command\r\n")-1);
                        return;       
        }
        buf[len++]='\r';
        buf[len++]='\n';
  UartWrite(buf,len);
}
void configTimer0(unsigned char ms)
{
        unsigned long tmp;
        tmp=32768000/12;
        tmp=tmp*ms/1000;
        tmp=65536-tmp;
        tmp=tmp+18;
        T0RH=(unsigned char)(tmp>>8);
        T0RL=(unsigned char)tmp;
        TMOD&=0xF0;
        TMOD|=0x01;
        TH0=T0RH;
        TL0=T0RL;
        TR0=1;
        ET0=1;
}

void interruptTimer0() interrupt 1
{
        TH0=T0RH;
        TL0=T0RL;
        if(flagBUZZon)
                BUZZ=~BUZZ;
        else
                BUZZ=1;
        UartRxMonitor(1);
}

2、LCD1602函数
#include<reg52.h>

#define LCD1602_DB P0

sbit LCD1602_RS=P2^0;
sbit LCD1602_RW=P2^1;
sbit LCD1602_E=P1^2;
void delay()
{
        unsigned char i;
        for(i=0;i<=3;i++);
}

void LcdWaitReady()
{
        unsigned char sta=0;
        LCD1602_DB=0xFF;
        LCD1602_RS=0;
        LCD1602_RW=1;
        do
        {
                LCD1602_E=1;
                sta=LCD1602_DB;
                delay();
                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 LcdSetCursor(unsigned char x,unsigned char y)
{
        unsigned char addr;
        if(y==0)
        {
                addr=0x00+x;
        }
        else
        {
                addr=0x40+x;
        }
        LcdWritecmd(0x80+addr);
}

void LcdShowstr(unsigned char x,unsigned char y,unsigned char *str)
{
        LcdSetCursor(x,y);
        while(*str!='\0')
        {
                LcdWritedat(*str++);
        }
}

void LcdAreaClean(unsigned char x,unsigned char y,unsigned char len)
{
        LcdSetCursor(x,y);
        while(len--)
        {
                LcdWritedat(' ');
        }
}
void initlcd1602()
{
        LcdWritecmd(0x38);     
        LcdWritecmd(0x0C);   
        LcdWritecmd(0x06);   
        LcdWritecmd(0x01);
}

3、串口函数
#include<reg52.h>

bit flagFrame=0;      //&#214;&#161;&#189;óêüíê±ê&#214;&#190;
bit flagTxd=0;        //μ¥×&#214;&#189;ú·¢&#203;ííê±&#207;±ê&#214;&#190;
unsigned char cntRxd=0;  //&#189;óêü×&#214;&#189;ú&#188;&#198;êy&#198;÷
unsigned char pdata bufRxd[64];
extern void Uartaction(unsigned char *buf,unsigned char len);


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 UartWrite(unsigned char *buf,unsigned char len)
{
        while(len--)
        {
                flagTxd=0;
                SBUF=*buf++;
                while(!flagTxd);
        }
}
unsigned char UartRead(unsigned char *buf,unsigned char len)
{
        unsigned char i;
        if(len>cntRxd)
        {
                len=cntRxd;
        }
        for(i=0;i<len;i++)
        {
                *buf++=bufRxd[i];
        }
        cntRxd=0;
       
        return len;
}

void UartRxMonitor(unsigned char ms)
{
        static unsigned char cntbkt=0;   //&#197;D&#182;&#207;′&#174;&#191;úê&#199;·&#241;è&#212;·¢&#203;íêy&#190;Y
        static unsigned char idletmr=0;  //&#188;&#198;ê±&#206;&#187;
        if(cntRxd>0)
        {
                if(cntbkt!=cntRxd)
                {
                        cntbkt=cntRxd;
                        idletmr=0;
                }
                else
                {
                        if(idletmr<30)
                        {
                                idletmr+=ms;
                          if(idletmr>=30)
                          {
                                  flagFrame=1;
                          }
                        }
                }
        }
        else
        {
                cntbkt=0;
        }
}
void Uartdrive()
{
        unsigned char len;
        unsigned char pdata buf[40];
       
        if(flagFrame)
        {
                flagFrame=0;
                len=UartRead(buf,sizeof(buf));
                Uartaction(buf,len);
        }
}
void interruptUART() interrupt 4
{
        if(RI)
        {
                RI=0;
                if(cntRxd<sizeof(bufRxd))
                {
                        bufRxd[cntRxd++]=SBUF;
                }
        }
        if(TI)
        {
                TI=0;
                flagTxd=1;
        }
}


串口 LCD 蜂鸣器.zip

47.34 KB, 下载次数: 248

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

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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