微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于LCD1602液晶显示问题,开始正常,第二天就不正常?

关于LCD1602液晶显示问题,开始正常,第二天就不正常?

时间:10-02 整理:3721RD 点击:
我用stc12c5a60s2单片控制1602液晶显示,开始液晶显示都是正常的。设置按键什么的按下显示都是正常的,我将液晶显示在哪里点了一晚上。第二天过来,看到的数据是对的。当我按下设置按钮时,显示就有些乱了,在连续按键。完全就乱掉了,该显示的不显示,不该显示的乱显示。我将换过单片机,换过液晶,程序也重新烧过,以前写的程序也烧过。都显示出乱。硬件没什么好说的,就几个引脚。这个到底是怎么回事啊?望高人们指点迷津啊!小弟在此谢过啦!
sbit E=P2^7;                        //1602使能引脚
sbit RW=P2^6;                //1602读写引脚       
sbit RS=P2^5;                        //1602数据/命令选择引脚
sbit led=P2^4;                        //1602背光led控制位         
sbit set_key=P2^0;                //左1       
sbit add_key=P2^1;                //中间
sbit sub_key=P2^2;                //右1

uchar code num[]   ="0123456789 ";
uchar code start[] ="Set Data Please:Enter>> set_key ";
uchar code mode[]  ="PuT/ZhiN >>>Choose:";
uchar code much[]  ="Business:Cool >>>";       
uchar code state[] ="Set Success:---ChengGong";                  
uchar code coin[]  ="1_Cool--?_bage?=";

void LCD1602()
{
        E=0;
        RS=1;
        RW=1;
        P0=0xff;
}
/*------读忙信号-----*/
void read_busy()
{
        P0=0xff;
        RS=0;
        RW=1;
        E=1;
        while(P0&0x80);
        E=0;
}
/*-------------LCD写命令-----------------*/
void write_com(uchar com)
{
        read_busy();
        E=0;
        RS=0;
        RW=0;
        P0=com;
        delay(10);
        E=1;
        delay(10);
        E=0;               
}
/*-------------写数据-----------------*/
void write_data(uchar dat)
{                       
        read_busy();
        E=0;
        RS=1;
        RW=0;
        P0=dat;
        delay(10);
        E=1;
        delay(10);
        E=0;               
}
/*-------------液晶初始化函数-------------*/
void lcd_init()
{
        delay(30);
        write_com(0x38);
        delay(10);
        write_com(0x38);
        delay(10);
        write_com(0x08);
        delay(10);
        write_com(0x01);
        delay(10);
        write_com(0x06);
        delay(10);
        write_com(0x0c);
        delay(10);
}
/*------------显示设置成功----------*/
void success_display(void)
{
        uchar i;
        write_com(0x01);            //显示清屏
        delay(10);
        write_com(0x80);         //显示在第一行
        for(i=0;i<12;i++)
        {
                write_data(state[i]);
                delay(10);
        }
        write_com(0x80+0x40+4);
        for(i=0;i<12;i++)
        {
                write_data(state[i+12]);
                delay(10);
        }
}

/*--------------模式选择函数-------------*/
void mode_choose(void)
{
        uchar i;
        write_com(0x01);            //显示清屏
        delay(10);                         
        write_com(0x80);         //显示在第一行
        for(i=0;i<12;i++)
        {
                write_data(mode[i]);
                delay(10);
        }                 
        write_com(0x80+0x40);         //显示在第一行
        for(i=0;i<7;i++)
        {
                write_data(mode[i+12]);
                delay(10);
        }
        if(set_mode==0)                          //普通模式
        {                 
                write_com(0x80+0x40+11);         //显示在第一行       
                write_data(start[3]);        //显示空
                delay(10);
                for(i=0;i<3;i++)
                {
                        write_data(mode[i]);
                        delay(10);
                }       
        }
        else
        {                 
                write_com(0x80+0x40+11);         //显示在第一行
                for(i=0;i<4;i++)
                {
                        write_data(mode[i+4]);
                        delay(10);
                }
        }
}                       

               
/*----------延迟1ms函数----------*/
void delay(uint k)
{
        uint i;
        uchar j;
        for(i=0;i<k;i++)
        for(j=0;j<250;j++);
}

是不是有些延时控制的不是很合理啊?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top