一言难尽~
一、TFTLCD显示白屏
可以先看看这篇博客,看能不能解决你的问题
显示屏已亮,那电源接线是肯定没有问题的,硬件连接部分除了复位那里可能存在问题其他大概率是没有问题的,主要是看LCD(TFTLCD以下简称LCD)的驱动程序有无问题,因为这个只是测试能否正常显示,所以主要要看驱动初始化程序。emmm这里要改好多地方,下图的几个函数都要仔细看过。
因为当时就想着怎么解决问题,没有想到要记录每一步错误的解决方法,所以现在只能把自己还记得的写下来了,可能不太清楚,望谅解~
1.1修改读写寄存器
1.1.1为什么要修改读写寄存器
(较啰嗦,不想看的同学可以直接到下面的修改实际操作)
stm32f103zet6(正点原子精英版)是带有 FSMC 接口的。FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和 16 位 PC 存储器卡连接,stm32 的 FSMC 接口支持包括 SRAM、NAND FLASH、NOR FLASH 和 PSRAM 等存储器。下面是FSMC 框图~
从上图我们可以看出,stm32 的 FSMC 将外部设备分为 3 类:NOR/PSRAM 设备、NAND设备、PC 卡设备。他们共用地址数据总线等信号,他们具有不同的 CS 以区分不同的设备,比如我们用到的 TFTLCD 就是用的 FSMC_NE4 做片选,其实就是将 TFTLCD 当成 SRAM 来控制。外部 SRAM 的控制一般有:地址线(如 A0-A18)、数据线(如 D0-D15)、写信号(WE)、读信号(OE)、片选信号(CS),而在操作LCD时需要用到的就只有:RS、D0~D15、WR、RD 和 CS。其操作时序和 SRAM的控制完全类似,唯一不同就是 TFTLCD 有 RS 信号,但是没有地址信号。
stm32f103zet6有FSMC,且是用FSMC来控制LCD显示的,但我们仔细查找资料并观察了HT32实物(32位合泰单片机,以下简称HT32),发现它是没有FSMC接口的,所以我们必须要找其他方式来控制LCD,经过查找资料我们发现是可以通过EBI(外部总线接口)来控制LCD的(学过微机原理的朋友应该看过这里就恍然大悟了),他们的读写寄存器是不一样的,所以我们首先要修改的是读写寄存器。
我们是根据合泰官方提供的LCD的源码(他们的LCD是ESK32-A2A31 – 2.8 inches TFT-LCD Module,我们没有,所以就想用合泰控制正点原子LCD显示)对照着正点原子的来修改~
如下:
1.1.2修改寄存器实际操作
根据LCD的id,只需要找0X9341的即可~
对应得修改,其他函数有的话也要修改~
最终代码(两者函数名也不一样,有两个简单的读写寄存器初始化是我们加进去的)
下面是新加的函数(HT32中有读写合起来的程序,但没有分开的,正点原子两个都有,我们也不知道为什么要加,但加上有用。。所以就加了)
以上就是修改寄存器部分的操作了~
修改完后有显示了
但它是这样显示的。。。
没有字符,只有横线,靓女无语~
1.2修改字体导出变量
忘记怎么改了,可以注意看一下定义的各个变量和常量是应该用32位还是16的,我们后来将大部分都改成16位的了,还有这个字体导出变量
我们是用了以下这个
出现横线大部分可能就是这些问题了
就经过各种操作能显示之后变成了镜像显示。。。当时没有拍到照,下面就说一下我们修改的地方~
二、TFTLCD出现镜像显示解决方法
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/24
//mode:叠加方式(1)还是非叠加方式(0)
有其他方向显示问题的话再调整一下就好啦~下面是最终字符显示的代码
void LCD_CharDisplay(u16 X_Location, u16 Y_Location, u16 Ascii)
{
u16 i = 0, j = 0;
u16 X0= X_Location;
u8 size =24;
u8 csize=(size/8+((size%8)?1:0))*(size/2); //得到字体一个字符对应点阵集所占的字节数
u8 num =Ascii-' ';
u8 temp;
for(i=0;i<csize;i++)
{
temp=asc2_1608[num][i];
for(j=0;j<8;j++)
{
if(temp&0x80)
{
LCD_WR_REG(REG42);
LCD_WR_DATA(X_Location>>8);LCD_WR_DATA(X_Location&0XFF);
LCD_WR_REG(REG43);
LCD_WR_DATA(Y_Location>>8);LCD_WR_DATA(Y_Location&0XFF);
EBI_LCD->EBI_LCD_REG=REG44;
EBI_LCD->EBI_LCD_RAM=Color_Text;
}else
{
LCD_WR_REG(REG42);
LCD_WR_DATA(X_Location>>8);LCD_WR_DATA(X_Location&0XFF);
LCD_WR_REG(REG43);
LCD_WR_DATA(Y_Location>>8);LCD_WR_DATA(Y_Location&0XFF);
EBI_LCD->EBI_LCD_REG=REG44;
EBI_LCD->EBI_LCD_RAM=Color_Back;
}
temp<<=1;
X_Location++;
if((X_Location-X0)==size)
{
X_Location=X0;
Y_Location++;
break;
}
}
}
}
最后终于正常显示了~呜呜呜
吐槽一下:TFTLCD的显示可比LCD1602的好设置多了,TFTLCD的只需要设置在哪一行显示即可,LCD1602要几个字符几个字符地定义,这里的代码量就相对大了许多~
希望我讲清楚了,你看明白了!希望以上知识对大家有帮助~
我是菜鸟,以上内容如有错误,还希望各位大佬指正,谢谢!
转载:https://blog.csdn.net/weixin_45870610/article/details/116380751