项目场景:
STM32L431RCT驱动1.44寸TFT屏(ST7735S)移植HAL库
1.问题描述:
移植成功后,有复位不显示的情况,意思是同一段代码,有时候能显示,有时候下载到板子上死活不显示,有一定几率显示
void LCD_Writ_Bus(uint8_t dat)//发送函数,每次传输一个字节
{
LCD_CS_Clr();
HAL_SPI_Transmit(&hspi3, &dat, 1, 100);//调用HAL库自带的发送函数
LCD_CS_Set();
}
原因分析:
当时改了好多地方都没用,最后我又找了一个驱动,移植了一遍,发现了上一个驱动的问题所在,是由于上面的发送函数,没有把复位引脚的电平拉高
解决方案:
所以我们要在发送前添加一条命令,让复位键始终不能被按下
void LCD_Writ_Bus(uint8_t dat)//发送函数,每次传输一个字节
{
LCD_CS_Clr();
LCD_RES_Set();
HAL_SPI_Transmit(&hspi3, &dat, 1, 100);//调用HAL库自带的发送函数
LCD_CS_Set();
}
————————————————————————————
2.问题描述:
解决了问题1的一定几率不显示的问题,新的问题来了,汉字显示不全,代码如下
void LCD_ShowChinese32x32(uint16_t x,uint16_t y,const unsigned char *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
uint8_t i,j;
uint16_t k;
uint16_t HZnum;//汉字数目
uint16_t TypefaceNum;//一个字符所占字节大小
uint16_t x0=x;
TypefaceNum=sizey/8*sizey;//此算法只适用于字宽等于字高,且字高是8的倍数的字,
//也建议用户使用这样大小的字,否则显示容易出问题!
HZnum=sizeof(tfont32)/sizeof(typFNT_GB32); //统计汉字数目
for(k=0;k<HZnum;k++)
{
if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
{
LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
for(i=0;i<TypefaceNum;i++)
{
for(j=0;j<8;j++)
{
if(!mode)//非叠加方式
{
if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
else LCD_WR_DATA(bc);
}
else//叠加方式
{
if(tfont32[k].Msk[i]&(0x01<<j)) LCD_DrawPoint(x,y,fc);//画一个点
x++;
if((x-x0)==sizey)
{
x=x0;
y++;
break;
}
}
}
}
}
s+=2;
x+=sizey;
if(x==128)
{
y+=sizey;
x=0;
}
continue; //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
}
}
原因分析:
上面的代码是可以直接输入汉字字符串显示的,前提是字库里有,我读完代码发现他是通过汉字字符串验证查询字库的,存在一个风险,就是你的操作系统使用的汉字编码是什么,GBK还是UTF-8;这段代码表示的用的GBK的编码,因为他只验证了两个字节,而UTF-8编码中是3字节的,在STM32中也是采用UTF-8编码的,在日常的编码中,UTF-8其实更具有通用性
if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
解决方案:
把汉字查询验证方式改为3字节验证,字库里的汉字字符串也改为3字节储存
void LCD_ShowChinese32x32(uint16_t x,uint16_t y,const unsigned char *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode)
{
uint8_t i,j;
uint16_t k;
uint16_t HZnum;//汉字数目
uint16_t TypefaceNum;//一个字符所占字节大小
uint16_t x0=x;
TypefaceNum=sizey/8*sizey;//此算法只适用于字宽等于字高,且字高是8的倍数的字,
//也建议用户使用这样大小的字,否则显示容易出问题!
HZnum=sizeof(tfont32)/sizeof(typFNT_GB32); //统计汉字数目
for(k=0;k<HZnum;k++)
{
if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1))&&(tfont32[k].Index[2]==*(s+2)))
{
LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
for(i=0;i<TypefaceNum;i++)
{
for(j=0;j<8;j++)
{
if(!mode)//非叠加方式
{
if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
else LCD_WR_DATA(bc);
}
else//叠加方式
{
if(tfont32[k].Msk[i]&(0x01<<j)) LCD_DrawPoint(x,y,fc);//画一个点
x++;
if((x-x0)==sizey)
{
x=x0;
y++;
break;
}
}
}
}
}
s+=3;
x+=sizey;
if(x==128)
{
y+=sizey;
x=0;
}
continue; //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
}
}