段码液晶驱动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
如果这篇文章对您很有帮助,不妨
----- 本文结束 ❤ 感谢您的阅读 ----
上一篇
Linux 安装CH340驱动
下一篇
对上一家公司的一些总结
- 本文作者: Memory
- 本文链接: https://www.mzpkz.top/post/2019-06-06/
- 版权声明: 本博客所有文章除特别声明外,转载请注明出处!