STM32入门学习笔记之TFTLCD显示实验4

发布者:科技革新者最新更新时间:2024-04-29 来源: elecfans关键字:STM32  TFTLCD  显示实验 手机看文章 扫描二维码
随时随地手机看文章

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


#include 'lcd.h'

#include 'font.h'

#include 'delay.h'

void LCD_WriteReg( u16 LCD_Reg, u16 LCD_RegValue )

{  

  LCD->LCD_REG = LCD_Reg ;              //写入寄存器序号

  LCD->LCD_RAM = LCD_RegValue ;            //写入数据

}

_lcd_dev lcddev ;                      //管理LCD重要参数

void LCD_SetCursor( u16 Xpos, u16 Ypos )

{

  LCD_WriteReg( lcddev.setxcmd, Xpos>>8 ) ;

  LCD_WriteReg( lcddev.setxcmd+1, Xpos&0xFF ) ;

  LCD_WriteReg( lcddev.setycmd, Ypos>>8 ) ;

  LCD_WriteReg( lcddev.setycmd+1, Ypos&0xFF ) ;

}

void LCD_Display_Dir()

{

  u16 temp;

  lcddev.wramcmd = 0x2C00 ;

  lcddev.setxcmd = 0x2A00 ;

  lcddev.setycmd = 0x2B00 ;

  lcddev.width = 480 ;

  lcddev.height = 800 ;

  //交换X,Y

  if( lcddev.width>lcddev.height )

  {

    temp = lcddev.width ;

    lcddev.width = lcddev.height ;

    lcddev.height = temp ;

  }

  //设置扫描方向

  LCD_WriteReg( 0x3600, 0 ) ;

  LCD_WriteReg( lcddev.setxcmd, 0 ) ;

  LCD_WriteReg( lcddev.setxcmd+1, 0 ) ;

  LCD_WriteReg( lcddev.setxcmd+2, ( lcddev.width-1 )>>8 ) ;

  LCD_WriteReg( lcddev.setxcmd+3, ( lcddev.width-1 )&0xFF ) ;

  LCD_WriteReg( lcddev.setycmd, 0 ) ;

  LCD_WriteReg( lcddev.setycmd+1, 0 ) ;

  LCD_WriteReg( lcddev.setycmd+2, ( lcddev.height-1 )>>8 ) ;

  LCD_WriteReg( lcddev.setycmd+3, ( lcddev.height-1 )&0xFF ) ;

}

void LCD_Init()

{

  RCC->AHBENR |= 1<<8 ;                  //使能FSMC时钟

    RCC->APB2ENR |= 1<<3 ;                  //使能PORTB时钟

  RCC->APB2ENR |= 1<<5 ;                  //使能PORTD时钟

  RCC->APB2ENR |= 1<<6 ;                  //使能PORTE时钟

   RCC->APB2ENR |= 1<<8 ;                  //使能PORTG时钟

  GPIOB->CRL &= 0xFFFFFFF0 ;                //PB0 推挽输出

  GPIOB->CRL |= 0x00000003 ;

  //PORTD复用推挽输出

  GPIOD->CRH &= 0x00FFF000 ;

  GPIOD->CRH |= 0xBB000BBB ;

  GPIOD->CRL &= 0xFF00FF00 ;

  GPIOD->CRL |= 0x00BB00BB ;

  //PORTE复用推挽输出

  GPIOE->CRH &= 0x00000000 ;

  GPIOE->CRH |= 0xBBBBBBBB ;

  GPIOE->CRL &= 0x0FFFFFFF ;

  GPIOE->CRL |= 0xB0000000 ;

  //PORTG12复用推挽输出

  GPIOG->CRH &= 0xFFF0FFFF ;

  GPIOG->CRH |= 0x000B0000 ;

  GPIOG->CRL &= 0xFFFFFFF0 ;                //PG0->RS

  GPIOG->CRL |= 0x0000000B ;

  FSMC_Bank1->BTCR[ 6 ] = 0x00000000 ;

  FSMC_Bank1->BTCR[ 7 ] = 0x00000000 ;

  FSMC_Bank1E->BWTR[ 6 ] = 0x00000000 ;

  FSMC_Bank1->BTCR[ 6 ] |= 1<<12 ;              //存储器写使能

  FSMC_Bank1->BTCR[ 6 ] |= 1<<14 ;              //读写使用不同的时序

  FSMC_Bank1->BTCR[ 6 ] |= 1<<4 ;              //存储器数据宽度为16bit

  FSMC_Bank1->BTCR[ 7 ] |= 0<<28 ;              //模式A

  FSMC_Bank1->BTCR[ 7 ] |= 1<<0 ;              //地址建立时间为2个HCLK 1/36M=27ns

  FSMC_Bank1->BTCR[ 7 ] |= 0xF<<8 ;              //数据保存时间为16个HCLK

  FSMC_Bank1E->BWTR[ 6 ] |= 0<<28 ;            //模式A

  FSMC_Bank1E->BWTR[ 6 ] |= 0<<0 ;              //地址建立时间为1个HCLK

  FSMC_Bank1E->BWTR[ 6 ] |= 3<<8 ;              //数据保存时间为4个HCLK

  FSMC_Bank1->BTCR[ 6 ] |= 1<<0 ;              //使能BANK1区域4

  delay_ms( 50 ) ;                      //delay 50 ms

  LCD_WriteReg( 0xF000, 0x55 ) ;

  LCD_WriteReg( 0xF001, 0xAA ) ;

  LCD_WriteReg( 0xF002, 0x52 ) ;

  LCD_WriteReg( 0xF003, 0x08 ) ;

  LCD_WriteReg( 0xF004, 0x01 ) ;

  //AVDD Set AVDD 5.2V

  LCD_WriteReg( 0xB000, 0x0D ) ;

  LCD_WriteReg( 0xB001, 0x0D ) ;

  LCD_WriteReg( 0xB002, 0x0D ) ;

  //AVDD ratio

  LCD_WriteReg( 0xB600, 0x34 ) ;

  LCD_WriteReg( 0xB601, 0x34 ) ;

  LCD_WriteReg( 0xB602, 0x34 ) ;

  //AVEE -5.2V

  LCD_WriteReg( 0xB100, 0x0D ) ;

  LCD_WriteReg( 0xB101, 0x0D ) ;

  LCD_WriteReg( 0xB102, 0x0D ) ;

  //AVEE ratio

  LCD_WriteReg( 0xB700, 0x34 ) ;

  LCD_WriteReg( 0xB701, 0x34 ) ;

  LCD_WriteReg( 0xB702, 0x34 ) ;

  //VCL -2.5V

  LCD_WriteReg( 0xB200, 0x00 ) ;

  LCD_WriteReg( 0xB201, 0x00 ) ;

  LCD_WriteReg( 0xB202, 0x00 ) ;

  //VCL ratio

  LCD_WriteReg( 0xB800, 0x24 ) ;

  LCD_WriteReg( 0xB801, 0x24 ) ;

  LCD_WriteReg( 0xB802, 0x24 ) ;

  //VGH 15V

  LCD_WriteReg( 0xBF00, 0x01 ) ;

  LCD_WriteReg( 0xB300, 0x0F ) ;

  LCD_WriteReg( 0xB301, 0x0F ) ;

  LCD_WriteReg( 0xB302, 0x0F ) ;

  //VGH ratio

  LCD_WriteReg( 0xB900, 0x34 ) ;

  LCD_WriteReg( 0xB901, 0x34 ) ;

  LCD_WriteReg( 0xB902, 0x34 ) ;

  //VGL_REG -10V

  LCD_WriteReg( 0xB500, 0x08 ) ;

  LCD_WriteReg( 0xB501, 0x08 ) ;

  LCD_WriteReg( 0xB502, 0x08 ) ;

  LCD_WriteReg( 0xC200, 0x03 ) ;

  //VGLX ratio

  LCD_WriteReg( 0xBA00, 0x24 ) ;

  LCD_WriteReg( 0xBA01, 0x24 ) ;

  LCD_WriteReg( 0xBA02, 0x24 ) ;

  //VGMP/VGSP 4.5V/0V

  LCD_WriteReg( 0xBC00, 0x00 ) ;

  LCD_WriteReg( 0xBC01, 0x78 ) ;

  LCD_WriteReg( 0xBC02, 0x00 ) ;

  //VGMN/VGSN -4.5V/0V

  LCD_WriteReg( 0xBD00, 0x00 ) ;

  LCD_WriteReg( 0xBD01, 0x78 ) ;

  LCD_WriteReg( 0xBD02, 0x00 ) ;

  //VCOM

  LCD_WriteReg( 0xBE00, 0x00 ) ;

  LCD_WriteReg( 0xBE01, 0x64 ) ;

  //Gamma Setting

  LCD_WriteReg( 0xD100, 0x00 ) ;

  LCD_WriteReg( 0xD101, 0x33 ) ;

  LCD_WriteReg( 0xD102, 0x00 ) ;

  LCD_WriteReg( 0xD103, 0x34 ) ;

  LCD_WriteReg( 0xD104, 0x00 ) ;

  LCD_WriteReg( 0xD105, 0x3A ) ;

  LCD_WriteReg( 0xD106, 0x00 ) ;

  LCD_WriteReg( 0xD107, 0x4A ) ;

  LCD_WriteReg( 0xD108, 0x00 ) ;

  LCD_WriteReg( 0xD109, 0x5C ) ;

  LCD_WriteReg( 0xD10A, 0x00 ) ;

  LCD_WriteReg( 0xD10B, 0x81 ) ;

  LCD_WriteReg( 0xD10C, 0x00 ) ;

  LCD_WriteReg( 0xD10D, 0xA6 ) ;

  LCD_WriteReg( 0xD10E, 0x00 ) ;

  LCD_WriteReg( 0xD10F, 0xE5 ) ;

  LCD_WriteReg( 0xD110, 0x01 ) ;

  LCD_WriteReg( 0xD111, 0x13 ) ;

  LCD_WriteReg( 0xD112, 0x01 ) ;

  LCD_WriteReg( 0xD113, 0x54 ) ;

  LCD_WriteReg( 0xD114, 0x01 ) ;

  LCD_WriteReg( 0xD115, 0x82 ) ;

  LCD_WriteReg( 0xD116, 0x01 ) ;

  LCD_WriteReg( 0xD117, 0xCA ) ;

  LCD_WriteReg( 0xD118, 0x02 ) ;

  LCD_WriteReg( 0xD119, 0x00 ) ;

  LCD_WriteReg( 0xD11A, 0x02 ) ;

  LCD_WriteReg( 0xD11B, 0x01 ) ;

  LCD_WriteReg( 0xD11C, 0x02 ) ;

  LCD_WriteReg( 0xD11D, 0x34 ) ;

  LCD_WriteReg( 0xD11E, 0x02 ) ;

  LCD_WriteReg( 0xD11F, 0x67 ) ;

  LCD_WriteReg( 0xD120, 0x02 ) ;

  LCD_WriteReg( 0xD121, 0x84 ) ;

  LCD_WriteReg( 0xD122, 0x02 ) ;

  LCD_WriteReg( 0xD123, 0xA4 ) ;

  LCD_WriteReg( 0xD124, 0x02 ) ;

  LCD_WriteReg( 0xD125, 0xB7 ) ;

  LCD_WriteReg( 0xD126, 0x02 ) ;

  LCD_WriteReg( 0xD127, 0xCF ) ;

  LCD_WriteReg( 0xD128, 0x02 ) ;

  LCD_WriteReg( 0xD129, 0xDE ) ;

  LCD_WriteReg( 0xD12A, 0x02 ) ;

  LCD_WriteReg( 0xD12B, 0xF2 ) ;

  LCD_WriteReg( 0xD12C, 0x02 ) ;

  LCD_WriteReg( 0xD12D, 0xFE ) ;

  LCD_WriteReg( 0xD12E, 0x03 ) ;

  LCD_WriteReg( 0xD12F, 0x10 ) ;

  LCD_WriteReg( 0xD130, 0x03 ) ;

  LCD_WriteReg( 0xD131, 0x33 ) ;

  LCD_WriteReg( 0xD132, 0x03 ) ;

  LCD_WriteReg( 0xD133, 0x6D ) ;

  LCD_WriteReg( 0xD200, 0x00 ) ;

  LCD_WriteReg( 0xD201, 0x33 ) ;

  LCD_WriteReg( 0xD202, 0x00 ) ;

  LCD_WriteReg( 0xD203, 0x34 ) ;

  LCD_WriteReg( 0xD204, 0x00 ) ;

  LCD_WriteReg( 0xD205, 0x3A ) ;

  LCD_WriteReg( 0xD206, 0x00 ) ;

  LCD_WriteReg( 0xD207, 0x4A ) ;

  LCD_WriteReg( 0xD208, 0x00 ) ;

  LCD_WriteReg( 0xD209, 0x5C ) ;

  LCD_WriteReg( 0xD20A, 0x00 ) ;

  LCD_WriteReg( 0xD20B, 0x81 ) ;

  LCD_WriteReg( 0xD20C, 0x00 ) ;

  LCD_WriteReg( 0xD20D, 0xA6 ) ;

  LCD_WriteReg( 0xD20E, 0x00 ) ;

  LCD_WriteReg( 0xD20F, 0xE5 ) ;

  LCD_WriteReg( 0xD210, 0x01 ) ;

  LCD_WriteReg( 0xD211, 0x13 ) ;

  LCD_WriteReg( 0xD212, 0x01 ) ;

  LCD_WriteReg( 0xD213, 0x54 ) ;

  LCD_WriteReg( 0xD214, 0x01 ) ;

  LCD_WriteReg( 0xD215, 0x82 ) ;

  LCD_WriteReg( 0xD216, 0x01 ) ;

  LCD_WriteReg( 0xD217, 0xCA ) ;

  LCD_WriteReg( 0xD218, 0x02 ) ;

  LCD_WriteReg( 0xD219, 0x00 ) ;

  LCD_WriteReg( 0xD21A, 0x02 ) ;

  LCD_WriteReg( 0xD21B, 0x01 ) ;

  LCD_WriteReg( 0xD21C, 0x02 ) ;

  LCD_WriteReg( 0xD21D, 0x34 ) ;

  LCD_WriteReg( 0xD21E, 0x02 ) ;

  LCD_WriteReg( 0xD21F, 0x67 ) ;

  LCD_WriteReg( 0xD220, 0x02 ) ;

  LCD_WriteReg( 0xD221, 0x84 ) ;

  LCD_WriteReg( 0xD222, 0x02 ) ;

  LCD_WriteReg( 0xD223, 0xA4 ) ;

  LCD_WriteReg( 0xD224, 0x02 ) ;

  LCD_WriteReg( 0xD225, 0xB7 ) ;

  LCD_WriteReg( 0xD226, 0x02 ) ;

  LCD_WriteReg( 0xD227, 0xCF ) ;

  LCD_WriteReg( 0xD228, 0x02 ) ;

  LCD_WriteReg( 0xD229, 0xDE ) ;

  LCD_WriteReg( 0xD22A, 0x02 ) ;

  LCD_WriteReg( 0xD22B, 0xF2 ) ;

  LCD_WriteReg( 0xD22C, 0x02 ) ;

  LCD_WriteReg( 0xD22D, 0xFE ) ;

  LCD_WriteReg( 0xD22E, 0x03 ) ;

  LCD_WriteReg( 0xD22F, 0x10 ) ;

  LCD_WriteReg( 0xD230, 0x03 ) ;

  LCD_WriteReg( 0xD231, 0x33 ) ;

  LCD_WriteReg( 0xD232, 0x03 ) ;

  LCD_WriteReg( 0xD233, 0x6D ) ;

[1] [2] [3] [4]
关键字:STM32  TFTLCD  显示实验 引用地址:STM32入门学习笔记之TFTLCD显示实验4

上一篇:STM32入门学习笔记之EEPROM存储实验1
下一篇:STM32入门学习笔记之TFTLCD显示实验3

推荐阅读最新更新时间:2026-03-03 18:18

STM32入门学习笔记之TFTLCD显示实验2
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:N
[单片机]
STM32 ILI9341驱动TFTLCD(七)LCD画实心三角形、矩形、圆形
上次测试画直线函数时,已经通过三条直线画出了一个空心三角形,今天来画一下实心的,分别画下实心三角形、实心矩形、实心圆。 1、实心三角形 实心三角形,可以先画任意两条边,然后以这两条边的交点为顶点,向第三条直线的点画直线。在画第三条直线时,思想和画直线是一样的,只是在画好点之后,多加了顶点向刚画好的点画直线这一步。到第三条直线画完时,实心三角形也就画好了。 画实心三角形函数 void LCD_DrawSolidTriangle(u16 x0,u16 y0,u16 x1,u16 y1,u16 x2,u16 y2,u16 color) { u16 xm = 0,ym = 0; u16 step = 0; L
[单片机]
<font color='red'>STM32</font> ILI9341驱动<font color='red'>TFTLCD</font>(七)LCD画实心三角形、矩形、圆形
STM32 ILI9341驱动TFTLCD(九)LCD显示ASCIIII
ASCII值在LCD上显示,同样要在一个区域中写显存,这样不同大小字号的字符也就对应不同的字模了。这里生成字模用到了字体取模软件工具PCtoLCD2002,可以方便地生成不同字号的字模。 打开软件并选择设置。 进入设置界面。 根据自己需要进行取模设置: 点阵格式:阴码表示1有效,阳码表示1有效。 取模方式和取模方向与写入显存的算法有关,这里选择顺向逐行式。 设置完成后,根据ASCII表把需要的ASCII值写入,这里写入可见的ASCII值,点击生成字模。 然后复制生成的字模,定义为一个常量存储起来。 可以根据生成的字符右边的序列选取字符所在的序列,由于我们选取的是ASCII的可视字符,在原有的字符上偏移了32
[单片机]
<font color='red'>STM32</font> ILI9341驱动<font color='red'>TFTLCD</font>(九)LCD<font color='red'>显示</font>ASCIIII
STM32 ILI9341驱动TFTLCD(十)LCD显示汉字
LCD显示汉字原理和显示字符一样,设置区域初始点,把汉字字模写入显存。但是汉字的数量比较多,以GB2312为例,GB2312 收录简化汉字及符号、字母、日文假名等共 7445 个图形字符,其中汉字占 6763 个,与ASCII的总数量128不是在同一个数量级上。如果把汉字字模像ASCII一样作为常量保存起来,那将会占用大量的CPU内存。为了节省CPU,这里把汉字字模存入flash中。 对于这么多的汉字,如果按照GB2312的表格来写入字模生成器就比较麻烦了,所以这里用另一个取模软件ts3,可以直接生成整个GB2312的字库。 打开ts3,生成字库步骤和之前生成单个字模的软件类似,这里不再介绍。 对于那么多的汉字,生成字
[单片机]
<font color='red'>STM32</font> ILI9341驱动<font color='red'>TFTLCD</font>(十)LCD<font color='red'>显示</font>汉字
STM32 ILI9341驱动TFTLCD屏(六)LCD画直线
通过前面的学习,已经掌握了LCD显示图片以及显示Gif动画。这些图片其实也可以自己通过写显存,以画画的方式完成。而画画最基本的就是点和线了。 要画一个点,只要取一个点的区域,写该点的显存就可以完成。 void LCD_DrawPoint(u16 x,u16 y,u16 color) { ILI9341_SetPageAddr(y,y); //页地址设置 ILI9341_SetColumnAddr(x,x); //列地址设置 ILI9341_WriteMemory(&color,1); //写点的显存 } 接着进行测试,连续画多个点看最终效果。 主函数 #include stm32f4xx.h #i
[单片机]
<font color='red'>STM32</font> ILI9341驱动<font color='red'>TFTLCD</font>屏(六)LCD画直线
STM32 ILI9341驱动TFTLCD屏(四)
完成了图片显示,那动画显示也很好完成。因为动画也是由很多张图片组成的。这里以显示Gif动画为例。借助GIF动画分解软件GifSplitter把Gif动画分解成单个图像帧。然后修改图片尺寸,再用Image2Lcd把图片转换为数组。后面的操作就跟图片显示一样了。 GifSplitter分离Gif动画步骤: (1)输入要显示的Gif动画; (2)选择图片输出目录; (3)分离动画。 分解完成后得到了组成Gif动画的12张图片。 由于STM32的flash空间有限,所以只选取前6张图片进行测试。 对生成图片的尺寸进行修改,再用Image2Lcd生成6个数组,将这6个数据依次写入显存并延时一小段时间,就能看到Gif动画的效果了
[单片机]
<font color='red'>STM32</font> ILI9341驱动<font color='red'>TFTLCD</font>屏(四)
【STM32CubeMX】10,STM32之FSMC 之TFTLCD,移植,显示变量
1,学了这章之后,主要掌握了怎么移植标准库的函数 2,对.c .h文件的#include文件的修改 3,在LCD中,最关键的是读写命令地址的书写 4,LCD的初始化可以看给的参考例程 5,变量的显示sprintf函数https://baike.baidu.com/item/sprintf/9703430?fr=aladdin http://www.openedv.com/posts/list/61386.htm 6, 在stm32 例子的 c语言 程序中看到这样一句 *(__IO uint16_t *) (((uint32_t)0x60020000) ) 7,fsm
[单片机]
【STM32CubeMX】10,<font color='red'>STM32</font>之FSMC 之<font color='red'>TFTLCD</font>,移植,<font color='red'>显示</font>变量
stm32 FSMC-TFTLCD显示
TFTLCD TFT液晶屏常用的通信模式主要有6800模式和8080模式,对于TFT彩屏通常都使用8080并口(简称80并口)模式 8080模式的读写时序其实跟LCD1602或者LCD12864的读写时序是差不多的。8080接口有5条基本的控制线和多条 数据线 , 数据线 的数量主要看液晶屏使用的是几位模式,有8根、9根、16根、18根四种类型 FSMC FSMC模块能够与同步或异步存储器和16位PC存储器卡接口 将AHB传输信号转换到适当的外部设备协议 满足访问外部设备的时序要求 所有的外部存储器共享控制器输出的地址、数据和控制信号,每个外部设备可以通过一个唯一的片选信号加以区分。 FSMC在任一时
[单片机]
<font color='red'>stm32</font> FSMC-<font color='red'>TFTLCD</font><font color='red'>显示</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved