有价值的参考网页主要有 :
https://www.cnblogs.com/AChenWeiqiangA/p/13412185.htmlhttps://www.cnblogs.com/AChenWeiqiangA/p/13412185.htmlhttps://www.cnblogs.com/AChenWeiqiangA/p/13412185.htmlhttps://blog.csdn.net/HURUI123456789/article/details/52248254https://blog.csdn.net/HURUI123456789/article/details/52248254
看过这3个网页基本上就全了。
我的错误包括时钟信号有效的设计,端口电平的设计,大小写的忽略。
时钟有效的正确设计如下。
void LCD_Send_byte(uint8_t a)
{
uint8_t i;
for(i=8;i>0;i--)
{ if(a&0x80) //从高位开始送
{LCD_RW_IO_H;}
else
{LCD_RW_IO_L;}
LCD_E_clk_L;
delay_us(3);
LCD_E_clk_H; //上升沿发送数据
delay_us(3);
a<<=1;
}
}
uint8_t LCD_Read_byte(void)
{
uint8_t i,dat=0;
for(i=8;i>0;i--)
{
LCD_E_clk_L;
delay_us(3);
LCD_E_clk_H;//上升沿接收数据
delay_us(3);
if(LCD_IO_Read()) //输入
{dat|=(0x01<<(i-1));}
}
return dat;
}
端口电平的正确设计如下。错误在于直接拷贝了led电平设计代码,忘记了led点亮是低电平有效,led的亮输出为GPIO_PIN_RESET,LCD12864的高电平应设置为GPIO_PIN_SET。
//led亮需要输出低电平
#define LED1_ON HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_RESET) // 输出高电平
#define LED1_OFF HAL_GPIO_WritePin(LED1_GPIO,LED1_GPIO_PIN,GPIO_PIN_SET) // 输出低电平
//lcd12864 端口电平正确设计
#define LCD_RS_CS_H HAL_GPIO_WritePin(LCD_RS_GPIO,LCD_RS_CS,GPIO_PIN_SET) // 输出高电平
#define LCD_RS_CS_L HAL_GPIO_WritePin(LCD_RS_GPIO,LCD_RS_CS,GPIO_PIN_RESET) // 输出低电平
LCD_WriteData函数定义没有问题,引用的时候写成了Lcd_WriteData,系统提示function declared implicitly,就是大小写的区别。
端口管脚设置代码如下。
//IO初始化
void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
LCD_RS_RCC_CLK_ENABLE();
GPIO_InitStruct.Pin = LCD_RS_CS;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LCD_RS_GPIO, &GPIO_InitStruct);
LCD_RW_RCC_CLK_ENABLE();
GPIO_InitStruct.Pin = LCD_RW_IO;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LCD_RW_GPIO, &GPIO_InitStruct);
LCD_EN_RCC_CLK_ENABLE();
GPIO_InitStruct.Pin = LCD_E_clk;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LCD_E_GPIO, &GPIO_InitStruct);
}
问题现象代码如下。为何LCD_opening函数在main.c中lcd显示正常,放在lcd12864.c中由main调用就是乱码?
void LCD_opening(void)
{
uint8_t str1[]="测力系统";
LCD_display_str(1,1,str1);//x1-4 y1-8
}