你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32学习笔记10—TFTLCD显示实验

[复制链接]
STMCU-管管 发布时间:2020-11-25 17:18
STM32学习笔记10—TFTLCD显示实验


10.1 概述
       之前在51为核心的系统里面,常用的显示器件有LED,数码管,LCD1602和LCD12864,这些器件都有一个共同的特点,那就是只有一个颜色,没有办法显示彩色图片,为了显示彩色图片,我们引入了TFT显示模组。TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:ThinFilmTransistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。


       目前常用的TFT显示模组按照接口类型可以分为MCU屏幕与RGB屏幕,其中MCU在STM32F1系列中比较常用,原因是MCU屏幕内部集成了显示控制器,只需要按照手册指定的协议将输入发送过去即可,但是MCU屏幕受限于屏幕尺寸,一般不会超过4.3英寸,RGB屏幕内部没有控制器,需要单片机或者CPU自带控制器,但是RGB屏幕尺寸较大,且刷新速度快,通用性强,在生活中使用的更广泛,由于STM32F1单片机中没有RGB控制器(LTDC模块),所以采用核心为5510的TFT屏幕来进行TFT显示实验。


注:我们在网上看到的大尺寸MCU屏幕一般都是以屏幕+PCB的形式,这是因为板子上携带了8080并口转RGB芯片,所以这种情况下,也可以使用MCU屏幕的驱动方式来进行驱动。


10.2 TFTLCD模块原理图
10.2.1 接口描述
       以2.8英寸TFT为例,实物图片如下图所示。
11.png
10.2.2 原理图
12.png


RST:复位端口,高电平有效
CS:片选,低电平有效
RS:数据命令选择,低电平代表命令,高电平代表数据
WR:写控制,高电平有效
RD:读控制,高电平有效
DB0~DB15:16位并行数据口
VCC:电源正极
GND:电源负极
LEDK:背光LED负极
LEDA:背光LED正极
Y-:触摸屏Y轴数据
X-:触摸屏X轴数据
Y+:触摸屏Y轴数据
X+:触摸屏X轴数据


10.3 FSMC
10.3.1 FSMC简介
       FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32F1的FSMC接口支持包括SRAM、NANDFLASH、NOR FLASH和PSRAM等存储器。一般大容量,且引脚数目在100脚及以上的 STM32F103芯片都带有FSMC接口,FSMC的框图如图所示。
13.png
    从上图可知,STM32的FSMC将设备分为3种:NOR/PSRAM设备,NAND设备和PC设备,共用地址数据总线等信号,通过CS端口来区分不同的设备,比如我们这个实验中LCD的片选就是接在FSMC_NE4端口上,其实本质上就是把TFTLCD作为SRAM来控制。


       外部SRAM设备的连接一般有地址线(A0~A18),数据线(D0~D15),写信号(WR),读信号(RD)和片选,TFTLCD显然除了不具备地址线,其他的信号都是具备的,所以我们可以采用SRAM的方式来进行TFT的控制,这种控制方式的好处就是对比传统的GPIO翻转可以更快的将数据送入TFT。


       STM32F1的FSMC支持8/16/32位数据宽度,我们的TFT模块采用的是16位数据宽度,所以只需要将FSMC配置为外置16位宽度即可。FSMC的外部存储器划分为了固定的4个256 M的存储块,如下图所示。
14.png
    我们在驱动TFTLCD的时候,用到的存储块是块1,STM32将FSMC的存储块1分为4个区,每个区管理64M的空间,每个区都有独立的寄存器对连接的存储器进行配置,BANK1的256M空间由28根地址线寻址,这28根地址线如下表所示,其中低26个位来自外部存储器的地址,我们可以将TFTLCD的片选接在低26位上,通过发送地址来选中片选,只有高2位才是内部可以控制的。
15.png
注:

当Bank1接的是16位宽度存储器的时候:地址线的[25:1]对应FSMC_A[24:0]
当Bank1接的是8位宽度存储器的时候:地址线的[25:0]对应FSMC_A[25:0]


       对于NOR FLASH控制器,主要通过3个寄存器来设置FSMC的时序参数,NORFLASH控制器支持同步和异步突发两种访问方式。

       选用同步突发访问方式时,FSMC将系统时钟分频后,发送给外部存储器作为同步时钟信号 FSMC_CLK。此时需要的设置的时间参数有2个,即系统时钟HCLK与FSMC_CLK的分频系数(可以2~16分频),同步突发访问中获取第一个数据所需要的等待延迟。

       选用异步突发访问方式时,则需要设置3个时间参数:地址建立时间、数据建立时间和地址保持时间。FSMC综合了SRAM/ROM、PSRAM和NOR Flash产品的信号特点,定义了4种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时序参数。

       在实际扩展时,根据选用存储器的特征确定时序模型,从而确定各时间参数与存储器读/写周期参数指标之间的计算关系,利用该计算关系和存储芯片数据手册中给定的参数指标,可计算出FSMC所需要的各时间参数,从而对时间参数寄存器进行合理的配置。

       我们现在使用异步模式A方式来控制LCD,模式A的读操作时序如下图所示。
16.png
    模式A支持独立的读写时序控制,这个对驱动TFTLCD来说非常有用,因为TFTLCD在读的时候,一般比较慢,而在写的时候可以比较快,如果读写用一样的时序,那么只能以读的时序为基准,从而导致写的速度变慢,或者在读数据的时候,重新配置FSMC的延时,在读操作完成的时候,再配置回写的时序,这样虽然也不会降低写的速度,但是频繁配置,比较麻烦。而如果有独立的读写时序控制,那么我们只要初始化的时候配置好,之后就不用再配置,既可以满足速度要求,又不需要频繁改配置。


       模式A的写操作如下图所示。
17.png
10.3.2 相关寄存器

(1)SRAM/NOR 闪存片选控制寄存器:FSMC_BCRx(x=1~4)
Bit 19:成组写使能位


       0:写操作始终处于异步模式


       1:写操作为同步模式


Bit 14:EXTMOD:扩展模式使能(即允许读和写使用不同的时序)


       0:不使用FSMC_BWTR寄存器(默认)
       1:FSMC使用FSMC_BWTR寄存器
Bit 13:等待使能位
       0:禁用NWAIT信号,在设置的闪存保持周期之后不会检测NWAIT信号插入等待状态
       1:使用NWAIT信号,在设置的闪存保持周期之后根据NWAIT信号插入等待状态(默认)
Bit 12:写使能位
       0:禁止FSMC对存储器的写操作,否则产生一个AHB错误
       1:允许FSMC对存储器的写操作(默认)
Bit 11:配置等待时序
       0:NWAIT信号在等待状态前的一个数据周期有效(默认)
       1:NWAIT信号在等待状态期间有效(不适用于Cellular RAM)
Bit 10:支持非对齐的成组模式
       0:不允许直接的非对齐成组操作(默认)
       1:允许直接的非对齐成组操作
Bit 9:等待信号极性
       0:NWAIT等待信号为低时有效(默认)
       1:NWAIT等待信号为高时有效
Bit 8:成组模式使能
       0:禁用成组访问模式(默认)
       1:使用成组访问模式
Bit 6:闪存访问使能
       0:禁止对NOR闪存存储器的访问操作
       1:允许对NOR闪存存储器的访问操作
Bit 5~Bit 4:存储器数据总线宽度
      00:8位,
       01:16位(默认)
       10:保留
       11:保留
Bit 3~Bit 2:存储器类型
       00:SRAM、ROM(存储器块2,3,4在复位后的默认值)
       01:PSRAM(Cellular RAM: CRAM)
       10:NOR闪存(存储器块1在复位后的默认值)
       11:保留
Bit 1:地址/数据复用使能位
       0:地址/数据不复用。
       1:地址/数据复用数据总线(默认)
Bit 0:存储器块使能位
       0:禁用对应的存储器块
       1:启用对应的存储器块
(2)SRAM/NOR 闪存片选时序寄存器:FSMC_BTRx(x=1~4)


Bit 29~Bit 28:访问模式(这2位只在FSMC_BCRx寄存器的EXTMOD位为1时起作用)


       00:访问模式A
       01:访问模式B
       10:访问模式C
       11:访问模式D
Bit 27~Bit 24:数据保持时间

       0000:第一个数据的保持时间为2个CLK时钟周期
       ……

       1111:第一个数据的保持时间为17个CLK时钟周期(默认)

Bit 23~Bit 20:时钟分频比

       0000:保留

       0001:1个CLK周期=2个HCLK周期

       0010:1个CLK周期=3个HCLK周期

       ……

       1111:1个CLK周期=16个HCLK周期(默认)

Bit 19~Bit 16:总线恢复时间

       0000:总线恢复时间=1个HCLK时钟周期
       ……

       1111:总线恢复时间=16个HCLK时钟周期(默认)

Bit 15~Bit 8:数据保持时间

       00000000:保留

       00000001:DATAST保持时间=2个HCLK时钟周期

       00000010:DATAST保持时间=3个HCLK时钟周期

       ……

       11111111:DATAST保持时间=256个HCLK时钟周期(默认)

Bit 7~Bit 4:地址保持时间

       0000:ADDHLD保持时间=1个HCLK时钟周期

       ……

       1111:ADDHLD保持时间=16个HCLK时钟周期(默认)

Bit 3~Bit 0:地址建立时间

       0000:ADDSET建立时间=1个HCLK时钟周期
      ……

       1111:ADDSET建立时间=16个HCLK时钟周期(默认)

(3)SRAM/NOR 闪存写时序寄存器:FSMC_BWTRx(x=1~4)


Bit 29~Bit 28:访问模式(这2位只在FSMC_BCRx寄存器的EXTMOD位为1时起作用)


       00:访问模式A
       01:访问模式B
       10:访问模式C
       11:访问模式D

Bit 27~Bit 24:数据保持时间

       0000:第一个数据的保持时间为2个CLK时钟周期
      ……
       1111:第一个数据的保持时间为17个CLK时钟周期(默认)

Bit 23~Bit 20:时钟分频比
       0000:保留
       0001:1个CLK周期=2个HCLK周期
       0010:1个CLK周期=3个HCLK周期
       ……
       1111:1个CLK周期=16个HCLK周期(默认)
Bit 19~Bit 16:总线恢复时间
       0000:总线恢复时间=1个HCLK时钟周期
       ……
       1111:总线恢复时间=16个HCLK时钟周期(默认)
Bit 15~Bit 8:数据保持时间
       00000000:保留
       00000001:DATAST保持时间=2个HCLK时钟周期
       00000010:DATAST保持时间=3个HCLK时钟周期
       ……
       11111111:DATAST保持时间=256个HCLK时钟周期(默认)
Bit 7~Bit 4:地址保持时间

       0000:ADDHLD保持时间=1个HCLK时钟周期
       ……

       1111:ADDHLD保持时间=16个HCLK时钟周期(默认)
Bit 3~Bit 0:地址建立时间
       0000:ADDSET建立时间=1个HCLK时钟周期
       ……

       1111:ADDSET建立时间=16个HCLK时钟周期(默认)

10.4 实验例程
       现有一块驱动芯片为5510的LCD驱动芯片,厂家提供初始化例程,使用STM32的FSMC功能驱动屏幕显示字符串,连接关系如下表所示。

片选CS:FSMC_NE4

写控制WR:FSMC_NWE

读控制RD:FSMC_NOE

数据命令控制RS:FSMC_A6

背光:PB0

16位并行数据:FSMC_D15~FSMC_D0

(1)创建lcd.h,并输入以下代码。

  1. #ifndef _LCD_H_
  2. #define _LCD_H_
  3. #include "sys.h"
  4. //LCD地址结构体
  5. typedef struct
  6. {
  7.   vu16 LCD_REG ;
  8.   vu16 LCD_RAM ;
  9. }LCD_TypeDef ;
  10. #define LCD_BASE    ( ( u32 )( 0x6C000000|0x000007FE ))
  11. #define LCD        ( ( LCD_TypeDef* ) LCD_BASE )
  12. //LCD重要参数集
  13. typedef struct  
  14. {                        
  15.   u16 width ;                    //LCD宽度
  16.   u16 height ;                    //LCD高度
  17.   u8 dir ;                      //横屏竖屏控制
  18.   u16 wramcmd ;                  //开始写gram指令
  19.   u16 setxcmd ;                    //设置x坐标指令
  20.   u16 setycmd ;                    //设置y坐标指令
  21. }_lcd_dev ;
  22. extern _lcd_dev lcddev ;                  //管理LCD重要参数
  23. //LCD的画笔颜色和背景色
  24. extern u16 POINT_COLOR ;                  //画笔颜色
  25. extern u16 BACK_COLOR ;                  //背景颜色
  26. #define  LCD_LED PBout(0)                  //LCD背光
  27. //画笔颜色
  28. #define WHITE            0xFFFF
  29. #define BLACK            0x0000   
  30. #define BLUE            0x001F  
  31. #define BRED             0XF81F
  32. #define GRED        0XFFE0
  33. #define GBLUE       0X07FF
  34. #define RED              0xF800
  35. #define MAGENTA          0xF81F
  36. #define GREEN            0x07E0
  37. #define CYAN             0x7FFF
  38. #define YELLOW           0xFFE0
  39. #define BROWN        0XBC40              //棕色
  40. #define BRRED        0XFC07              //棕红色
  41. #define GRAY         0X8430              //灰色
  42. void LCD_Init( void ) ;                    //初始化
  43. void LCD_Clear( u16 Color ) ;                //清屏
  44. void LCD_Fast_DrawPoint( u16 x, u16 y, u16 color ) ;      //快速画点
  45. void LCD_ShowString( u16 x, u16 y, u8 *p ) ;          //显示一个字符串
  46. #endif
复制代码

注1:关于LCD_BASE地址的定义部分,其中0x6C000000代表FSMC的SRAM块4的开始地址,0x000007FE则代表A10的偏移地址,7FE H换算成2进制就是01111111 1110,由于FSMC在16位数据总线状态下,地址需要右移一个字节,所以映射到A10~A0上的地址数据就是011 1111 1111,A0恰好就是0,如果此时16位地址加1,对应的8位地址就是加2,也就是7FE+2=800,映射到A10~A0上的地址就是100 0000 0000,即A10变为了1,这就实现了通过A10来控制RS的效果。我们定义的结构体也可以发现,LCD_REG对应的就是0x6C000000+0x000007FE,而LCD_RAM对应的就变成了0x6C000000+0x000007FE+0x00000002。


注2:结构体_lcd_dev则定义了一些LCD参数,比如高度,宽度,设置命令,可以通过改变宏定义的方式来改变控制器的输出。


注3:颜色数据。


       目前的颜色数据都有RGB888,RGB666和RGB565格式,代表了R,G和B的分辨率,其中RGB888代表红,绿,蓝都是8位,可以表示16777216种颜色,但是受制于TFTLCD的数据总线宽度只有16位,所以只能够采用RGB565模式,这种模式代表红色和蓝色都是5位分辨率,绿色6位分辨率,这种模式中可以最多表示65536种颜色。文件中宏定义的颜色数据就是根据RGB888格式转换而来,一般都是放弃低2位和低1位,例如RGB888模式中某种颜色为11011110 11011110 11011111,那么转换为RGB565模式就变成了11011 110111 11011,换成16进制就是1101 1110 1111 1011=DEFB H。



(2)创建lcd.c,并添加以下代码。

  1. #include "lcd.h"
  2. #include "font.h"
  3. #include "delay.h"
  4. void LCD_WriteReg( u16 LCD_Reg, u16 LCD_RegValue )
  5. {  
  6.   LCD->LCD_REG = LCD_Reg ;              //写入寄存器序号
  7.   LCD->LCD_RAM = LCD_RegValue ;            //写入数据
  8. }
  9. _lcd_dev lcddev ;                      //管理LCD重要参数
  10. void LCD_SetCursor( u16 Xpos, u16 Ypos )
  11. {
  12.   LCD_WriteReg( lcddev.setxcmd, Xpos>>8 ) ;
  13.   LCD_WriteReg( lcddev.setxcmd+1, Xpos&0xFF ) ;
  14.   LCD_WriteReg( lcddev.setycmd, Ypos>>8 ) ;
  15.   LCD_WriteReg( lcddev.setycmd+1, Ypos&0xFF ) ;
  16. }
  17. void LCD_Display_Dir()
  18. {
  19.   u16 temp;
  20.   lcddev.wramcmd = 0x2C00 ;
  21.   lcddev.setxcmd = 0x2A00 ;
  22.   lcddev.setycmd = 0x2B00 ;
  23.   lcddev.width = 480 ;
  24.   lcddev.height = 800 ;
  25.   //交换X,Y
  26.   if( lcddev.width>lcddev.height )
  27.   {
  28.     temp = lcddev.width ;
  29.     lcddev.width = lcddev.height ;
  30.     lcddev.height = temp ;
  31.   }
  32.   //设置扫描方向
  33.   LCD_WriteReg( 0x3600, 0 ) ;
  34.   LCD_WriteReg( lcddev.setxcmd, 0 ) ;
  35.   LCD_WriteReg( lcddev.setxcmd+1, 0 ) ;
  36.   LCD_WriteReg( lcddev.setxcmd+2, ( lcddev.width-1 )>>8 ) ;
  37.   LCD_WriteReg( lcddev.setxcmd+3, ( lcddev.width-1 )&0xFF ) ;
  38.   LCD_WriteReg( lcddev.setycmd, 0 ) ;
  39.   LCD_WriteReg( lcddev.setycmd+1, 0 ) ;
  40.   LCD_WriteReg( lcddev.setycmd+2, ( lcddev.height-1 )>>8 ) ;
  41.   LCD_WriteReg( lcddev.setycmd+3, ( lcddev.height-1 )&0xFF ) ;
  42. }
  43. void LCD_Init()
  44. {
  45.   RCC->AHBENR |= 1<<8 ;                  //使能FSMC时钟
  46.     RCC->APB2ENR |= 1<<3 ;                  //使能PORTB时钟
  47.   RCC->APB2ENR |= 1<<5 ;                  //使能PORTD时钟
  48.   RCC->APB2ENR |= 1<<6 ;                  //使能PORTE时钟
  49.    RCC->APB2ENR |= 1<<8 ;                  //使能PORTG时钟
  50.   GPIOB->CRL &= 0xFFFFFFF0 ;                //PB0 推挽输出
  51.   GPIOB->CRL |= 0x00000003 ;
  52.   //PORTD复用推挽输出
  53.   GPIOD->CRH &= 0x00FFF000 ;
  54.   GPIOD->CRH |= 0xBB000BBB ;
  55.   GPIOD->CRL &= 0xFF00FF00 ;
  56.   GPIOD->CRL |= 0x00BB00BB ;
  57.   //PORTE复用推挽输出
  58.   GPIOE->CRH &= 0x00000000 ;
  59.   GPIOE->CRH |= 0xBBBBBBBB ;
  60.   GPIOE->CRL &= 0x0FFFFFFF ;
  61.   GPIOE->CRL |= 0xB0000000 ;
  62.   //PORTG12复用推挽输出
  63.   GPIOG->CRH &= 0xFFF0FFFF ;
  64.   GPIOG->CRH |= 0x000B0000 ;
  65.   GPIOG->CRL &= 0xFFFFFFF0 ;                //PG0->RS
  66.   GPIOG->CRL |= 0x0000000B ;
  67.   FSMC_Bank1->BTCR[ 6 ] = 0x00000000 ;
  68.   FSMC_Bank1->BTCR[ 7 ] = 0x00000000 ;
  69.   FSMC_Bank1E->BWTR[ 6 ] = 0x00000000 ;
  70.   FSMC_Bank1->BTCR[ 6 ] |= 1<<12 ;              //存储器写使能
  71.   FSMC_Bank1->BTCR[ 6 ] |= 1<<14 ;              //读写使用不同的时序
  72.   FSMC_Bank1->BTCR[ 6 ] |= 1<<4 ;              //存储器数据宽度为16bit
  73.   FSMC_Bank1->BTCR[ 7 ] |= 0<<28 ;              //模式A
  74.   FSMC_Bank1->BTCR[ 7 ] |= 1<<0 ;              //地址建立时间为2个HCLK 1/36M=27ns
  75.   FSMC_Bank1->BTCR[ 7 ] |= 0xF<<8 ;              //数据保存时间为16个HCLK
  76.   FSMC_Bank1E->BWTR[ 6 ] |= 0<<28 ;            //模式A
  77.   FSMC_Bank1E->BWTR[ 6 ] |= 0<<0 ;              //地址建立时间为1个HCLK
  78.   FSMC_Bank1E->BWTR[ 6 ] |= 3<<8 ;              //数据保存时间为4个HCLK
  79.   FSMC_Bank1->BTCR[ 6 ] |= 1<<0 ;              //使能BANK1区域4
  80.   delay_ms( 50 ) ;                      //delay 50 ms
  81.   LCD_WriteReg( 0xF000, 0x55 ) ;
  82.   LCD_WriteReg( 0xF001, 0xAA ) ;
  83.   LCD_WriteReg( 0xF002, 0x52 ) ;
  84.   LCD_WriteReg( 0xF003, 0x08 ) ;
  85.   LCD_WriteReg( 0xF004, 0x01 ) ;
  86.   //AVDD Set AVDD 5.2V
  87.   LCD_WriteReg( 0xB000, 0x0D ) ;
  88.   LCD_WriteReg( 0xB001, 0x0D ) ;
  89.   LCD_WriteReg( 0xB002, 0x0D ) ;
  90.   //AVDD ratio
  91.   LCD_WriteReg( 0xB600, 0x34 ) ;
  92.   LCD_WriteReg( 0xB601, 0x34 ) ;
  93.   LCD_WriteReg( 0xB602, 0x34 ) ;
  94.   //AVEE -5.2V
  95.   LCD_WriteReg( 0xB100, 0x0D ) ;
  96.   LCD_WriteReg( 0xB101, 0x0D ) ;
  97.   LCD_WriteReg( 0xB102, 0x0D ) ;
  98.   //AVEE ratio
  99.   LCD_WriteReg( 0xB700, 0x34 ) ;
  100.   LCD_WriteReg( 0xB701, 0x34 ) ;
  101.   LCD_WriteReg( 0xB702, 0x34 ) ;
  102.   //VCL -2.5V
  103.   LCD_WriteReg( 0xB200, 0x00 ) ;
  104.   LCD_WriteReg( 0xB201, 0x00 ) ;
  105.   LCD_WriteReg( 0xB202, 0x00 ) ;
  106.   //VCL ratio
  107.   LCD_WriteReg( 0xB800, 0x24 ) ;
  108.   LCD_WriteReg( 0xB801, 0x24 ) ;
  109.   LCD_WriteReg( 0xB802, 0x24 ) ;
  110.   //VGH 15V
  111.   LCD_WriteReg( 0xBF00, 0x01 ) ;
  112.   LCD_WriteReg( 0xB300, 0x0F ) ;
  113.   LCD_WriteReg( 0xB301, 0x0F ) ;
  114.   LCD_WriteReg( 0xB302, 0x0F ) ;
  115.   //VGH ratio
  116.   LCD_WriteReg( 0xB900, 0x34 ) ;
  117.   LCD_WriteReg( 0xB901, 0x34 ) ;
  118.   LCD_WriteReg( 0xB902, 0x34 ) ;
  119.   //VGL_REG -10V
  120.   LCD_WriteReg( 0xB500, 0x08 ) ;
  121.   LCD_WriteReg( 0xB501, 0x08 ) ;
  122.   LCD_WriteReg( 0xB502, 0x08 ) ;
  123.   LCD_WriteReg( 0xC200, 0x03 ) ;
  124.   //VGLX ratio
  125.   LCD_WriteReg( 0xBA00, 0x24 ) ;
  126.   LCD_WriteReg( 0xBA01, 0x24 ) ;
  127.   LCD_WriteReg( 0xBA02, 0x24 ) ;
  128.   //VGMP/VGSP 4.5V/0V
  129.   LCD_WriteReg( 0xBC00, 0x00 ) ;
  130.   LCD_WriteReg( 0xBC01, 0x78 ) ;
  131.   LCD_WriteReg( 0xBC02, 0x00 ) ;
  132.   //VGMN/VGSN -4.5V/0V
  133.   LCD_WriteReg( 0xBD00, 0x00 ) ;
  134.   LCD_WriteReg( 0xBD01, 0x78 ) ;
  135.   LCD_WriteReg( 0xBD02, 0x00 ) ;
  136.   //VCOM
  137.   LCD_WriteReg( 0xBE00, 0x00 ) ;
  138.   LCD_WriteReg( 0xBE01, 0x64 ) ;
  139.   //Gamma Setting
  140.   LCD_WriteReg( 0xD100, 0x00 ) ;
  141.   LCD_WriteReg( 0xD101, 0x33 ) ;
  142.   LCD_WriteReg( 0xD102, 0x00 ) ;
  143.   LCD_WriteReg( 0xD103, 0x34 ) ;
  144.   LCD_WriteReg( 0xD104, 0x00 ) ;
  145.   LCD_WriteReg( 0xD105, 0x3A ) ;
  146.   LCD_WriteReg( 0xD106, 0x00 ) ;
  147.   LCD_WriteReg( 0xD107, 0x4A ) ;
  148.   LCD_WriteReg( 0xD108, 0x00 ) ;
  149.   LCD_WriteReg( 0xD109, 0x5C ) ;
  150.   LCD_WriteReg( 0xD10A, 0x00 ) ;
  151.   LCD_WriteReg( 0xD10B, 0x81 ) ;
  152.   LCD_WriteReg( 0xD10C, 0x00 ) ;
  153.   LCD_WriteReg( 0xD10D, 0xA6 ) ;
  154.   LCD_WriteReg( 0xD10E, 0x00 ) ;
  155.   LCD_WriteReg( 0xD10F, 0xE5 ) ;
  156.   LCD_WriteReg( 0xD110, 0x01 ) ;
  157.   LCD_WriteReg( 0xD111, 0x13 ) ;
  158.   LCD_WriteReg( 0xD112, 0x01 ) ;
  159.   LCD_WriteReg( 0xD113, 0x54 ) ;
  160.   LCD_WriteReg( 0xD114, 0x01 ) ;
  161.   LCD_WriteReg( 0xD115, 0x82 ) ;
  162.   LCD_WriteReg( 0xD116, 0x01 ) ;
  163.   LCD_WriteReg( 0xD117, 0xCA ) ;
  164.   LCD_WriteReg( 0xD118, 0x02 ) ;
  165.   LCD_WriteReg( 0xD119, 0x00 ) ;
  166.   LCD_WriteReg( 0xD11A, 0x02 ) ;
  167.   LCD_WriteReg( 0xD11B, 0x01 ) ;
  168.   LCD_WriteReg( 0xD11C, 0x02 ) ;
  169.   LCD_WriteReg( 0xD11D, 0x34 ) ;
  170.   LCD_WriteReg( 0xD11E, 0x02 ) ;
  171.   LCD_WriteReg( 0xD11F, 0x67 ) ;
  172.   LCD_WriteReg( 0xD120, 0x02 ) ;
  173.   LCD_WriteReg( 0xD121, 0x84 ) ;
  174.   LCD_WriteReg( 0xD122, 0x02 ) ;
  175.   LCD_WriteReg( 0xD123, 0xA4 ) ;
  176.   LCD_WriteReg( 0xD124, 0x02 ) ;
  177.   LCD_WriteReg( 0xD125, 0xB7 ) ;
  178.   LCD_WriteReg( 0xD126, 0x02 ) ;
  179.   LCD_WriteReg( 0xD127, 0xCF ) ;
  180.   LCD_WriteReg( 0xD128, 0x02 ) ;
  181.   LCD_WriteReg( 0xD129, 0xDE ) ;
  182.   LCD_WriteReg( 0xD12A, 0x02 ) ;
  183.   LCD_WriteReg( 0xD12B, 0xF2 ) ;
  184.   LCD_WriteReg( 0xD12C, 0x02 ) ;
  185.   LCD_WriteReg( 0xD12D, 0xFE ) ;
  186.   LCD_WriteReg( 0xD12E, 0x03 ) ;
  187.   LCD_WriteReg( 0xD12F, 0x10 ) ;
  188.   LCD_WriteReg( 0xD130, 0x03 ) ;
  189.   LCD_WriteReg( 0xD131, 0x33 ) ;
  190.   LCD_WriteReg( 0xD132, 0x03 ) ;
  191.   LCD_WriteReg( 0xD133, 0x6D ) ;
  192.   LCD_WriteReg( 0xD200, 0x00 ) ;
  193.   LCD_WriteReg( 0xD201, 0x33 ) ;
  194.   LCD_WriteReg( 0xD202, 0x00 ) ;
  195.   LCD_WriteReg( 0xD203, 0x34 ) ;
  196.   LCD_WriteReg( 0xD204, 0x00 ) ;
  197.   LCD_WriteReg( 0xD205, 0x3A ) ;
  198.   LCD_WriteReg( 0xD206, 0x00 ) ;
  199.   LCD_WriteReg( 0xD207, 0x4A ) ;
  200.   LCD_WriteReg( 0xD208, 0x00 ) ;
  201.   LCD_WriteReg( 0xD209, 0x5C ) ;
  202.   LCD_WriteReg( 0xD20A, 0x00 ) ;
  203.   LCD_WriteReg( 0xD20B, 0x81 ) ;
  204.   LCD_WriteReg( 0xD20C, 0x00 ) ;
  205.   LCD_WriteReg( 0xD20D, 0xA6 ) ;
  206.   LCD_WriteReg( 0xD20E, 0x00 ) ;
  207.   LCD_WriteReg( 0xD20F, 0xE5 ) ;
  208.   LCD_WriteReg( 0xD210, 0x01 ) ;
  209.   LCD_WriteReg( 0xD211, 0x13 ) ;
  210.   LCD_WriteReg( 0xD212, 0x01 ) ;
  211.   LCD_WriteReg( 0xD213, 0x54 ) ;
  212.   LCD_WriteReg( 0xD214, 0x01 ) ;
  213.   LCD_WriteReg( 0xD215, 0x82 ) ;
  214.   LCD_WriteReg( 0xD216, 0x01 ) ;
  215.   LCD_WriteReg( 0xD217, 0xCA ) ;
  216.   LCD_WriteReg( 0xD218, 0x02 ) ;
  217.   LCD_WriteReg( 0xD219, 0x00 ) ;
  218.   LCD_WriteReg( 0xD21A, 0x02 ) ;
  219.   LCD_WriteReg( 0xD21B, 0x01 ) ;
  220.   LCD_WriteReg( 0xD21C, 0x02 ) ;
  221.   LCD_WriteReg( 0xD21D, 0x34 ) ;
  222.   LCD_WriteReg( 0xD21E, 0x02 ) ;
  223.   LCD_WriteReg( 0xD21F, 0x67 ) ;
  224.   LCD_WriteReg( 0xD220, 0x02 ) ;
  225.   LCD_WriteReg( 0xD221, 0x84 ) ;
  226.   LCD_WriteReg( 0xD222, 0x02 ) ;
  227.   LCD_WriteReg( 0xD223, 0xA4 ) ;
  228.   LCD_WriteReg( 0xD224, 0x02 ) ;
  229.   LCD_WriteReg( 0xD225, 0xB7 ) ;
  230.   LCD_WriteReg( 0xD226, 0x02 ) ;
  231.   LCD_WriteReg( 0xD227, 0xCF ) ;
  232.   LCD_WriteReg( 0xD228, 0x02 ) ;
  233.   LCD_WriteReg( 0xD229, 0xDE ) ;
  234.   LCD_WriteReg( 0xD22A, 0x02 ) ;
  235.   LCD_WriteReg( 0xD22B, 0xF2 ) ;
  236.   LCD_WriteReg( 0xD22C, 0x02 ) ;
  237.   LCD_WriteReg( 0xD22D, 0xFE ) ;
  238.   LCD_WriteReg( 0xD22E, 0x03 ) ;
  239.   LCD_WriteReg( 0xD22F, 0x10 ) ;
  240.   LCD_WriteReg( 0xD230, 0x03 ) ;
  241.   LCD_WriteReg( 0xD231, 0x33 ) ;
  242.   LCD_WriteReg( 0xD232, 0x03 ) ;
  243.   LCD_WriteReg( 0xD233, 0x6D ) ;
  244.   LCD_WriteReg( 0xD300, 0x00 ) ;
  245.   LCD_WriteReg( 0xD301, 0x33 ) ;
  246.   LCD_WriteReg( 0xD302, 0x00 ) ;
  247.   LCD_WriteReg( 0xD303, 0x34 ) ;
  248.   LCD_WriteReg( 0xD304, 0x00 ) ;
  249.   LCD_WriteReg( 0xD305, 0x3A ) ;
  250.   LCD_WriteReg( 0xD306, 0x00 ) ;
  251.   LCD_WriteReg( 0xD307, 0x4A ) ;
  252.   LCD_WriteReg( 0xD308, 0x00 ) ;
  253.   LCD_WriteReg( 0xD309, 0x5C ) ;
  254.   LCD_WriteReg( 0xD30A, 0x00 ) ;
  255.   LCD_WriteReg( 0xD30B, 0x81 ) ;
  256.   LCD_WriteReg( 0xD30C, 0x00 ) ;
  257.   LCD_WriteReg( 0xD30D, 0xA6 ) ;
  258.   LCD_WriteReg( 0xD30E, 0x00 ) ;
  259.   LCD_WriteReg( 0xD30F, 0xE5 ) ;
  260.   LCD_WriteReg( 0xD310, 0x01 ) ;
  261.   LCD_WriteReg( 0xD311, 0x13 ) ;
  262.   LCD_WriteReg( 0xD312, 0x01 ) ;
  263.   LCD_WriteReg( 0xD313, 0x54 ) ;
  264.   LCD_WriteReg( 0xD314, 0x01 ) ;
  265.   LCD_WriteReg( 0xD315, 0x82 ) ;
  266.   LCD_WriteReg( 0xD316, 0x01 ) ;
  267.   LCD_WriteReg( 0xD317, 0xCA ) ;
  268.   LCD_WriteReg( 0xD318, 0x02 ) ;
  269.   LCD_WriteReg( 0xD319, 0x00 ) ;
  270.   LCD_WriteReg( 0xD31A, 0x02 ) ;
  271.   LCD_WriteReg( 0xD31B, 0x01 ) ;
  272.   LCD_WriteReg( 0xD31C, 0x02 ) ;
  273.   LCD_WriteReg( 0xD31D, 0x34 ) ;
  274.   LCD_WriteReg( 0xD31E, 0x02 ) ;
  275.   LCD_WriteReg( 0xD31F, 0x67 ) ;
  276.   LCD_WriteReg( 0xD320, 0x02 ) ;
  277.   LCD_WriteReg( 0xD321, 0x84 ) ;
  278.   LCD_WriteReg( 0xD322, 0x02 ) ;
  279.   LCD_WriteReg( 0xD323, 0xA4 ) ;
  280.   LCD_WriteReg( 0xD324, 0x02 ) ;
  281.   LCD_WriteReg( 0xD325, 0xB7 ) ;
  282.   LCD_WriteReg( 0xD326, 0x02 ) ;
  283.   LCD_WriteReg( 0xD327, 0xCF ) ;
  284.   LCD_WriteReg( 0xD328, 0x02 ) ;
  285.   LCD_WriteReg( 0xD329, 0xDE ) ;
  286.   LCD_WriteReg( 0xD32A, 0x02 ) ;
  287.   LCD_WriteReg( 0xD32B, 0xF2 ) ;
  288.   LCD_WriteReg( 0xD32C, 0x02 ) ;
  289.   LCD_WriteReg( 0xD32D, 0xFE ) ;
  290.   LCD_WriteReg( 0xD32E, 0x03 ) ;
  291.   LCD_WriteReg( 0xD32F, 0x10 ) ;
  292.   LCD_WriteReg( 0xD330, 0x03 ) ;
  293.   LCD_WriteReg( 0xD331, 0x33 ) ;
  294.   LCD_WriteReg( 0xD332, 0x03 ) ;
  295.   LCD_WriteReg( 0xD333, 0x6D ) ;
  296.   LCD_WriteReg( 0xD400, 0x00 ) ;
  297.   LCD_WriteReg( 0xD401, 0x33 ) ;
  298.   LCD_WriteReg( 0xD402, 0x00 ) ;
  299.   LCD_WriteReg( 0xD403, 0x34 ) ;
  300.   LCD_WriteReg( 0xD404, 0x00 ) ;
  301.   LCD_WriteReg( 0xD405, 0x3A ) ;
  302.   LCD_WriteReg( 0xD406, 0x00 ) ;
  303.   LCD_WriteReg( 0xD407, 0x4A ) ;
  304.   LCD_WriteReg( 0xD408, 0x00 ) ;
  305.   LCD_WriteReg( 0xD409, 0x5C ) ;
  306.   LCD_WriteReg( 0xD40A, 0x00 ) ;
  307.   LCD_WriteReg( 0xD40B, 0x81 ) ;
  308.   LCD_WriteReg( 0xD40C, 0x00 ) ;
  309.   LCD_WriteReg( 0xD40D, 0xA6 ) ;
  310.   LCD_WriteReg( 0xD40E, 0x00 ) ;
  311.   LCD_WriteReg( 0xD40F, 0xE5 ) ;
  312.   LCD_WriteReg( 0xD410, 0x01 ) ;
  313.   LCD_WriteReg( 0xD411, 0x13 ) ;
  314.   LCD_WriteReg( 0xD412, 0x01 ) ;
  315.   LCD_WriteReg( 0xD413, 0x54 ) ;
  316.   LCD_WriteReg( 0xD414, 0x01 ) ;
  317.   LCD_WriteReg( 0xD415, 0x82 ) ;
  318.   LCD_WriteReg( 0xD416, 0x01 ) ;
  319.   LCD_WriteReg( 0xD417, 0xCA ) ;
  320.   LCD_WriteReg( 0xD418, 0x02 ) ;
  321.   LCD_WriteReg( 0xD419, 0x00 ) ;
  322.   LCD_WriteReg( 0xD41A, 0x02 ) ;
  323.   LCD_WriteReg( 0xD41B, 0x01 ) ;
  324.   LCD_WriteReg( 0xD41C, 0x02 ) ;
  325.   LCD_WriteReg( 0xD41D, 0x34 ) ;
  326.   LCD_WriteReg( 0xD41E, 0x02 ) ;
  327.   LCD_WriteReg( 0xD41F, 0x67 ) ;
  328.   LCD_WriteReg( 0xD420, 0x02 ) ;
  329.   LCD_WriteReg( 0xD421, 0x84 ) ;
  330.   LCD_WriteReg( 0xD422, 0x02 ) ;
  331.   LCD_WriteReg( 0xD423, 0xA4 ) ;
  332.   LCD_WriteReg( 0xD424, 0x02 ) ;
  333.   LCD_WriteReg( 0xD425, 0xB7 ) ;
  334.   LCD_WriteReg( 0xD426, 0x02 ) ;
  335.   LCD_WriteReg( 0xD427, 0xCF ) ;
  336.   LCD_WriteReg( 0xD428, 0x02 ) ;
  337.   LCD_WriteReg( 0xD429, 0xDE ) ;
  338.   LCD_WriteReg( 0xD42A, 0x02 ) ;
  339.   LCD_WriteReg( 0xD42B, 0xF2 ) ;
  340.   LCD_WriteReg( 0xD42C, 0x02 ) ;
  341.   LCD_WriteReg( 0xD42D, 0xFE ) ;
  342.   LCD_WriteReg( 0xD42E, 0x03 ) ;
  343.   LCD_WriteReg( 0xD42F, 0x10 ) ;
  344.   LCD_WriteReg( 0xD430, 0x03 ) ;
  345.   LCD_WriteReg( 0xD431, 0x33 ) ;
  346.   LCD_WriteReg( 0xD432, 0x03 ) ;
  347.   LCD_WriteReg( 0xD433, 0x6D ) ;
  348.   LCD_WriteReg( 0xD500, 0x00 ) ;
  349.   LCD_WriteReg( 0xD501, 0x33 ) ;
  350.   LCD_WriteReg( 0xD502, 0x00 ) ;
  351.   LCD_WriteReg( 0xD503, 0x34 ) ;
  352.   LCD_WriteReg( 0xD504, 0x00 ) ;
  353.   LCD_WriteReg( 0xD505, 0x3A ) ;
  354.   LCD_WriteReg( 0xD506, 0x00 ) ;
  355.   LCD_WriteReg( 0xD507, 0x4A ) ;
  356.   LCD_WriteReg( 0xD508, 0x00 ) ;
  357.   LCD_WriteReg( 0xD509, 0x5C ) ;
  358.   LCD_WriteReg( 0xD50A, 0x00 ) ;
  359.   LCD_WriteReg( 0xD50B, 0x81 ) ;
  360.   LCD_WriteReg( 0xD50C, 0x00 ) ;
  361.   LCD_WriteReg( 0xD50D, 0xA6 ) ;
  362.   LCD_WriteReg( 0xD50E, 0x00 ) ;
  363.   LCD_WriteReg( 0xD50F, 0xE5 ) ;
  364.   LCD_WriteReg( 0xD510, 0x01 ) ;
  365.   LCD_WriteReg( 0xD511, 0x13 ) ;
  366.   LCD_WriteReg( 0xD512, 0x01 ) ;
  367.   LCD_WriteReg( 0xD513, 0x54 ) ;
  368.   LCD_WriteReg( 0xD514, 0x01 ) ;
  369.   LCD_WriteReg( 0xD515, 0x82 ) ;
  370.   LCD_WriteReg( 0xD516, 0x01 ) ;
  371.   LCD_WriteReg( 0xD517, 0xCA ) ;
  372.   LCD_WriteReg( 0xD518, 0x02 ) ;
  373.   LCD_WriteReg( 0xD519, 0x00 ) ;
  374.   LCD_WriteReg( 0xD51A, 0x02 ) ;
  375.   LCD_WriteReg( 0xD51B, 0x01 ) ;
  376.   LCD_WriteReg( 0xD51C, 0x02 ) ;
  377.   LCD_WriteReg( 0xD51D, 0x34 ) ;
  378.   LCD_WriteReg( 0xD51E, 0x02 ) ;
  379.   LCD_WriteReg( 0xD51F, 0x67 ) ;
  380.   LCD_WriteReg( 0xD520, 0x02 ) ;
  381.   LCD_WriteReg( 0xD521, 0x84 ) ;
  382.   LCD_WriteReg( 0xD522, 0x02 ) ;
  383.   LCD_WriteReg( 0xD523, 0xA4 ) ;
  384.   LCD_WriteReg( 0xD524, 0x02 ) ;
  385.   LCD_WriteReg( 0xD525, 0xB7 ) ;
  386.   LCD_WriteReg( 0xD526, 0x02 ) ;
  387.   LCD_WriteReg( 0xD527, 0xCF ) ;
  388.   LCD_WriteReg( 0xD528, 0x02 ) ;
  389.   LCD_WriteReg( 0xD529, 0xDE ) ;
  390.   LCD_WriteReg( 0xD52A, 0x02 ) ;
  391.   LCD_WriteReg( 0xD52B, 0xF2 ) ;
  392.   LCD_WriteReg( 0xD52C, 0x02 ) ;
  393.   LCD_WriteReg( 0xD52D, 0xFE ) ;
  394.   LCD_WriteReg( 0xD52E, 0x03 ) ;
  395.   LCD_WriteReg( 0xD52F, 0x10 ) ;
  396.   LCD_WriteReg( 0xD530, 0x03 ) ;
  397.   LCD_WriteReg( 0xD531, 0x33 ) ;
  398.   LCD_WriteReg( 0xD532, 0x03 ) ;
  399.   LCD_WriteReg( 0xD533, 0x6D ) ;
  400.   LCD_WriteReg( 0xD600, 0x00 ) ;
  401.   LCD_WriteReg( 0xD601, 0x33 ) ;
  402.   LCD_WriteReg( 0xD602, 0x00 ) ;
  403.   LCD_WriteReg( 0xD603, 0x34 ) ;
  404.   LCD_WriteReg( 0xD604, 0x00 ) ;
  405.   LCD_WriteReg( 0xD605, 0x3A ) ;
  406.   LCD_WriteReg( 0xD606, 0x00 ) ;
  407.   LCD_WriteReg( 0xD607, 0x4A ) ;
  408.   LCD_WriteReg( 0xD608, 0x00 ) ;
  409.   LCD_WriteReg( 0xD609, 0x5C ) ;
  410.   LCD_WriteReg( 0xD60A, 0x00 ) ;
  411.   LCD_WriteReg( 0xD60B, 0x81 ) ;
  412.   LCD_WriteReg( 0xD60C, 0x00 ) ;
  413.   LCD_WriteReg( 0xD60D, 0xA6 ) ;
  414.   LCD_WriteReg( 0xD60E, 0x00 ) ;
  415.   LCD_WriteReg( 0xD60F, 0xE5 ) ;
  416.   LCD_WriteReg( 0xD610, 0x01 ) ;
  417.   LCD_WriteReg( 0xD611, 0x13 ) ;
  418.   LCD_WriteReg( 0xD612, 0x01 ) ;
  419.   LCD_WriteReg( 0xD613, 0x54 ) ;
  420.   LCD_WriteReg( 0xD614, 0x01 ) ;
  421.   LCD_WriteReg( 0xD615, 0x82 ) ;
  422.   LCD_WriteReg( 0xD616, 0x01 ) ;
  423.   LCD_WriteReg( 0xD617, 0xCA ) ;
  424.   LCD_WriteReg( 0xD618, 0x02 ) ;
  425.   LCD_WriteReg( 0xD619, 0x00 ) ;
  426.   LCD_WriteReg( 0xD61A, 0x02 ) ;
  427.   LCD_WriteReg( 0xD61B, 0x01 ) ;
  428.   LCD_WriteReg( 0xD61C, 0x02 ) ;
  429.   LCD_WriteReg( 0xD61D, 0x34 ) ;
  430.   LCD_WriteReg( 0xD61E, 0x02 ) ;
  431.   LCD_WriteReg( 0xD61F, 0x67 ) ;
  432.   LCD_WriteReg( 0xD620, 0x02 ) ;
  433.   LCD_WriteReg( 0xD621, 0x84 ) ;
  434.   LCD_WriteReg( 0xD622, 0x02 ) ;
  435.   LCD_WriteReg( 0xD623, 0xA4 ) ;
  436.   LCD_WriteReg( 0xD624, 0x02 ) ;
  437.   LCD_WriteReg( 0xD625, 0xB7 ) ;
  438.   LCD_WriteReg( 0xD626, 0x02 ) ;
  439.   LCD_WriteReg( 0xD627, 0xCF ) ;
  440.   LCD_WriteReg( 0xD628, 0x02 ) ;
  441.   LCD_WriteReg( 0xD629, 0xDE ) ;
  442.   LCD_WriteReg( 0xD62A, 0x02 ) ;
  443.   LCD_WriteReg( 0xD62B, 0xF2 ) ;
  444.   LCD_WriteReg( 0xD62C, 0x02 ) ;
  445.   LCD_WriteReg( 0xD62D, 0xFE ) ;
  446.   LCD_WriteReg( 0xD62E, 0x03 ) ;
  447.   LCD_WriteReg( 0xD62F, 0x10 ) ;
  448.   LCD_WriteReg( 0xD630, 0x03 ) ;
  449.   LCD_WriteReg( 0xD631, 0x33 ) ;
  450.   LCD_WriteReg( 0xD632, 0x03 ) ;
  451.   LCD_WriteReg( 0xD633, 0x6D ) ;
  452.   //LV2 Page 0 enable
  453.   LCD_WriteReg( 0xF000, 0x55 ) ;
  454.   LCD_WriteReg( 0xF001, 0xAA ) ;
  455.   LCD_WriteReg( 0xF002, 0x52 ) ;
  456.   LCD_WriteReg( 0xF003, 0x08 ) ;
  457.   LCD_WriteReg( 0xF004, 0x00 ) ;
  458.   //Display control
  459.   LCD_WriteReg( 0xB100,  0xCC ) ;
  460.   LCD_WriteReg( 0xB101,  0x00 ) ;
  461.   //Source hold time
  462.   LCD_WriteReg( 0xB600, 0x05 ) ;
  463.   //Gate EQ control
  464.   LCD_WriteReg( 0xB700, 0x70 ) ;
  465.   LCD_WriteReg( 0xB701, 0x70 ) ;
  466.   //Source EQ control ( Mode 2 )
  467.   LCD_WriteReg( 0xB800, 0x01 ) ;
  468.   LCD_WriteReg( 0xB801, 0x03 ) ;
  469.   LCD_WriteReg( 0xB802, 0x03 ) ;
  470.   LCD_WriteReg( 0xB803, 0x03 ) ;
  471.   //Inversion mode ( 2-dot )
  472.   LCD_WriteReg( 0xBC00, 0x02 ) ;
  473.   LCD_WriteReg( 0xBC01, 0x00 ) ;
  474.   LCD_WriteReg( 0xBC02, 0x00 ) ;
  475.   //Timing control 4H w/ 4-delay
  476.   LCD_WriteReg( 0xC900, 0xD0 ) ;
  477.   LCD_WriteReg( 0xC901, 0x02 ) ;
  478.   LCD_WriteReg( 0xC902, 0x50 ) ;
  479.   LCD_WriteReg( 0xC903, 0x50 ) ;
  480.   LCD_WriteReg( 0xC904, 0x50 ) ;
  481.   LCD_WriteReg( 0x3500, 0x00 ) ;
  482.   LCD_WriteReg( 0x3A00, 0x55 ) ;                                    //16-bit/pixel
  483.   LCD->LCD_REG = 0x1100 ;
  484.   delay_us( 120 ) ;
  485.   LCD->LCD_REG = 0x2900 ;
  486.   LCD_Display_Dir() ;                    //默认为竖屏
  487.   LCD_LED = 1 ;                      //点亮背光
  488.   LCD_Clear( WHITE ) ;
  489. }
  490. void LCD_Clear( u16 color )
  491. {
  492.   u32 index = 0 ;
  493.   u32 totalpoint = lcddev.width ;
  494.   totalpoint *= lcddev.height ;                //得到总点数
  495.   LCD_SetCursor( 0, 0 ) ;                    //设置光标位置
  496.   LCD->LCD_REG = lcddev.wramcmd ;              //开始写入GRAM
  497.   for( index=0; index<totalpoint; index++ )
  498.     LCD->LCD_RAM = color ;
  499. }
  500. void LCD_Fast_DrawPoint( u16 x, u16 y, u16 color )
  501. {     
  502.   LCD_WriteReg( lcddev.setxcmd, x>>8 ) ;
  503.   LCD_WriteReg( lcddev.setxcmd+1, x&0xFF ) ;
  504.   LCD_WriteReg( lcddev.setycmd, y>>8 ) ;
  505.   LCD_WriteReg( lcddev.setycmd+1, y&0xFF ) ;
  506.   LCD_WriteReg( lcddev.wramcmd, color ) ;  
  507. }
  508. u16 POINT_COLOR=RED ;                    //画笔颜色
  509. u16 BACK_COLOR=WHITE ;                    //背景色
  510. void LCD_ShowChar( u16 x, u16 y, u8 num )
  511. {                  
  512.     u8 temp, t1, t ;
  513.   u16 y0=y ;
  514.    num = num-' ' ;                      //得到偏移后的值
  515.   for( t=0; t<16; t++ )
  516.   {   
  517.     temp = asc2_1608[ num ][ t ] ;              //调用1608字体
  518.     for( t1=0; t1<8; t1++ )
  519.     {
  520.       if( ( temp&0x80 )==0x80 )
  521.         LCD_Fast_DrawPoint( x, y, POINT_COLOR ) ;
  522.       else
  523.         LCD_Fast_DrawPoint( x, y, BACK_COLOR ) ;
  524.       temp <<= 1 ;
  525.       y ++ ;
  526.       //超区域了
  527.       if( y>=lcddev.height )
  528.         return ;
  529.       if( ( y-y0 )==16 )
  530.       {
  531.         y = y0 ;
  532.         x ++ ;
  533.         //超区域了
  534.         if( x>=lcddev.width )
  535.           return ;
  536.         break ;
  537.       }
  538.     }
  539.   }
  540. }
  541. void LCD_ShowString( u16 x, u16 y, u8 *p )
  542. {
  543.   //判断是不是非法字符
  544.     while( ( *p<='~' )&&( *p>=' ' ) )
  545.     {      
  546.     //退出
  547.         if( ( y>=lcddev.height )||( x>=lcddev.width ) )
  548.       break ;
  549.         LCD_ShowChar( x, y, *p ) ;
  550.         x += 8 ;
  551.         p ++ ;
  552.     }  
  553. }
复制代码
注1:省略的初始化代码是在采购屏幕的时候生产厂家提供的驱动代码,这部分代码包括初始化屏幕的伽马校正以及显示地址增加等功能,可以不去管,只需要复制到初始化的位置即可。


注2:清屏函数LCD_Clear


       清屏其实就是在屏幕中送入白色或者别的颜色,一般都是全部像素点写入白色,该函数也可以用于填充颜色使用,程序中首先通过横坐标点数和纵坐标点数计算出所有像素点的个数,由于初始化中设置了地址自增加功能,所以可以设定开始地址后直接不停的发送白色的数据代码,直到所有像素点全部填充后结束。


注3:显示1个字符函数LCD_ShowChar


       TFTLCD由于内部没有字库,所以所有的英文包括ASCII码,中文都需要自己取模,取模的方式类似于之前的51单片机驱动点阵,这种情况下可以采用厂家提供的现成的代码,或者自己用取模软件直接生成代码,文件中包含的头文件font.h其实就是自己通过软件得到的ASCII码的字符点阵数据。读取点阵的时候,1的位置写入设置的颜色(画笔颜色),0的位置写入背景颜色,当背景颜色和刷屏颜色一样的时候,看起来就像是显示了数据一样(也可以不写入背景颜色,直接在1的位置写入画笔颜色,0的位置不管,这种情况下可以实现字体的透明效果)。


注4:显示字符串函数LCD_ShowString


       显示字符串函数实际就是频繁调用函数LCD_ShowChar,通过while循环来判断字符串的结尾,将结尾之前的数据全部写入后退出循环。有的厂家会提供完整的例程,里面包括显示数字,显示图像,其实本质都是通过判断点阵数据来写入画笔颜色和背景颜色。


(3)创建font.h,自己通过取模软件来添加字符的字模。

  1. #ifndef _FONT_H_
  2. #define _FONT_H_
  3. //常用ASCII表
  4. //阴码+逐列式+顺向+C51格式
  5. const unsigned char asc2_1608[95][16]={   
  6. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/
  7. {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xCC,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/
  8. {0x00,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00},/*""",2*/
  9. {0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x03,0xFC,0x1E,0x20,0x02,0x20,0x00,0x00},/*"#",3*/
  10. {0x00,0x00,0x0E,0x18,0x11,0x04,0x3F,0xFF,0x10,0x84,0x0C,0x78,0x00,0x00,0x00,0x00},/*"[        DISCUZ_CODE_2        ]quot;,4*/
  11. {0x0F,0x00,0x10,0x84,0x0F,0x38,0x00,0xC0,0x07,0x78,0x18,0x84,0x00,0x78,0x00,0x00},/*"%",5*/
  12. {0x00,0x78,0x0F,0x84,0x10,0xC4,0x11,0x24,0x0E,0x98,0x00,0xE4,0x00,0x84,0x00,0x08},/*"&",6*/
  13. {0x08,0x00,0x68,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/
  14. {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x18,0x20,0x04,0x40,0x02,0x00,0x00},/*"(",8*/
  15. {0x00,0x00,0x40,0x02,0x20,0x04,0x18,0x18,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*")",9*/
  16. {0x02,0x40,0x02,0x40,0x01,0x80,0x0F,0xF0,0x01,0x80,0x02,0x40,0x02,0x40,0x00,0x00},/*"*",10*/
  17. {0x00,0x80,0x00,0x80,0x00,0x80,0x0F,0xF8,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00},/*"+",11*/
  18. {0x00,0x01,0x00,0x0D,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",12*/
  19. {0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"-",13*/
  20. {0x00,0x00,0x00,0x0C,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/
  21. {0x00,0x00,0x00,0x06,0x00,0x18,0x00,0x60,0x01,0x80,0x06,0x00,0x18,0x00,0x20,0x00},/*"/",15*/
  22. {0x00,0x00,0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"0",16*/
  23. {0x00,0x00,0x08,0x04,0x08,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"1",17*/
  24. {0x00,0x00,0x0E,0x0C,0x10,0x14,0x10,0x24,0x10,0x44,0x11,0x84,0x0E,0x0C,0x00,0x00},/*"2",18*/
  25. {0x00,0x00,0x0C,0x18,0x10,0x04,0x11,0x04,0x11,0x04,0x12,0x88,0x0C,0x70,0x00,0x00},/*"3",19*/
  26. {0x00,0x00,0x00,0xE0,0x03,0x20,0x04,0x24,0x08,0x24,0x1F,0xFC,0x00,0x24,0x00,0x00},/*"4",20*/
  27. {0x00,0x00,0x1F,0x98,0x10,0x84,0x11,0x04,0x11,0x04,0x10,0x88,0x10,0x70,0x00,0x00},/*"5",21*/
  28. {0x00,0x00,0x07,0xF0,0x08,0x88,0x11,0x04,0x11,0x04,0x18,0x88,0x00,0x70,0x00,0x00},/*"6",22*/
  29. {0x00,0x00,0x1C,0x00,0x10,0x00,0x10,0xFC,0x13,0x00,0x1C,0x00,0x10,0x00,0x00,0x00},/*"7",23*/
  30. {0x00,0x00,0x0E,0x38,0x11,0x44,0x10,0x84,0x10,0x84,0x11,0x44,0x0E,0x38,0x00,0x00},/*"8",24*/
  31. {0x00,0x00,0x07,0x00,0x08,0x8C,0x10,0x44,0x10,0x44,0x08,0x88,0x07,0xF0,0x00,0x00},/*"9",25*/
  32. {0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x03,0x0C,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/
  33. {0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*";",27*/
  34. {0x00,0x00,0x00,0x80,0x01,0x40,0x02,0x20,0x04,0x10,0x08,0x08,0x10,0x04,0x00,0x00},/*"<",28*/
  35. {0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x02,0x20,0x00,0x00},/*"=",29*/
  36. {0x00,0x00,0x10,0x04,0x08,0x08,0x04,0x10,0x02,0x20,0x01,0x40,0x00,0x80,0x00,0x00},/*">",30*/
  37. {0x00,0x00,0x0E,0x00,0x12,0x00,0x10,0x0C,0x10,0x6C,0x10,0x80,0x0F,0x00,0x00,0x00},/*"?",31*/
  38. {0x03,0xE0,0x0C,0x18,0x13,0xE4,0x14,0x24,0x17,0xC4,0x08,0x28,0x07,0xD0,0x00,0x00},/*"@",32*/
  39. {0x00,0x04,0x00,0x3C,0x03,0xC4,0x1C,0x40,0x07,0x40,0x00,0xE4,0x00,0x1C,0x00,0x04},/*"A",33*/
  40. {0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x11,0x04,0x0E,0x88,0x00,0x70,0x00,0x00},/*"B",34*/
  41. {0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x04,0x10,0x08,0x1C,0x10,0x00,0x00},/*"C",35*/
  42. {0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"D",36*/
  43. {0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x04,0x17,0xC4,0x10,0x04,0x08,0x18,0x00,0x00},/*"E",37*/
  44. {0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x17,0xC0,0x10,0x00,0x08,0x00,0x00,0x00},/*"F",38*/
  45. {0x03,0xE0,0x0C,0x18,0x10,0x04,0x10,0x04,0x10,0x44,0x1C,0x78,0x00,0x40,0x00,0x00},/*"G",39*/
  46. {0x10,0x04,0x1F,0xFC,0x10,0x84,0x00,0x80,0x00,0x80,0x10,0x84,0x1F,0xFC,0x10,0x04},/*"H",40*/
  47. {0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x04,0x00,0x00,0x00,0x00},/*"I",41*/
  48. {0x00,0x03,0x00,0x01,0x10,0x01,0x10,0x01,0x1F,0xFE,0x10,0x00,0x10,0x00,0x00,0x00},/*"J",42*/
  49. {0x10,0x04,0x1F,0xFC,0x11,0x04,0x03,0x80,0x14,0x64,0x18,0x1C,0x10,0x04,0x00,0x00},/*"K",43*/
  50. {0x10,0x04,0x1F,0xFC,0x10,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x00},/*"L",44*/
  51. {0x10,0x04,0x1F,0xFC,0x1F,0x00,0x00,0xFC,0x1F,0x00,0x1F,0xFC,0x10,0x04,0x00,0x00},/*"M",45*/
  52. {0x10,0x04,0x1F,0xFC,0x0C,0x04,0x03,0x00,0x00,0xE0,0x10,0x18,0x1F,0xFC,0x10,0x00},/*"N",46*/
  53. {0x07,0xF0,0x08,0x08,0x10,0x04,0x10,0x04,0x10,0x04,0x08,0x08,0x07,0xF0,0x00,0x00},/*"O",47*/
  54. {0x10,0x04,0x1F,0xFC,0x10,0x84,0x10,0x80,0x10,0x80,0x10,0x80,0x0F,0x00,0x00,0x00},/*"P",48*/
  55. {0x07,0xF0,0x08,0x18,0x10,0x24,0x10,0x24,0x10,0x1C,0x08,0x0A,0x07,0xF2,0x00,0x00},/*"Q",49*/
  56. {0x10,0x04,0x1F,0xFC,0x11,0x04,0x11,0x00,0x11,0xC0,0x11,0x30,0x0E,0x0C,0x00,0x04},/*"R",50*/
  57. {0x00,0x00,0x0E,0x1C,0x11,0x04,0x10,0x84,0x10,0x84,0x10,0x44,0x1C,0x38,0x00,0x00},/*"S",51*/
  58. {0x18,0x00,0x10,0x00,0x10,0x04,0x1F,0xFC,0x10,0x04,0x10,0x00,0x18,0x00,0x00,0x00},/*"T",52*/
  59. {0x10,0x00,0x1F,0xF8,0x10,0x04,0x00,0x04,0x00,0x04,0x10,0x04,0x1F,0xF8,0x10,0x00},/*"U",53*/
  60. {0x10,0x00,0x1E,0x00,0x11,0xE0,0x00,0x1C,0x00,0x70,0x13,0x80,0x1C,0x00,0x10,0x00},/*"V",54*/
  61. {0x1F,0xC0,0x10,0x3C,0x00,0xE0,0x1F,0x00,0x00,0xE0,0x10,0x3C,0x1F,0xC0,0x00,0x00},/*"W",55*/
  62. {0x10,0x04,0x18,0x0C,0x16,0x34,0x01,0xC0,0x01,0xC0,0x16,0x34,0x18,0x0C,0x10,0x04},/*"X",56*/
  63. {0x10,0x00,0x1C,0x00,0x13,0x04,0x00,0xFC,0x13,0x04,0x1C,0x00,0x10,0x00,0x00,0x00},/*"Y",57*/
  64. {0x08,0x04,0x10,0x1C,0x10,0x64,0x10,0x84,0x13,0x04,0x1C,0x04,0x10,0x18,0x00,0x00},/*"Z",58*/
  65. {0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x40,0x02,0x40,0x02,0x40,0x02,0x00,0x00},/*"[",59*/
  66. {0x00,0x00,0x30,0x00,0x0C,0x00,0x03,0x80,0x00,0x60,0x00,0x1C,0x00,0x03,0x00,0x00},/*"",60*/
  67. {0x00,0x00,0x40,0x02,0x40,0x02,0x40,0x02,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00},/*"]",61*/
  68. {0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00},/*"^",62*/
  69. {0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01},/*"_",63*/
  70. {0x00,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/
  71. {0x00,0x00,0x00,0x98,0x01,0x24,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xFC,0x00,0x04},/*"a",65*/
  72. {0x10,0x00,0x1F,0xFC,0x00,0x88,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"b",66*/
  73. {0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x00},/*"c",67*/
  74. {0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x11,0x08,0x1F,0xFC,0x00,0x04},/*"d",68*/
  75. {0x00,0x00,0x00,0xF8,0x01,0x44,0x01,0x44,0x01,0x44,0x01,0x44,0x00,0xC8,0x00,0x00},/*"e",69*/
  76. {0x00,0x00,0x01,0x04,0x01,0x04,0x0F,0xFC,0x11,0x04,0x11,0x04,0x11,0x00,0x18,0x00},/*"f",70*/
  77. {0x00,0x00,0x00,0xD6,0x01,0x29,0x01,0x29,0x01,0x29,0x01,0xC9,0x01,0x06,0x00,0x00},/*"g",71*/
  78. {0x10,0x04,0x1F,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"h",72*/
  79. {0x00,0x00,0x01,0x04,0x19,0x04,0x19,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"i",73*/
  80. {0x00,0x00,0x00,0x03,0x00,0x01,0x01,0x01,0x19,0x01,0x19,0xFE,0x00,0x00,0x00,0x00},/*"j",74*/
  81. {0x10,0x04,0x1F,0xFC,0x00,0x24,0x00,0x40,0x01,0xB4,0x01,0x0C,0x01,0x04,0x00,0x00},/*"k",75*/
  82. {0x00,0x00,0x10,0x04,0x10,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00},/*"l",76*/
  83. {0x01,0x04,0x01,0xFC,0x01,0x04,0x01,0x00,0x01,0xFC,0x01,0x04,0x01,0x00,0x00,0xFC},/*"m",77*/
  84. {0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x00,0x01,0x00,0x01,0x04,0x00,0xFC,0x00,0x04},/*"n",78*/
  85. {0x00,0x00,0x00,0xF8,0x01,0x04,0x01,0x04,0x01,0x04,0x01,0x04,0x00,0xF8,0x00,0x00},/*"o",79*/
  86. {0x01,0x01,0x01,0xFF,0x00,0x85,0x01,0x04,0x01,0x04,0x00,0x88,0x00,0x70,0x00,0x00},/*"p",80*/
  87. {0x00,0x00,0x00,0x70,0x00,0x88,0x01,0x04,0x01,0x04,0x01,0x05,0x01,0xFF,0x00,0x01},/*"q",81*/
  88. {0x01,0x04,0x01,0x04,0x01,0xFC,0x00,0x84,0x01,0x04,0x01,0x00,0x01,0x80,0x00,0x00},/*"r",82*/
  89. {0x00,0x00,0x00,0xCC,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x24,0x01,0x98,0x00,0x00},/*"s",83*/
  90. {0x00,0x00,0x01,0x00,0x01,0x00,0x07,0xF8,0x01,0x04,0x01,0x04,0x00,0x00,0x00,0x00},/*"t",84*/
  91. {0x01,0x00,0x01,0xF8,0x00,0x04,0x00,0x04,0x00,0x04,0x01,0x08,0x01,0xFC,0x00,0x04},/*"u",85*/
  92. {0x01,0x00,0x01,0x80,0x01,0x70,0x00,0x0C,0x00,0x10,0x01,0x60,0x01,0x80,0x01,0x00},/*"v",86*/
  93. {0x01,0xF0,0x01,0x0C,0x00,0x30,0x01,0xC0,0x00,0x30,0x01,0x0C,0x01,0xF0,0x01,0x00},/*"w",87*/
  94. {0x00,0x00,0x01,0x04,0x01,0x8C,0x00,0x74,0x01,0x70,0x01,0x8C,0x01,0x04,0x00,0x00},/*"x",88*/
  95. {0x01,0x01,0x01,0x81,0x01,0x71,0x00,0x0E,0x00,0x18,0x01,0x60,0x01,0x80,0x01,0x00},/*"y",89*/
  96. {0x00,0x00,0x01,0x84,0x01,0x0C,0x01,0x34,0x01,0x44,0x01,0x84,0x01,0x0C,0x00,0x00},/*"z",90*/
  97. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x3E,0xFC,0x40,0x02,0x40,0x02},/*"{",91*/
  98. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00},/*"|",92*/
  99. {0x00,0x00,0x40,0x02,0x40,0x02,0x3E,0xFC,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"}",93*/
  100. {0x00,0x00,0x60,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x20,0x00,0x20,0x00},/*"~",94*/
  101. };

  102. #endif
复制代码




1 收藏 1 评论1 发布时间:2020-11-25 17:18

举报

1个回答
mydzxx 回答时间:2020-11-27 10:25:07
写得挺好,作为官网就应该多点这种实际运用的讲解和例程,最好能附上工程文件免费下载就锦上添花啦

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版