关于LCD的一些经验

段码液晶驱动BL5507

这是在上一家公司做产品的过程中遇到的问题,总共出现两次比较严重的bug
1、液晶运行一段时间之后出现了部分黑屏的显现,起初怪硬件工程师,后来联系了厂家才了解到这个芯片有一个休眠模式,不知道在什么情况的影响下进入了休眠模式,倒是模块不能输出波形,就有了这样的问题。解决方案是通过每次写入数据时都重新配置一次休眠寄存器,使模块推出休眠模式。
2、第二次是模块过一段时间就会出现不能入网,频点乱跳的情况,最后追查原因是因为但是从8530芯片移植过来的代码,没有修改IO导致出现了SX1278不能及时复位。

字符液晶12864

问题描述: 手触碰到模块的接口时,模块会出现乱码,放置一段时间也会出现乱码。 解决思路:起初认为是时许不严格导致的乱码,后来发现是由于PSB引脚没有接地。在手触碰之后模块进入了并口的时许,导致不能正确解析数据。

附一份12864驱动程序

发送一个字节
void LCD_Send( uint8_t  type, uint8_t transdata )
{
    uint8_t firstbyte = 0xf8;
    uint8_t temp;
    uint8_t i, j = 3;
    if( type )
    {
        firstbyte |= 0x02;
    }
    LCD_CS_PORT |= LCD_CS_PIN;
    LCD_CLK_PORT &= ~LCD_CLK_PIN;
    while( j > 0 )
    {
        if( j == 3 )
        {
            temp = firstbyte;
        }
        else if( j == 2 )
        {
            temp = transdata & 0xf0;
        }
        else
        {
            temp = ( transdata << 4 ) & 0xf0;
        }
        for( i = 8; i > 0; i-- )
        {
            if( temp & 0x80 )
            {
                LCD_SDI_PORT |= LCD_SDI_PIN;
            }
            else
            {
                LCD_SDI_PORT &= ~LCD_SDI_PIN;
            }
            LCD_CLK_PORT |= LCD_CLK_PIN;
            temp <<= 1;
            LCD_CLK_PORT &= ~LCD_CLK_PIN;
        }
        //三个字节之间一定要有足够的延时,否则易出现时序问题
        delay_Nus( 72 );
    }
    LCD_SDI_PORT &= ~LCD_SDI_PIN;
    LCD_CS_PORT &= ~LCD_CS_PIN;
}
显示汉子
unsigned char addresses[] = {0x80, 0x90, 0x88, 0x98};
void LCD12864_Display_Chars( unsigned char x, unsigned char y, unsigned char* dat, unsigned char length )
{
    LCD_Send( 0, 0x30 );
    delay_Nus( 72 );
    LCD_Send( 0, 0x02 ); /*DDRAM地址归位*/
    delay_Nus( 72 );
    LCD_Send( 0, addresses[y - 1] );
    while( length-- )
    {
        LCD_Send( 1, *dat );
        dat++;
    }
}
液晶初始化
void LCD_Init()
{
    // 将全部IO设置为输出
    LCD_SDI_DIR |= LCD_SDI_PIN;
    LCD_CLK_DIR |= LCD_CLK_PIN;
    LCD_CS_DIR |= LCD_CS_PIN;
    LCD_RST_DIR |= LCD_RST_PIN;
    LCD_RST_PORT &= ~LCD_RST_PIN;
    delay_Nus( 100 );
    LCD_RST_PORT |= LCD_RST_PIN;
    delay_Nus( 100 );
    LCD_BK_DIR |= LCD_BK_PIN;
    LCD_BK_PORT |= LCD_BK_PIN;
    LCD_POWER_DIR |= LCD_POWER_PIN;
    LCD_POWER_PORT |= LCD_POWER_PIN;
    delay_Nms( 100 ); //延时等待液晶完成复位
    LCD_Send( 0, 0x30 ); /*功能设置:一次送8位数据,基本指令集*/
    delay_Nus( 72 );
    LCD_Send( 0, 0x02 ); /*DDRAM地址归位*/
    delay_Nus( 72 );
    LCD_Send( 0, 0x0c ); /*显示设定:开显示,不显示光标,不做当前显示位反白闪动*/
    delay_Nus( 72 );
    LCD_Send( 0, 0x01 ); /*清屏,将DDRAM的位址计数器调整为“00H”*/
    delay_Nus( 72 );
    LCD_Send( 0, 0x06 ); /*功能设置,点设定:显示字符/光标从左到右移位,DDRAM地址加1*/
    delay_Nus( 72 );
    LCD_MenuInit( 0 );
}
格式化变量
#include <stdarg.h>
int LCD_StrFormat( char* src, char* fmt, ... )
{
    char buffer[64 + 1]; // CMD_BUFFER_LEN
    uint8_t i = 0;
    va_list arg_ptr;
    va_start( arg_ptr, fmt );
    //memset( buffer, 0, 17 );
    vsnprintf( buffer, 64 + 1, fmt, arg_ptr );
    //memcpy(src,buffer,);
    while( i < 64 && buffer[i] )
    {
        src[i] = buffer[i++];
        //HAL_UART_Transmit(&UART1Handle, (uint8_t*)&buffer[i++], 1, 1);
        //while (USART1->SR&(0x40) == 0);
    }
    va_end( arg_ptr );
    return i;
}
​```published: true
hideInList: false
feature: 
isTop: false
如果这篇文章对您很有帮助,不妨
----- 本文结束 ❤ 感谢您的阅读 ----