[STM32]

LCD2002开机显示偶尔乱码

[复制链接]
1011|5
手机看帖
扫描二维码
随时随地手机跟帖
muzili588|  楼主 | 2019-1-2 13:38 | 显示全部楼层 |阅读模式
#define adress_1602 0x4e  
unsigned char   ack1;
unsigned char LCD_data=0x08;

void Start()
{
            SDA1=1;
            _nop_();
            SCL1=1;
            nop4();
            SDA1=0;
            nop4();
            SCL1=0;
            _nop_();
            _nop_();
}

void Stop()
{
            SDA1=0;
            _nop_();
            SCL1=0;
            nop4();//>4us后SCL跳变
            SCL1=1;
            nop4();
            SDA1=1;
            _nop_();
            _nop_();
}
void  Write_A_Byte(unsigned char c)
{
         unsigned char BitCnt;
          for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
            {
             if((c<<BitCnt)&0x80)  SDA1=1;   //判断发送位
             else  SDA1=0;               
             _nop_();
             SCL1=1;               //置时钟线为高,通知被控器开始接收数据位
             nop4();
             _nop_();      
             SCL1=0;
            }  
            _nop_();
            _nop_();
            SDA1=1;               //8位发送完后释放数据线,准备接收应答位
            _nop_();
            _nop_();  
            SCL1=1;
            _nop_();
            _nop_();
            _nop_();
            if(SDA1==1)
                ack1=0;     
            else        
                ack1=1;        //判断是否接收到应答信号                    
            SCL1=0;
            _nop_();
                _nop_();
}

相关帖子

muzili588|  楼主 | 2019-1-2 13:40 | 显示全部楼层
unsigned char Write_Random_Address_Byte(unsigned char add,unsigned char dat)
{
            Start();    //启动总线
            Write_A_Byte(add); //发送器件地址
            if(ack1==0)return(0);
            Write_A_Byte(dat);   //发送数据
            if(ack1==0)return(0);
            Stop(); //结束总线
            return(1);
}
void Enable_LCD_write()
{
            LCD_data|=(1<<(3-1));//E=1;
            Write_Random_Address_Byte(adress_1602,LCD_data);  //
            delay_nus(2);
            LCD_data&=~(1<<(3-1));//E=0;
            Write_Random_Address_Byte(adress_1602,LCD_data);
}
void LCD_Write_Com(unsigned char command)
{
            delay_nus(16);
            LCD_data&=~(1<<(1-1));//RS=0;
            LCD_data&=~(1<<(2-1));//RW=0;
            //LCD_data&=~(1<<(4-1));
            Write_Random_Address_Byte(adress_1602,LCD_data);

            LCD_data&=0X0f; //清高四位
            LCD_data|=command & 0xf0; //写高四位
            Write_Random_Address_Byte(adress_1602,LCD_data);
            Enable_LCD_write();

            command=command<<4; //低四位移到高四位
            LCD_data&=0x0f; //清高四位
            LCD_data|=command&0xf0; //写低四位
            Write_Random_Address_Byte(adress_1602,LCD_data);
            Enable_LCD_write();
}
void LCD_Write_Data(unsigned char value)
{
            delay_nus(16);
            LCD_data|=(1<<(1-1));//RS=1;
            LCD_data&=~(1<<(2-1));//RW=0;
            Write_Random_Address_Byte(adress_1602,LCD_data);

            LCD_data&=0X0f; //清高四位
            LCD_data|=value&0xf0; //写高四位
            Write_Random_Address_Byte(adress_1602,LCD_data);
            Enable_LCD_write();         

            value=value<<4; //低四位移到高四位
            LCD_data&=0x0f; //清高四位
            LCD_data|=value&0xf0; //写低四位
            Write_Random_Address_Byte(adress_1602,LCD_data);
            Enable_LCD_write();
}
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
delay_nms(2);
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *dat,uint8 lg)
{
        uint8 i;
#if 1
         if (y == 0)
            {     
             LCD_Write_Com(0x80 + x);     //表示第一行
            }
         else
            {      
            LCD_Write_Com(0xC0 + x);      //表示第二行
            }  
         for(i=0;i<lg && *dat!='\0';i++)
        {
                LCD_Write_Data(*(dat++));
        }
#endif
}
void LCD_Init(void)
{
    LCD_Write_Com(0x02);
    delay_nus(40);
    LCD_Write_Com(0x28); //4位显示!!!!!!!!!!!!!!!!!!
    LCD_Write_Com(0x0c); //显示开
    LCD_Write_Com(0x01); //清屏
    delay_nms(10);
}


使用特权

评论回复
muzili588|  楼主 | 2019-1-2 13:41 | 显示全部楼层
希望大神们看下代码是否有问题,用两个IO口接8574来驱动LCD2002的。

使用特权

评论回复
lisingch| | 2019-1-2 13:49 | 显示全部楼层
查查时序

使用特权

评论回复
handlike| | 2019-1-2 18:13 | 显示全部楼层
上电后延时,电压都稳定后再写LCD等等

使用特权

评论回复
muzili588|  楼主 | 2019-1-2 19:46 | 显示全部楼层
handlike 发表于 2019-1-2 18:13
上电后延时,电压都稳定后再写LCD等等

好的,我在检查一下,谢谢啦。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

40

帖子

0

粉丝