小言_互联网的博客

TFTLCD出现白屏、镜像显示、无法显示字符(参考正点原子stm32f103zet6控制TFTLCD显示代码修改成合泰32控制其显示)

309人阅读  评论(0)

一言难尽~

一、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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场