关于TFT LCD屏ST7735S驱动移植STM32HAL库的部分问题总结

项目场景:

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;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
	}
}

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值