零死角玩转stm32-高级篇5、3.2寸液晶显示(中英文+图片)

合集下载

stm32 TFT液晶

stm32 TFT液晶

Stm32的TFT LCD显示器控制学习笔记学习stm32,TFT LCD显示屏控制是很重要的一章,本人在初步学习STM32遇到了很多困难,所以把学习中积累的部分感觉重要的知识点罗列出来。

目前常用的TFT液晶内部驱动芯片是ILI9320,ILI9325系列,内部原理基本一致,我用的是ILI9320。

用stm32驱动液晶,实际上就是驱动ILI9320芯片。

点亮TFT LCD的具体步骤有:(1)stm32与ILI9320芯片管脚的初始化。

void LCD_Init(void); /*初始化LCD,也就是初始化LCD控制器ILI9320芯片与stm32控制器的管脚连接配置*/其中包括CS:TFTLCD片选信号,WR:向TFTLCD写入信号,RD:从TFTLCD读取信号,DB(15--0):16位双向数据线,RST:硬复位TFTLCD,RS:命令/数据标志(0 读写命令;1 读写数据),TFT模块有个控制器,名为ILI9320,该控制器自带显存,其显存总大小为172820,模块数据线与显存的对应关系位565方式SGRAM (Synchronous Graphics Random-Access Memory),同步图形随机存储器,是一种专为显卡设计的显存、一种图形读写能力较强的显存,由SDRAM改良而成。

SGRAM 读写数据时不是一一读取,而是以“块”(Block)为单位,从而减少了内存整体读写的次数,提高了图形控制器的效率。

同SDRAM一样,SGRAM也分普通SGRAM与DDR SGRAM 两种。

R0,这个命令有两个功能,如果对它写,则最低位位OSC,用于开启或关闭振荡器,而如果对它读,返回控制器型号。

我们知道了控制器型号,可以针对不同型号的控制器,进行不同对的初始化。

R3,入口模式命令。

重点关注I/D0,I/D1,AM这三个位,因为这3个位控制了屏幕的显示方向。

AM:控制GRAM更新方向,当AM=0的时候,地址以行方向更新,当为1的时候,地址以列方向更新。

STM32通用定时器(TIM2-5)基本用法

STM32通用定时器(TIM2-5)基本用法
由上图可知,当 APB1 的预分频系数为 1 时,这个倍频器不起作用,定时器的时钟频率等 于 APB1 的频率;当 APB1 的预分频系数为其它数值(即预分频系数为 2、4、8 或 16)时, 这个倍频器起作用,定时器的时钟频率等于 APB1 的频率两倍。也就是,当 APB1 不分频, TIM3 的时钟速度为 36MHz,当 2 分频是,APB1 变成 18MHz,但是 TIM 又会倍频,即 TIM 时钟等于 18*2=36MHz。这里我们用向上计数的方式,即 TIMx_CNT 中的计数值达到 TIMx_ARR 中的值时,产生中断,TIMx_CNT 又从 0 开始计。 按以下步骤编程: 1.系统初始化,主要初始化时钟等。 2.GPIO 初始化,用于 LED,有了灯就便于观察了。 3.TIM3 的配置。 4.NVIC 的配置。 5.编写中断服务函数。
if(TIM_GetITStatus(TIM3 , TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update); if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) GPIO_ResetBits(GPIOA, GPIO_Pin_8); else GPIO_SetBits(GPIOA, GPIO_Pin_8); } } //注意使能定时器时钟
void TIMER3_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period=10000;//ARR 的值 TIM_TimeBaseStructure.TIM_Prescaler=7200-1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_Cmd(TIM3, ENABLE); //开启时钟 }

STM32显示汉字精讲

STM32显示汉字精讲

STM32显示汉字精讲本文是一个自学者的学习心得,通过大白话解释写代码,欢迎指教。

主要应用目的是在TFT屏幕上显示汉字,FAT32文件系统的SD卡存储16*16的汉字库,汉字显示是通过查找字库方法。

主要应用几个高级文件:1.GUI 屏幕显示函数库2.FATFS应用在单片机,ARM文件系统库3.TFT,SD卡驱动致力于应用,所以对于原理就不要深究了,我们把接口函数研究明白就行了!对于以上GUI和FATFS高级文件,我们看文档都很多,也很长,如果想速成的话(不建议速成,时间够的话,知识要一步一个脚印的学,要把原理学好,为以后省去很多麻烦),简单学习方法:1.先把接口函数里的对应数据类型记住,特别是结构体,因为我们应用就是直接或间接改这些参数2.学习接口函数原型,这部分主要包括:函数返回值,参数还有函数实现的功能,再就是函数应用条件,有例子最好看一下例子怎么使用函数对于这些大量文档把这两点把握好,就可以对随意使用了,当然这里是建立在文件移植好之后。

STM32的显示汉字几处关键程序跟大家分享一下:FATFS fs;FIL fsrc; /* file objects */UINT br; // File R/W countstatic uint8_t Find_Chinese(uint8_t* str, uint8_t* p) //字库中索引对应的汉字{uint8_t High8bit,Low8bit; //字库存储是一个字节8位的,而屏幕是16位传送的,所以把两个字节合并成一个16位数,与屏幕驱动相匹配,这里要注意数据的大小端问题FRESULT res;uint8_t error[]="Please put the sys folder which include the font file HZK16.bin into the SD card root directory. ";High8bit=*str; /* ?高八位数据*/Low8bit=*(str+1); /* 低八位数据*/f_mount(0, &fs); //fatfs申请一个工作区/* Infinite loop */res = f_open(&fsrc, "/sys/HZK16.bin", FA_OPEN_EXISTING | FA_READ); /* 打开SD卡里的字库*/if(res != 0){LCD_ShowString(32,100,error,RED ,BLACK ); //在指定位置显示errorreturn 1;}f_lseek(&fsrc,32*((High8bit-0xa0-1)*94+(Low8bit-0xa0-1))); //根据公式算出对应汉字在字库中首地址f_read(&fsrc, p, 32, &br); //取出这个汉字的字模16*16/8=32个字节,所以取32字节放在p里f_close(&fsrc); //用完关闭文件f_mount(0, NULL); //注销工作区return 0;}*************************************************************** **************** **/void PutChinese(u16 x, u16 y, u8 *c, u32 PenColor, u32 BackColor){u16 i=0;u16 j=0;u8 buffer[32];u16 tmp_char=0;if(!Find_Chinese(c,buffer)) //判断字库里是否有对应的汉字{LCD_WindowMax(x,y,x+16,y+16); /*设置窗口*/LCD_SetCursor(x,y); /*设置当前坐标*/LCD_WriteRAM_Prepare(); //LCD驱动函数里的,准备写数据/* LCD驱动写是一次写两个字节,32字节发送16次就把一个汉字显示出来*/for (i=0;i<16;i++){tmp_char=buffer[i*2];tmp_char=(tmp_char<<8);tmp_char|=buffer[2*i+1]; /*把16位数据存入tem_char*/for (j=0;j<16;j++) //这里16表示16位数据一位一位绘制屏幕上的点{if((tmp_char<<="" p="">LCD_WriteRAM(PenColor);elseLCD_WriteRAM(BackColor);}}LCD_WindowMax(0x00,0x00,240,320); /*恢复窗口*/}*************************************************************** **************** **/void GUI_Put(u16 x, u16 y, u8 *str,u32 PenColor, u32BackColor){do{if (x>MAX_HZ_POSX) /*保证空间能放下16*16字体,否则换行*/{y+=16;x=0;}if (y>MAX_HZ_POSY) /*保证空间能放下16*16字体,否则换行*/{y=0;}if ( *str < 0x80) /* 字符是16*8的*/{LCD_ShowCharString(x, y, str, PenColor, BackColor);x+= 8;str++;}else /*′显示汉字*/{PutChinese(x, y, str++, PenColor, BackColor);str++;x+=16;}}while(*str!=0);}。

STM32的液晶与触摸屏显示

STM32的液晶与触摸屏显示

STM32的液晶与触摸屏显示TFT-LCD 英文全称为:Thim Film Transistor Liquid Crystal Display。

TFT即薄膜场效应管。

所谓薄膜晶体管,是指液晶显示器上的每一液晶像素点都是由集成在其后的薄膜晶体管来驱动。

从而可以做到高速度、高亮度、高对比度显示屏幕信息。

TFT-LCD 液晶显示屏是薄膜晶体管型液晶显示屏。

我们采用的3.5 寸液晶屏,它的控制芯片是ILI9488,触摸驱动芯片为TSC2046。

最大支持解析度为:HVGA,分辨率为480×320,接口可以为8位或者16位并口,我们这里是使用16 位并口,以发挥STM32的优势。

而背光则使用一个三极管驱动。

引脚电路图如下图:引脚介绍LCD_CS是TFTLCD的片选信号LCD_RS是命令和数据的标志(0,读写命令。

1是写命令)LCD_WR是向TFTLCD写入数据LCD_RD是从TFTLCD读取数据D[17-1]是数据16位双向数据线RST是硬复位的标志BL_CTR背光处理信号lT_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号驱动时序图:驱动流程:RGB565格式说明(16色):指令集:0XD3指令:用于读取LCD控制器的ID0X36指令:用于控制读写方向0X2A指令:用于设置横坐标起始位置和终止位置(x坐标)0X2B指令:用于设置纵坐标起始位置和终止位置(y坐标)0X2C指令:用于写颜色数据0X2E指令:用于读颜色指令接线图:程序:#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "lcd.h"int main(void){u8 x=0;u8 lcd_id[12]; //存放LCD ID字符串delay_init(); //延时函数初始化uart_init(9600); //串口初始化为9600LED_Init(); //初始化与LED连接的硬件接口LCD_Init();POINT_COLOR=RED;sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。

STM32入门教程

STM32入门教程
下面我们来简单介绍下 51 和 STM32 的结构。
1. 51 系统结构
51 系统结构框图
第 2 页 共 53 页
《零死角玩转 STM32》— F1 系列
图 1 51 系统结构框图 我们说的 51 一般是指 51 系列的单片机,型号有很多,常见的有 STC89C51、 AT89S51,其中国内用的最多的是 STC89C51/2,下面我们就以 STC89C51 来讲解,并以 51 简称。
第 1 页 共 53 页
《零死角玩转 STM32》— F1 系列
第 1 章 一天入门 STM32
本章参考资料:《STM32 中文参考手册》 《CM3 权威指南 CnR2》 学习本章时,配合《STM32 中文参考手册》GPIO 章节一起阅读,效果会更佳,特 别是涉及到寄存器说明的部分。
1.1 51 与 STM32 简介
I-Code 用于取指,D-Code 用于查表等操作,它们按最佳执行速度进行优化。 系统总线(System)用于访问内存和外设,覆盖的区域包括 SRAM,片上外设,片外 RAM,片外扩展设备,以及系统级存储区的部分空间。 私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。它们也在系统级 存储区。 还有一个 MDA 总线,从字面上看,DMA 是 data memory access 的意思,是一种连接 内核和外设的桥梁,它可以访问外设、内存,传输不受 CPU 的控制,并且是双向通信。简 而言之,这个家伙就是一个速度很快的且不受老大控制的数据搬运工,这个在 51 里面是没 有的。
1.2 学习方法的区别
学习 51 用寄存器,学习 STM32 用库。 以前我们在学习 51 的时候,用的是寄存器编程的方法,想要实现什么效果,直接往寄 存器里面赋值,优点是直观,简单粗暴,知道自己具体干了啥,心里踏实。 直接操作寄存器之所以在 51 上可行,究其原因,我想有两点: 1、51 主频不高,资源有限,必须注重程序执行的效率,只能直接操作寄存器。关键 的地方还得用汇编,不适合用固件库。

零死角玩转stm32-高级篇4、FSMC详解(3.2寸液晶触摸画板)

零死角玩转stm32-高级篇4、FSMC详解(3.2寸液晶触摸画板)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!4、液晶触摸画板4.1实验简介本实验向大家介绍如何使用STM32的FSMC接口驱动LCD屏,及使用触摸屏控制器检测触点坐标。

4.2 LCD控制器简介LCD,即液晶显示器,因为其功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与用户进行交互,目前仍是各种电子显示设备的主流。

因为STM32内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有这些驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32芯片通过驱动芯片来控制液晶屏和触摸屏。

以野火3.2寸液晶屏(240*320)为例,它使用ILI9341芯片控制液晶屏,通过TSC2046芯片控制触摸屏。

4.2.1 ILI9341控制器结构液晶屏的控制芯片内部结构非常复杂,见错误!未找到引用源。

最主要的是位于中间GRAM(Graphics RAM),可以理解为显存。

GRAM中每个存储单元都对应着液晶面板的一个像素点。

它右侧的各种模块共同作用把GRAM存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。

框图的左上角为ILI9341的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是6、16还是18位;使用SPI接口还是8080接口与MCU进行通讯;使用8080接口的哪种模式。

战舰STM32F103开发版LCD显示实验和触摸屏实验文档

战舰STM32F103开发版LCD显示实验和触摸屏实验文档

接下来看指令:0X36,这是存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简 单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式 (读 GRAM 也是一样) 。该指令如表 18.1.1.2 所示: 顺序 指令 参数 控制 RS 0 1 RD 1 1 WR ↑ ↑ D15~D8 XX XX D7 0 MY D6 0 MX 各位描述 D5 1 MV D4 1 ML D3 0 BGR D2 1 MH D1 1 0 D0 0 0 HEX 36H 0
RS:命令/数据标志(0,读写命令;1,读写数据) 。 80 并口在上一节我们已经有详细的介绍了, 这里我们就不再介绍, 需要说明的是, TFTLCD 模块的 RST 信号线是直接接到 STM32 的复位脚上,并不由软件控制,这样可以省下来一个 IO 口。另外我们还需要一个背光控制线来控制 TFTLCD 的背光。所以,我们总共需要的 IO 口数 目为 21 个。这里还需要注意,我们标注的 DB1~DB8,DB10~DB17,是相对于 LCD 控制 IC 标 注的,实际上大家可以把他们就等同于 D0~D15,这样理解起来就比较简单一点。 ALIENTEK 提供 2.8/3.5/4.3/7 寸等不同尺寸的 TFTLCD 模块,其驱动芯片有很多种类型, 比如有:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408 /SSD1289/1505/B505/C505/NT35310/NT35510 等(具体的型号, 大家可以通过下载本章实验代码, 通过串口或者 LCD 显示查看),这里我们仅以 ILI9341 控制器为例进行介绍,其他的控制基本 都类似,我们就不详细阐述了。 ILI9341 液晶控制器自带显存,其显存总大小为 172800(240*320*18/8) ,即 18 位模式(26 万色)下的显存量。在 16 位模式下,ILI9341 采用 RGB565 格式存储颜色数据,此时 ILI9341 的 18 位数据线与 MCU 的 16 位数据线以及 LCD GRAM 的对应关系如图 18.1.1.4 所示:

3.2寸TFT液晶屏,

3.2寸TFT液晶屏,

3.2⼨TFT液晶屏, 16:9 WQVGA 44pin3.2⼨TFT液晶屏, 16:9 WQVGA 44pin产品图⽚产品名称 3.2⼨TFT液晶屏外观尺⼨ 47.6*80.9*2.3mm显⽰尺⼨ 41.76*69.6mm驱动IC ST7793/HX8352-A接⼝类型 MCU 并⼝ 44pin 焊脚 16bit背光类型 5*LED 并联电压:2.8--3.3V功耗 1 Wpin脚间距 0.8mm分辨率 240*400触摸可选详细资料参阅规格书pin脚定义:管脚号符号功能1GND地2YD触摸屏信号线3 XR触摸屏信号线4YU触摸屏信号线5XL触摸屏信号线6GND地7 NC悬空8 NC悬空9FMARK LCM帧同步脉冲10NC悬空11NC悬空12RESET复位信号线13NC悬空14NC悬空15DB15LCD数据信号线16DB14LCD数据信号线17DB13LCD数据信号线18DB12LCD数据信号线19DB11LCD数据信号线20DB10LCD数据信号线21DB9LCD数据信号线22DB8LCD数据信号线23DB7LCD数据信号线24DB6LCD数据信号线25DB5LCD数据信号线26DB4LCD数据信号线27DB3LCD数据信号线28DB2LCD数据信号线29DB1LCD数据信号线30DB0LCD数据信号线31RD读信号,低有效32WR写信号,低有效33RS指令/数据选择端,L:指令,H:数据 34CS⽚选信号,低有效35GND地36IOVCC I/O接⼝电压37VCC模拟电路电源38LEDK5背光LED负极性端39LEDK4背光LED负极性端40LEDK3背光LED负极性端41LEDK2背光LED负极性端42LEDK1背光LED负极性端43LEDA背光LED正极性端44GND地。

STM32OLED屏显示详解

STM32OLED屏显示详解
这是数据手册中其中一页的表示 这是基于没有做反转时的介绍,如果反转了就不是这样了。反转是在程序初始化是调用的,后面分析的初始化函数有介绍
其中“Each lattice represents one bit of image data”的翻译是“每个格子代表一个图像数据位”,因为一页刚好8个ห้องสมุดไป่ตู้方向的各种,对应的刚好是U8类型, 所以我们通常用一个U8表示一页里的一个列的显示,一页中共有128个列,所以一页总共需要1*128=128个U8类型数据。并且从图中可以看出,最下 面的是最高位。 举个栗子: 假如我们拿第二页的第一列来说,其值的二进制为11110000,其实点亮的是如下图的红色部分。
代码,需要交流可加本人微信,见文章结尾
六、 OLED进阶版及曲线显示
(一)驱动分析
想要了解OLED显示曲线就必须了解其显示本质,更加底层细致的分析寄存器及显示原理。 0.96寸的12864 OLED屏幕由128*64个发光二极管组成。 这是数据手册的截图
注意图总的黑色和绿色,它只是告诉你可以反向,也就是0编号的位置可以换成127编号而已。 由此可见屏幕总共分为8页(page),每页占用Y轴的8行发光二极管和X轴的128个发光二极管,所以一页总共占用8*128=1024个发光二极管。 所以在真实的图中表示:
(一 ) 分 析 原 理
有IIC通信方式为什么要有SPI,我看可以简单对比一下: IIC通信方式:两条数据线,通信数据较慢 SPI通信方式:四条数据线,通信数据脚快 这就看项目需要,如果需要刷屏速度的话当然选用SPI方式优秀
在此之前要知道,OLED SPI通信中不需要单片机读取OLED模块的任何数据,所以单片机按照一定的规则向SPI线上写数据就可以了。在通信中单片 机充当SPI的主机,OLED模块为SPI的从机。因为主机不需要接收从机数据,所以标准的四线SPI中MISO线就没必要存在了。通信使用的是标准的三 线SPI,即CS、CLK、MOSI。 根据这个时序图就可以了解如何变成,在CS为低电平时就是芯片通信启动;D/C是数据或者命令的选择,也就是主机拉高拉低可以控制写的数据是指 令还是数据;SCLK(D0)是时钟引脚,MOSI (D1 SDIN)为数据已经。当SCLK上升沿的瞬间,从机将会读取MOSI上的电平。发送一个字节时,是高位 在前低位在后的。 所以发送一个字节大的函数,这实现了单向的数据传输SPI 实现步骤: l 先保证时钟线默认为低电平 l 循环发送8位数据,发送最高位数据: | 设置时钟线为低电平 | 判断发送的数据是1还是0,1则发送高电平,0则低低电平 | 设置时钟线为高电平(此时有上升沿) l 数据左移一位,让次高位在最高位上 l 循环发送8位数据,发送次高位数据: | 设置时钟线为低电平 | 判断发送的数据是1还是0,1则发送高电平,0则低低电平 | 设置时钟线为高电平(此时有上升沿) l 数据左移一位,…… l …… l 保证时钟线最终为高电平

stm32驱动1.44寸LCD屏幕显示中文字符

stm32驱动1.44寸LCD屏幕显示中文字符

stm32驱动1.44⼨LCD屏幕显⽰中⽂字符之前的0.96⼨的OLED屏幕坏掉了,现在重新买了⼀块1.44⼨的LCD屏幕,感觉这次的质量⽐较好,还可以显⽰彩⾊的⽤的stm32是stm32f103vet6,我看某宝卖家给的例程⾥⾯好像还有触摸功能,我之后研究下实物图接线⽅法:供电要5V的,3.3V只会⽩屏SCL---PB13SDA---PB15RES---PB12(复位来的,和stm32接同⼀个复位就⾏)DC---PB10那个CS⽚选完全可以不接就默认浮空吧BL接GND的话是关闭屏幕,浮空或者接3.3V就是开启屏幕,那就不接默认浮空吧放⼀个例⼦显⽰的效果图还⾏挺清楚的,128*128分辨率还能放彩图上去,美滋滋下⾯贴⼀下lcd的代码和main中使⽤,会移植的⼩伙伴⾃⾏移植1 #include "lcd.h"2 #include "stdlib.h"3 #include "usart.h"4 #include "delay.h"5/****************************************************************************************************6//=======================================液晶屏数据线接线==========================================//7//CS 接PB11 //⽚选信号8//CLK 接PB13 //SPI时钟信号9//SDI(DIN) 接PB15 //SPI总线数据信号10//=======================================液晶屏控制线接线==========================================//11//LED 接PB9 //背光控制信号,⾼电平点亮12//RS(D/C) 接PB10 //寄存器/数据选择信号(RS=0数据总线发送的是指令;RS=1数据总线发送的是像素数据)13//RST 接PB12 //液晶屏复位信号,低电平复位14/////////////////////////////////////////////////////////////////////////////////////////////////15//==================================如何精简到只需要3个IO=======================================//16//1.CS信号可以精简,不作SPI复⽤⽚选可将CS接地常低,节省1个IO17//2.LED背光控制信号可以接⾼电平3.3V背光常亮,节省1个IO18//3.RST复位信号可以接到单⽚机的复位端,利⽤系统上电复位,节省1个IO19//==================================如何切换横竖屏显⽰=======================================//20//打开lcd.h头⽂件,修改宏#define USE_HORIZONTAL 值为0使⽤竖屏模式.1,使⽤横屏模式21//===========================如何切换模拟SPI总线驱动和硬件SPI总线驱动=========================//22//打开lcd.h头⽂件,修改宏#define USE_HARDWARE_SPI 值为0使⽤模拟SPI总线.1,使⽤硬件SPI总线23**************************************************************************************************/242526//管理LCD重要参数27//默认为竖屏28 _lcd_dev lcddev;2930//画笔颜⾊,背景颜⾊31 u16 POINT_COLOR = 0x0000,BACK_COLOR = 0xFFFF;32 u16 DeviceCode;3334/****************************************************************************35* 名称:void SPIv_WriteData(u8 Data)36* 功能:STM32_模拟SPI写⼀个字节数据底层函数37* ⼊⼝参数:Data38* 出⼝参数:⽆39* 说明:STM32_模拟SPI读写⼀个字节数据底层函数40****************************************************************************/41void SPIv_WriteData(u8 Data)42 {43 unsigned char i=0;44for(i=8;i>0;i--)45 {46if(Data&0x80)47 LCD_SDA_SET; //输出数据48else LCD_SDA_CLR;4950 LCD_SCL_CLR;51 LCD_SCL_SET;52 Data<<=1;53 }54 }5556/****************************************************************************57* 名称:u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)58* 功能:STM32_硬件SPI读写⼀个字节数据底层函数59* ⼊⼝参数:SPIx,Byte60* 出⼝参数:返回总线收到的数据61* 说明:STM32_硬件SPI读写⼀个字节数据底层函数62****************************************************************************/63 u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)64 {65while((SPIx->SR&SPI_I2S_FLAG_TXE)==RESET); //等待发送区空66 SPIx->DR=Byte; //发送⼀个byte67while((SPIx->SR&SPI_I2S_FLAG_RXNE)==RESET);//等待接收完⼀个byte68return SPIx->DR; //返回收到的数据69 }7071/****************************************************************************72* 名称:void SPI_SetSpeed(SPI_TypeDef* SPIx,u8 SpeedSet)73* 功能:设置SPI的速度74* ⼊⼝参数:SPIx,SpeedSet75* 出⼝参数:⽆76* 说明:SpeedSet:1,⾼速;0,低速;77****************************************************************************/78void SPI_SetSpeed(SPI_TypeDef* SPIx,u8 SpeedSet)79 {80 SPIx->CR1&=0XFFC7;81if(SpeedSet==1)//⾼速82 {83 SPIx->CR1|=SPI_BaudRatePrescaler_2;//Fsck=Fpclk/284 }85else//低速86 {87 SPIx->CR1|=SPI_BaudRatePrescaler_32; //Fsck=Fpclk/3288 }89 SPIx->CR1|=1<<6; //SPI设备使能90 }9192/****************************************************************************93* 名称:SPI2_Init(void)94* 功能:STM32_SPI2硬件配置初始化95* ⼊⼝参数:⽆96* 出⼝参数:⽆97* 说明:STM32_SPI2硬件配置初始化98****************************************************************************/99void SPI2_Init(void)100 {101 SPI_InitTypeDef SPI_InitStructure;102 GPIO_InitTypeDef GPIO_InitStructure;103104//配置SPI2管脚105 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB, ENABLE); 106 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;107 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;108 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;109 GPIO_Init(GPIOB, &GPIO_InitStructure);110111 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;112 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;113 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;114 GPIO_Init(GPIOB, &GPIO_InitStructure);115116 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12; 117 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;118 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;119 GPIO_Init(GPIOB, &GPIO_InitStructure);120121//SPI2配置选项122 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2 ,ENABLE);123124 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;125 SPI_InitStructure.SPI_Mode = SPI_Mode_Master;126 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;127 SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;128 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;129 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;130 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;131 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;132 SPI_InitStructure.SPI_CRCPolynomial = 7;133 SPI_Init(SPI2, &SPI_InitStructure);134135//使能SPI2136 SPI_Cmd(SPI2, ENABLE);137 }138139//******************************************************************140//函数名: LCD_WR_REG141//功能:向液晶屏总线写⼊写16位指令142//输⼊参数:Reg:待写⼊的指令值143//返回值:⽆144//修改记录:⽆145//****************************************************************** 146void LCD_WR_REG(u16 data)147 {148 LCD_CS_CLR;149 LCD_RS_CLR;150#if USE_HARDWARE_SPI151 SPI_WriteByte(SPI2,data);152#else153 SPIv_WriteData(data);154#endif155 LCD_CS_SET;156 }157158//****************************************************************** 159//函数名: LCD_WR_DATA160//功能:向液晶屏总线写⼊写8位数据161//输⼊参数:Data:待写⼊的数据162//返回值:⽆163//修改记录:⽆164//****************************************************************** 165void LCD_WR_DATA(u8 data)166 {167168 LCD_CS_CLR;169 LCD_RS_SET;170#if USE_HARDWARE_SPI171 SPI_WriteByte(SPI2,data);172#else173 SPIv_WriteData(data);174#endif175 LCD_CS_SET;176177 }178//****************************************************************** 179//函数名: LCD_DrawPoint_16Bit180//功能: 8位总线下如何写⼊⼀个16位数据181//输⼊参数:(x,y):光标坐标182//返回值:⽆183//修改记录:⽆184//****************************************************************** 185void LCD_WR_DATA_16Bit(u16 data)186 {187 LCD_CS_CLR;188 LCD_RS_SET;189#if USE_HARDWARE_SPI190 SPI_WriteByte(SPI2,data>>8);191 SPI_WriteByte(SPI2,data);192#else193 SPIv_WriteData(data>>8);194 SPIv_WriteData(data);195#endif196 LCD_CS_SET;197 }198199//****************************************************************** 200//函数名: LCD_WriteReg201//功能:写寄存器数据202//输⼊参数:LCD_Reg:寄存器地址203// LCD_RegValue:要写⼊的数据204//返回值:⽆205//修改记录:⽆206//****************************************************************** 207void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue) 208 {209 LCD_WR_REG(LCD_Reg);210 LCD_WR_DATA(LCD_RegValue);211 }212213//****************************************************************** 214//函数名: LCD_WriteRAM_Prepare215//功能:开始写GRAM216// 在给液晶屏传送RGB数据前,应该发送写GRAM指令217//输⼊参数:⽆218//返回值:⽆219//修改记录:⽆220//****************************************************************** 221void LCD_WriteRAM_Prepare(void)222 {223 LCD_WR_REG(lcddev.wramcmd);224 }225226//****************************************************************** 227//函数名: LCD_DrawPoint228//功能:在指定位置写⼊⼀个像素点数据229//输⼊参数:(x,y):光标坐标230//返回值:⽆231//修改记录:⽆232//******************************************************************233void LCD_DrawPoint(u16 x,u16 y)234 {235 LCD_SetCursor(x,y);//设置光标位置236 LCD_WR_DATA_16Bit(POINT_COLOR);237 }238239//******************************************************************240//函数名: LCD_GPIOInit241//功能:液晶屏IO初始化,液晶初始化前要调⽤此函数242//输⼊参数:⽆243//返回值:⽆244//修改记录:⽆245//******************************************************************246void LCD_GPIOInit(void)247 {248 GPIO_InitTypeDef GPIO_InitStructure;249250 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB ,ENABLE);251252 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15; 253 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;254 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;255 GPIO_Init(GPIOB, &GPIO_InitStructure);256 }257258//******************************************************************259//函数名: LCD_Reset260//功能: LCD复位函数,液晶初始化前要调⽤此函数261//输⼊参数:⽆262//返回值:⽆263//修改记录:⽆264//******************************************************************265void LCD_RESET(void)266 {267 LCD_RST_CLR;268 delay_ms(100);269 LCD_RST_SET;270 delay_ms(50);271 }272273//******************************************************************274//函数名: LCD_Init275//功能: LCD初始化276//输⼊参数:⽆277//返回值:⽆278//修改记录:⽆279//******************************************************************280void LCD_Init(void)281 {282#if USE_HARDWARE_SPI //使⽤硬件SPI283 SPI2_Init();284#else285 LCD_GPIOInit();//使⽤模拟SPI286#endif287288 LCD_RESET(); //液晶屏复位289290//************* Start Initial Sequence **********//291//开始初始化液晶屏292 LCD_WR_REG(0x11);//Sleep exit293 delay_ms (120);294//ST7735R Frame Rate295 LCD_WR_REG(0xB1);296 LCD_WR_DATA(0x01);297 LCD_WR_DATA(0x2C);298 LCD_WR_DATA(0x2D);299300 LCD_WR_REG(0xB2);301 LCD_WR_DATA(0x01);302 LCD_WR_DATA(0x2C);303 LCD_WR_DATA(0x2D);304305 LCD_WR_REG(0xB3);306 LCD_WR_DATA(0x01);307 LCD_WR_DATA(0x2C);308 LCD_WR_DATA(0x2D);309 LCD_WR_DATA(0x01);310 LCD_WR_DATA(0x2C);311 LCD_WR_DATA(0x2D);312313 LCD_WR_REG(0xB4); //Column inversion314 LCD_WR_DATA(0x07);315316//ST7735R Power Sequence317 LCD_WR_REG(0xC0);318 LCD_WR_DATA(0xA2);319 LCD_WR_DATA(0x02);320 LCD_WR_DATA(0x84);321 LCD_WR_REG(0xC1);322 LCD_WR_DATA(0xC5);323324 LCD_WR_REG(0xC2);325 LCD_WR_DATA(0x0A);326 LCD_WR_DATA(0x00);327328 LCD_WR_REG(0xC3);329 LCD_WR_DATA(0x8A);330 LCD_WR_DATA(0x2A);331 LCD_WR_REG(0xC4);332 LCD_WR_DATA(0x8A);333 LCD_WR_DATA(0xEE);334335 LCD_WR_REG(0xC5); //VCOM336 LCD_WR_DATA(0x0E);337338 LCD_WR_REG(0x36); //MX, MY, RGB mode339 LCD_WR_DATA(0xC8);340341//ST7735R Gamma Sequence342 LCD_WR_REG(0xe0);343 LCD_WR_DATA(0x0f);344 LCD_WR_DATA(0x1a);345 LCD_WR_DATA(0x0f);346 LCD_WR_DATA(0x18);347 LCD_WR_DATA(0x2f);348 LCD_WR_DATA(0x28);349 LCD_WR_DATA(0x20);350 LCD_WR_DATA(0x22);351 LCD_WR_DATA(0x1f);352 LCD_WR_DATA(0x1b);353 LCD_WR_DATA(0x23);354 LCD_WR_DATA(0x37);355 LCD_WR_DATA(0x00);356 LCD_WR_DATA(0x07);357 LCD_WR_DATA(0x02);358 LCD_WR_DATA(0x10);359360 LCD_WR_REG(0xe1);361 LCD_WR_DATA(0x0f);362 LCD_WR_DATA(0x1b);363 LCD_WR_DATA(0x0f);364 LCD_WR_DATA(0x17);365 LCD_WR_DATA(0x33);366 LCD_WR_DATA(0x2c);367 LCD_WR_DATA(0x29);368 LCD_WR_DATA(0x2e);369 LCD_WR_DATA(0x30);370 LCD_WR_DATA(0x30);371 LCD_WR_DATA(0x39);372 LCD_WR_DATA(0x3f);373 LCD_WR_DATA(0x00);374 LCD_WR_DATA(0x07);375 LCD_WR_DATA(0x03);376 LCD_WR_DATA(0x10);377378 LCD_WR_REG(0x2a);379 LCD_WR_DATA(0x00);380 LCD_WR_DATA(0x00);381 LCD_WR_DATA(0x00);382 LCD_WR_DATA(0x7f);383384 LCD_WR_REG(0x2b);385 LCD_WR_DATA(0x00);386 LCD_WR_DATA(0x00);387 LCD_WR_DATA(0x00);388 LCD_WR_DATA(0x9f);389390 LCD_WR_REG(0xF0); //Enable test command391 LCD_WR_DATA(0x01);392 LCD_WR_REG(0xF6); //Disable ram power save mode 393 LCD_WR_DATA(0x00);394395 LCD_WR_REG(0x3A); //65k mode396 LCD_WR_DATA(0x05);397 LCD_WR_REG(0x29);//Display on398399 LCD_SetParam();//设置LCD参数400 LCD_LED_SET;//点亮背光401//LCD_Clear(WHITE);402 }403//****************************************************************** 404//函数名: LCD_Clear405//功能: LCD全屏填充清屏函数406//输⼊参数:Color:要清屏的填充⾊407//返回值:⽆408//修改记录:⽆409//****************************************************************** 410void LCD_Clear(u16 Color)411 {412 u16 i,j;413 LCD_SetWindows(0,0,lcddev.width-1,lcddev.height-1); 414for(i=0;i<lcddev.width;i++)415 {416for(j=0;j<lcddev.height;j++)417 LCD_WR_DATA_16Bit(Color); //写⼊数据418 }419 }420/*************************************************421函数名:LCD_SetWindows422功能:设置lcd显⽰窗⼝,在此区域写点数据⾃动换⾏423⼊⼝参数:xy起点和终点424返回值:⽆425*************************************************/426void LCD_SetWindows(u16 xStar, u16 yStar,u16 xEnd,u16 yEnd) 427 {428#if USE_HORIZONTAL==1 //使⽤横屏429 LCD_WR_REG(lcddev.setxcmd);430 LCD_WR_DATA(xStar>>8);431 LCD_WR_DATA(0x00FF&xStar+3);432 LCD_WR_DATA(xEnd>>8);433 LCD_WR_DATA(0x00FF&xEnd+3);434435 LCD_WR_REG(lcddev.setycmd);436 LCD_WR_DATA(yStar>>8);437 LCD_WR_DATA(0x00FF&yStar+2);438 LCD_WR_DATA(yEnd>>8);439 LCD_WR_DATA(0x00FF&yEnd+2);440441#else442443 LCD_WR_REG(lcddev.setxcmd);444 LCD_WR_DATA(xStar>>8);445 LCD_WR_DATA(0x00FF&xStar+2);446 LCD_WR_DATA(xEnd>>8);447 LCD_WR_DATA(0x00FF&xEnd+2);448449 LCD_WR_REG(lcddev.setycmd);450 LCD_WR_DATA(yStar>>8);451 LCD_WR_DATA(0x00FF&yStar+3);452 LCD_WR_DATA(yEnd>>8);453 LCD_WR_DATA(0x00FF&yEnd+3);454#endif455456 LCD_WriteRAM_Prepare(); //开始写⼊GRAM457 }458459/*************************************************460函数名:LCD_SetCursor461功能:设置光标位置462⼊⼝参数:xy坐标463返回值:⽆464*************************************************/465void LCD_SetCursor(u16 Xpos, u16 Ypos)466 {467 LCD_SetWindows(Xpos,Ypos,Xpos,Ypos);468 }469470//设置LCD参数471//⽅便进⾏横竖屏模式切换472void LCD_SetParam(void)473 {474 lcddev.wramcmd=0x2C;475#if USE_HORIZONTAL==1 //使⽤横屏476 lcddev.dir=1;//横屏477 lcddev.width=128;478 lcddev.height=128;479 lcddev.setxcmd=0x2A;480 lcddev.setycmd=0x2B;481 LCD_WriteReg(0x36,0xA8);482483#else//竖屏484 lcddev.dir=0;//竖屏485 lcddev.width=128;486 lcddev.height=128;487 lcddev.setxcmd=0x2A;488 lcddev.setycmd=0x2B;489 LCD_WriteReg(0x36,0xC8);490#endif491 }lcd.c1 #ifndef __LCD_H2#define __LCD_H3 #include "sys.h"4 #include "stdlib.h"56//////////////////////////////////////////////////////////////////////////////////7/****************************************************************************************************8//=======================================液晶屏数据线接线==========================================// 9//CS 接PB11 //⽚选信号10//CLK 接PB13 //SPI时钟信号11//SDI(DIN) 接PB15 //SPI总线数据信号12//=======================================液晶屏控制线接线==========================================// 13//LED 接PB9 //背光控制信号,⾼电平点亮14//RS(D/C) 接PB10 //寄存器/数据选择信号(RS=0数据总线发送的是指令;RS=1数据总线发送的是像素数据)15//RST 接PB12 //液晶屏复位信号,低电平复位16/////////////////////////////////////////////////////////////////////////////////////////////////17//==================================如何精简到只需要3个IO=======================================//18//1.CS信号可以精简,不作SPI复⽤⽚选可将CS接地常低,节省1个IO19//2.LED背光控制信号可以接⾼电平3.3V背光常亮,节省1个IO20//3.RST复位信号可以接到单⽚机的复位端,利⽤系统上电复位,节省1个IO21//==================================如何切换横竖屏显⽰=======================================//22//打开lcd.h头⽂件,修改宏#define USE_HORIZONTAL 值为0使⽤竖屏模式.1,使⽤横屏模式23//===========================如何切换模拟SPI总线驱动和硬件SPI总线驱动=========================//24//打开lcd.h头⽂件,修改宏#define USE_HARDWARE_SPI 值为0使⽤模拟SPI总线.1,使⽤硬件SPI总线25**************************************************************************************************/2627//LCD重要参数集28 typedef struct29 {30 u16 width; //LCD 宽度31 u16 height; //LCD ⾼度32 u16 id; //LCD ID33 u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。

STM32的液晶与触摸屏显示

STM32的液晶与触摸屏显示

STM32的液晶与触摸屏显示TFT-LCD 英文全称为:Thim Film Transistor Liquid Crystal Display。

TFT即薄膜场效应管。

所谓薄膜晶体管,是指液晶显示器上的每一液晶像素点都是由集成在其后的薄膜晶体管来驱动。

从而可以做到高速度、高亮度、高对比度显示屏幕信息。

TFT-LCD 液晶显示屏是薄膜晶体管型液晶显示屏。

我们采用的3.5 寸液晶屏,它的控制芯片是ILI9488,触摸驱动芯片为TSC2046。

最大支持解析度为:HVGA,分辨率为480×320,接口可以为8位或者16位并口,我们这里是使用16 位并口,以发挥STM32的优势。

而背光则使用一个三极管驱动。

引脚电路图如下图:引脚介绍LCD_CS是TFTLCD的片选信号LCD_RS是命令和数据的标志(0,读写命令。

1是写命令)LCD_WR是向TFTLCD写入数据LCD_RD是从TFTLCD读取数据D[17-1]是数据16位双向数据线RST是硬复位的标志BL_CTR背光处理信号lT_MISO/T_MOSI/T_PEN/T_CS/T_CLK,触摸屏接口信号驱动时序图:驱动流程:RGB565格式说明(16色):指令集:0XD3指令:用于读取LCD控制器的ID0X36指令:用于控制读写方向0X2A指令:用于设置横坐标起始位置和终止位置(x坐标)0X2B指令:用于设置纵坐标起始位置和终止位置(y坐标)0X2C指令:用于写颜色数据0X2E指令:用于读颜色指令接线图:程序:#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "lcd.h"int main(void){u8 x=0;u8 lcd_id[12]; //存放LCD ID字符串delay_init(); //延时函数初始化uart_init(9600); //串口初始化为9600LED_Init(); //初始化与LED连接的硬件接口LCD_Init();POINT_COLOR=RED;sprintf((char*)lcd_id,"LCD ID:%04X",lcddev.id);//将LCD ID打印到lcd_id数组。

STM32学习笔记——显示

STM32学习笔记——显示

1.常用的显示设备指示灯数码管:只能显示数字-- 操作简单,价格便宜,显示单一段码显示屏:汉字,图案,数字等,定制-- 操作简单,图案不能修改-- 小家电,空调,豆浆机TFTLCD:汉字,图案,数字等-- 取模显示-- 手机,电脑,电视等LED屏:汉字,图案,数字等-- 取模显示-- 广告屏OLED屏:材料自发光,汉字,图案,数字等-- 取模显示-- 手环、手机2.屏幕的相关术语屏幕的尺寸:对角线的长度屏幕的分辨率:像素点的个数。

像素:摄像头-- 一次曝光采集到的像素点的个数颜色:1位0 –背景色 1 –前景色8位2^8种颜色16位2^16种颜色-- 假彩24位2^24种-- 真彩32位-- 高清三基色:RGB16位RGB565R G Bx xxxx xxx xxx x xxxx红色:1 1111 000 000 0 0000 = 0xF800白色:1 1111 111 1111 1 1111 = 0xFFFF3.屏幕的接口MCU接口、RGB接口、串行接口MCU接口:8080 6800RGB接口:扫描屏-- 并行通信串行接口:SPI,IIC等二次开发屏:串口4.屏幕的组成5.spi1.物理层CS 片选SLCK 时钟MOSI 主机发送从机接收MISO 主机接收从机发送2.数据链路层:位协议数据按位传输,高位在前,低位在后(MSB first)工作方式时钟极性CPOL 时钟相位CPHASP0 0 0 上升沿采样,下降沿发送SP1 0 1 下降沿采样,上升沿发送SP2 1 0 下降沿采样,上升沿发送SP3 1 1 上升沿采样,下降沿发送模式选择:根据外设要求。

6.STM32种SPI控制器1.特性全双工同步通信8 位或16 位传输帧格式选择8 个主模式波特率预分频器(最大值为fPCLK/2)可编程的时钟极性和相位可编程的数据顺序,最先移位MSB 或LSB2.SPI配置7.OLED1.接口选择。

奋斗STM32开发板显示例程讲解-3寸屏(LGDP5420)

奋斗STM32开发板显示例程讲解-3寸屏(LGDP5420)

奋斗版 STM32 开发板例程文档———图片及字符显示例程实验图片及字符显示例程实验平台:奋斗版STM32开发板MINI、V2、V2.1、V3 实验内容:本例程演示了在3寸TFT屏是显示一副16位色图片,并在图片上透明 叠加两个不同显示方向的字符串, 该实验学习了3寸TFT 16位色显示程序的编制。

预先需要掌握的知识1. 3寸TFT显示模块。

3寸TFT显示器:(关于3寸TFT的详细资料请参考光盘奋斗板文档目录下\奋斗开发板各种配件的硬件 文档\奋斗板配3寸显示模块文档\下的SPFD5420A手册.pdf和3寸屏(240X400)规格书.pdf), 3显示模块采 用的是基于LGDP5420驱动的3寸 TFT显示器(400X240),规格如下:引脚定义淘宝店铺:1奋斗版 STM32 开发板例程文档———图片及字符显示例程实验3TFT显示屏焊接在奋斗显示转接板上,在屏上贴有触摸屏,通过40芯的接口与V3或者MINI连接。

40芯接口 定义如下淘宝店铺:2奋斗版 STM32 开发板例程文档———图片及字符显示例程实验40芯里包含了16位数据线,读写线,命令/数据控制线,片选线,LCD硬件复位线,背光控制线以及触摸控 制线。

奋斗板V3和MINI就是通过这个接口来控制显示。

奋斗板MINI和V3都是选用了具有16位FSMC接口 STM32F103VET6作为MCU, FSMC接口也可以称为16位并行接口,时序同I8080接口。

按照显示屏驱动电路 LGDP5420的手册,为了达到色彩与显示效率的平衡,奋斗板采用了16位 64K色接口模式。

在这个模式每个像素用5位红色6位绿色5位蓝色总共16位来表示, 根据分辨率,一帧图像占用 400*240*2=192000字节。

FSMC总线和TFT数据线的连接关系如下STM32 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 A16FSMCLGDP5420A DB17 DB16 DB15 DB14 DB13 DB12 DB11 DB10 DB8 DB7 DB6 DB5 DB4 DB3 DB2 DB1 RS nWR nRD nCS nRESET功能数据控制线第15位 数据控制线第14位 数据控制线第13位 数据控制线第12位 数据控制线第11位 数据控制线第10位 数据控制线第9位 数据控制线第8位 数据控制线第7位 数据控制线第6位 数据控制线第5位 数据控制线第4位 数据控制线第3位 数据控制线第2位 数据控制线第1位 数据控制线第0位 指令/数据控制 写控制 读控制 LCD片选控制 LCD复位控制nWE nOE NE1 PE1淘宝店铺:3奋斗版 STM32 开发板例程文档———图片及字符显示例程实验LGDP5420A的寄存器列表,根据设置这些寄存器,可以灵活进行显示编程。

STM32学习笔记(6)LCD的显示

STM32学习笔记(6)LCD的显示

STM32学习笔记(6):LCD的显示2011年4月14日LCD显示1.LCD/LCM的基本概念液晶显示器(Liquid Crystal Display: LCD)的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。

LCM(LCD Module)即LCD显示模组、液晶模块,是指将液晶显示器件,连接件,控制与驱动等外围电路,PCB电路板,背光源,结构件等装配在一起的组件。

在平时的学习开发中,我们一般使用的是LCM,带有驱动IC和LCD屏幕等多个模块。

2.FSMC的基本概念在STM32上开发LCD显示,可以有两种方式来对LCD进行操作,一种是通过普通的IO口,连接LCM的相应引脚来进行操作,第2种是通过FSMC来进行操作。

可变静态存储控制器(Flexible Static Memory Controller: FSMC) 是STM32系列中内部集成256 KB以上FlaSh,后缀为xC、xD和xE的高存储密度微控制器特有的存储控制机制。

之所以称为“可变”,是由于通过对特殊功能寄存器的设置,FSMC能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度,从而使得STM32系列微控制器不仅能够应用各种不同类型、不同速度的外部静态存储器,而且能够在不增加外部器件的情况下同时扩展多种不同类型的静态存储器,满足系统设计对存储容量、产品体积以及成本的综合要求。

FSMC有很多优点:1.支持多种静态存储器类型。

STM32通过FSMC可以与SRAM、ROM、PSRAM、NOR Flash和NANDFlash存储器的引脚直接相连。

2.支持丰富的存储操作方法。

FSMC不仅支持多种数据宽度的异步读/写操作,而且支持对NOR、PSRAM、NAND存储器的同步突发访问方式。

3.支持同时扩展多种存储器。

FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同类型的存储器。

零死角玩转stm32-高级篇4、FSMC详解(3.2寸液晶触摸画板)

零死角玩转stm32-高级篇4、FSMC详解(3.2寸液晶触摸画板)

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!4、液晶触摸画板4.1实验简介本实验向大家介绍如何使用STM32的FSMC接口驱动LCD屏,及使用触摸屏控制器检测触点坐标。

4.2 LCD控制器简介LCD,即液晶显示器,因为其功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与用户进行交互,目前仍是各种电子显示设备的主流。

因为STM32内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有这些驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32芯片通过驱动芯片来控制液晶屏和触摸屏。

以野火3.2寸液晶屏(240*320)为例,它使用ILI9341芯片控制液晶屏,通过TSC2046芯片控制触摸屏。

4.2.1 ILI9341控制器结构液晶屏的控制芯片内部结构非常复杂,见错误!未找到引用源。

最主要的是位于中间GRAM(Graphics RAM),可以理解为显存。

GRAM中每个存储单元都对应着液晶面板的一个像素点。

它右侧的各种模块共同作用把GRAM存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。

框图的左上角为ILI9341的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是6、16还是18位;使用SPI接口还是8080接口与MCU进行通讯;使用8080接口的哪种模式。

零死角玩转STM32系统篇

零死角玩转STM32系统篇

t y w藏书友情提示t y w藏书《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!前言uC/OS是一个微型的实时操作系统,包括了一个操作系统最基本的一些特性,如任务调度、任务通信、内存管理、中断管理、定时管理等。

而且这是一个代码完全开放的实时操作系统,简单明了的结构和严谨的代码风格,非常适合初涉嵌入式操作系统的人士学习。

很多人在学习STM32中,都想亲自移植一下uC/OS,而不是总是用别人已经移植好的。

在我学习uC/OS的过程中,查找了很多资料,也看过很多关于如何移植uC/OS到STM32处理器上的教程,但都不尽人意,主要是写得太随意了,思路很乱,读者看到最后还是不确定该怎样移植。

为此,我决定写这个教程,让广大读者真正了解怎样移植。

学前建议:C语言 + 数据结构Wildfire Team2011年11月3日1、官方源代码介绍首先我们下载源代码,官方下载地址:/page/downloads/ports/st/stm32(下载资料需要注册帐号)或者网盘下载:/c0jnhmfxcp我们需要下载的就是下面这个,因为我用到的开发板芯片是STM32F103VET6注意:下载的源代码开发环境是IAR编译器的。

我们使用的uCOS是2.86版本。

下载解压后可以看到Micrium含有三个文件夹:文件名说明AppNote s 包含uCOS-II的说明文件,其中文件Micrium\AppNotes\AN1xxx-RTOS\AN1018-uCOS-II-Cortex-M3\AN-1018.pdf是很重要的。

1、旺宝STM32红龙开发板PDF讲解--3.2 TFT应用

1、旺宝STM32红龙开发板PDF讲解--3.2 TFT应用

图5
首先是打点,如图 6 所示,是屏幕的打点程序,设置光标,发送写数据的命 令,然后送入数据。
图6
接下来是划线,如图 7 所示。在这个过程中,我们要考虑的是所要画的线的 起始点、终止点。因为用户设置的时候可能会从任意位置开始划线,所以在这个
旺 过程中要考虑到各种情况。以及以斜率来判断是以 X 轴还是 Y 轴为基准来划线,
宝 SSD1298 的控制器,详细的有关 SSD1298 的说明大家可以查看其技术手册,这
里只介绍几点重要的。 首先是屏的接口,有 RGB 接口,8080,6800,以及 SPI 串行接口等,接口
非常丰富。屏的数据量一般是偏大,所以 SPI 接口在这里不适合做图片等大数据
电 量的显示。我们红龙 103 上是采用的 8080 接口来实现屏与板的接口,16 位的数
存是否能够存储。并且要把这个图片的点阵数据定义为 const 形式,存放在 flash
科 中,因为 STM32 的 ram 比较小。如图 11 所示,是图片的显示函数。 技 有 限 公 司 图 11
如图 11 中的代码,我们看到设置图片的四个点的坐标,以及图片点阵数据 数组的地址。要注意的是该地址是 8 位的,在函数里面我们看到把 8 位的地址强 制转换成了 16 位的地址类型。这主要是为了在后面取数据的时候方便,因为我 们设置的是一个像素点的数据是 16 位数据,所以强制把 8 位的地址变成 16 位, 则每次从该地址取出的数据就是 16 位的,也就是一个像素点的数据。要注意在 设置显示窗口的时候,要注意其图片的大小,否则会造成图片显示不正确。
3.2 TFT 屏的应用
通过本章学习我们可以了解到 TFT 屏的应用,了解 TFT 屏的驱动,画点, 由点到线,再到面,绘图写字符汉字和显示图片等功能。

野火STM32程序一览表

野火STM32程序一览表

野火STM32开发板程序一览表第一部分《零死角玩转stm32-初级篇》教程零死角玩转stm32-初级篇.pdf序号说明是否测试,技术支持1 ST库3.0.0源码已测试论坛讨论2 野火M3工程模板(3.0.0)已测试论坛讨论3 ST库3.5.0源码已测试论坛讨论4 野火M3工程模板(3.5.0)已测试论坛讨论5 野火M3-流水灯已测试论坛讨论6 野火M3-SysTick 已测试论坛讨论7 野火M3-KEY(polling)已测试论坛讨论8 野火M3-KEY(EXTI)已测试论坛讨论第二部分-《零死角玩转stm32-中级篇》教程零死角玩转stm32-中级篇.pdf序号说明是否测试技术支持1 野火M3-USART1(polling)已测试论坛讨论2 野火M3-USART1(interrupt)已测试论坛讨论3 野火M3-USART1(DMA)已测试论坛讨论4 野火M3-USART2(polling)已测试论坛讨论5 野火M3-Chip-ID 已测试论坛讨论6 野火M3-CRC 已测试论坛讨论7 野火M3-ADC(DMA)已测试论坛讨论8 野火M3-Temperature 已测试论坛讨论9 野火M3-TIM2 已测试论坛讨论10 野火M3-RTC 已测试论坛讨论11 野火M3-Calendar 已测试论坛讨论12 野火M3-IIC(EEPROM)已测试论坛讨论13 野火M3-SPI(W25X16 / W25Q16)已测试论坛讨论14 野火M3-PWM 已测试论坛讨论15 野火M3-CAN(Loopback)已测试论坛讨论16 野火M3-CAN(Mutual)已测试论坛讨论17 野火M3-USART2-485 已测试论坛讨论18 野火M3-温湿度(DTH11)已测试论坛讨论19 野火M3-超声波已测试论坛讨论20 野火M3-2.4G(NRF24L01+)已测试论坛讨论21 野火M3-重力感应(MMA7455)已测试论坛讨论第三部分-《零死角玩转stm32-高级篇》教程零死角玩转stm32-高级篇.pdf序号说明是否测试技术支持1 野火M3-SDIO(4bit + DMA、支持SDHC已测试论坛讨论卡)2 野火M3-FATFS(Vertion-009RC)已测试论坛讨论3 野火M3-3.2寸LCD显示(中、英、图片-已测试论坛讨论BMP格式)4 野火M3-3.2寸LCD触摸已测试论坛讨论5 野火M3-MP3已测试论坛讨论6 野火M3-计算器已测试论坛讨论7 野火M3-UsbDevice(模拟U盘)已测试论坛讨论8 野火M3-以太网(ENC28J60 + Lwip)已测试论坛讨论9 VGA-中、英、图片-BOM格式已测试论坛讨论10 野火M3-WIFI已测试论坛讨论11 野火M3-摄像头已测试论坛讨论12 野火M3-PWM Input Capture 没测试论坛讨论13 野火M3-ModBus 没测试论坛讨论第四部分-零死角玩转stm32-系统篇µCOS-II(V2.90)教程零死角玩转stm32-系统篇(uCOS).pdf序号说明是否测试技术支持1 野火M3-µCOS-II+LED(单任已测试论坛讨论务)2 野火M3-µCOS-II+LED(多任已测试论坛讨论务)3 野火M3-UCOS+计算器-2.4寸已测试论坛讨论LCD(不通信)4 野火M3-UCOS+计算器-2.4寸已测试论坛讨论LCD(队列)5 野火M3-µCOS-II+µCGUI (开机已测试论坛讨论例程-3.2寸LCD)飞鸟教程1嵌入式实时内核设计.pdf教程2 零死角玩转stm32-系统篇(飞鸟).pdf1 野火M3-飞鸟+LED(多任务)已测试论坛讨论RT-Thread教程1 野火M3-RTT+LED(多任务)已测试论坛讨论2 野火M3-RTT(finsh调试)已测试论坛讨论3 野火M3-RTT(线程同步)已测试论坛讨论4 野火M3-RTT(FS)已测试论坛讨论。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

0、友情提示《零死角玩转STM32》系列教程由初级篇、中级篇、高级篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。

M3的世界,与野火同行,乐意惬无边。

另外,野火团队历时一年精心打造的《STM32库开发实战指南》将于今年10月份由机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。

内容上会给你带来更多的惊喜。

是一本学习STM32必备的工具书。

敬请期待!5、液晶显示(中、英、Pic )5.1 实验简介在《液晶触摸画板》中,我们已经成功地实现了驱动LCD 和触摸屏,并制作了触摸画板小应用,但是若要显示文字或图片文件,则还需要利用文件系统,读取保存在SD 卡中的字库文件、图片文件。

5.2 什么是字模我们知道其实液晶屏就是一个由像素点组成的点阵,若要显示文字,则需要很多像素点的共同构成。

见下错误!未找到引用源。

,图中是两个由16*16的点阵显示的两个汉字。

如果我们规定:每个汉字都由这样16*16的点阵来显示,把笔迹经过的像素点以“1”表示,没有笔迹的点以“0”表示,每个像素点的状态以一个二进制位来记录,用16*16/8 =32个字节就可以把这个字记录下来。

这32个字节数据就称为该文字的字模,还有其它常用字模是24*24、32*32的。

16*16的“字”的字模数据为:1./* 字 */2. unsigned char code Bmp003[]=3. {4. /*------------------------------------------------------------5. ; 源文件 / 文字 : 字6. ; 宽×高(像素): 16×167. ; 字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/32字节8. ----------------------------------------------------------*/ 9.Bit7 ~Bit0B it7 ~Bit0 每个字16x2Byte10.0x02,0x00,0x01,0x00,0x3F,0xFC,0x20,0x04,0x40,0x08,0x1F,0xE0,0x00,0x40,0x00,0x80,11.0xFF,0xFF,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,12.};在这样的字模中,以两个字节表示一行像素点,16行构成一个字模。

如果使用LCD的画点函数,按位来扫描这些字模数据,把为1的位以黑色来显示(也可以使用其它颜色),即可把整个点阵还原出来,显示在液晶屏上。

5.3 制作字模我们采用“字模III-增强版v3.91”软件来制作中文字库,步骤如下:1.打开字模软件2.点击“自动批量生成字库”按钮选项。

软件界面左下角将出现一下几个按钮选项:3.点击选择“二级汉字库”按钮。

在“输入批量字符”框里面将会列出二级汉字的所有汉字,其中共收录了6768个汉字字符,非特殊情况下都能够满足大家的要求,如图:4.点击“字库智能生成”按钮,弹出“字库批量参数确认”对话框。

我们在“源字体”选项里面做如下设置,需要注意的是大小问题,因为我们本次的设计目标是实现16*16的汉字,所以在此选择’小四’字体。

设置好之后如下:5.点击“开始转换进程”按钮.就会在安装目录下或者你设置好的目录下生成.c后缀的字库文件。

6.对于LCD显示来说,只要能够在指定的位置描写制定颜色的点,那么就能够很好地根据汉字字模信息来描写汉字。

在此,为了能够更好的清楚字模的取向和高低位的排列顺序,我们可以现先在pc测试我们刚才制作好的库文件。

在这里我们取“当”字符的数据来测试。

VC6.0测试源码如下,该代码实现了把字模中为1的点都用数字“8”来表示:1.#include <stdio.h>2.3.unsigned char cc[] =4.{/*"当"字符*/5.0x00,0x80,0x10,0x90,0x08,0x98,0x0C,0x90,0x08,0xA0,0x00,0x80,0x3F,0xFC,0x00,0x04,6.0x00,0x04,0x1F,0xFC,0x00,0x04,0x00,0x04,0x00,0x04,0x3F,0xFC,0x00,0x04,0x00,0x007.};8.9.void main()10.{11.int i,j;12. unsigned char kk;13.for ( i=0; i<16; i++)14. {15.for(j=0; j<8; j++)16. {17. kk = cc[2*i] << j ; //左移J位18.19.if( kk & 0x80) //如果最高位为120. {21. printf("8");22. }23.else24. {25. printf(" ");26. }27. }28.29.for(j=0; j<8; j++)30. {31.32. kk = cc[2*i+1] << j ; //左移J位33.34.if( kk & 0x80) //如果最高位为135. {36. printf("8");37. }38.else39. {40. printf(" ");41. }42.43. }44.45. printf("\n");46.47. }48. printf("\n\n");49.50.}51.52.测试结果如下:看到以上的测试结果,相信大家对汉字的取模方向和高低位的排列顺序有了比较直观的了解。

7.回到“字模III-增强版v3.91”软件,采用与之前同样的方式生成bin格式的字库文件(即“生成格式”选项设置为“bin文件格式”)。

在软件安装目录下会生成Font.dat文件,我们用“WinHex”软件查看他的具体内容,与刚才制作的.c字库的文件内容是一致的,对比如下:将生成的汉字字库拷贝到SD卡根目录下并重命名为“HZLIB.bin”。

把该文件保存到SD卡中,STM32芯片通过文件系统读取文件即可获得字库的数据。

5.4. BMP图片格式使用LCD屏来显示BMP图片,就如同播放MP3文件一样,首先要了解其文件的格式。

BMP文件格式,又称为位图(Bitmap)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。

BMP 文件保存了一幅图像中所有的像素。

BMP格式可以保存单色位图、16色或256色索引模式像素图、24位真彩色图象,每种模式中单一像素点的大小分别为1/8字节,1/2字节,1字节和32字节。

目前最常见的是256位色BMP和24位色BMP。

BMP文件格式还定义了像素保存的几种方法,包括不压缩、RLE压缩等。

常见的BMP文件大多是不压缩的。

Windows所使用的BMP文件,在开始处有一个文件头,大小为54字节。

保存了包括文件格式标识、颜色数、图像大小、压缩方式等信息,因为我们仅讨论24位色不压缩的BMP,所以文件头中的信息基本不需要注意,只有“大小”这一项对我们比较有用。

图像的宽度和高度都是一个32位整数,在文件中的地址分别为0x0012和0x0016。

54个字节以后,如果是16色或256色BMP,则还有一个颜色表,但在24位色BMP文件则没有,我们这里不考虑。

接下来就是实际的像素数据了。

因此总的来说BMP图片的优点是简单。

5.4.1 BMP图片分析下面来用WinHex软件(跟UltraEdit软件功能类似)来分析一下BMP图像的文件内容:测试图片为123.bmp,先用ACDSee软件打开,查看图像,其图像内容见图 0-1。

图 0-1 测试图片可知,这幅图像的大小是15*8,是24位真彩色bmp图像。

接着使用WinHex软件打开,可读取到该文件的原始数据见图 0-2。

图 0-2 测试图片的原始数据1.文件头部信息部分(前面54字节)图 0-3 文件头部信息图 0-3,阴影部分是文件头部信息。

它可以分为两块:BMP文件头和位图信息头。

0~1字节BMP文件的 0和1字节用于表示文件的类型。

如果是位图文件类型,必须分别为0x42 和0x4D ,0x424D=’BM’。

3~14字节3到14字节的意义可以用一个结构体来描述。

如下:1.typedef struct tagBITMAPFILEHEADER2.{3.//attention: sizeof(DWORD)=4 sizeof(WORD)=24. DWORD bfSize; //文件大小5. WORD bfReserved1; //保留字,不考虑6. WORD bfReserved2; //保留字,同上7. DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和8.} BITMAPFILEHEADER,tagBITMAPFILEHEADER;14~53字节头部信息剩下的部分就是位图信息头,14到53字节内容的意义如下:1.typedef struct tagBITMAPINFOHEADER2.{3.//attention: sizeof(DWORD)=4 sizeof(WORD)=24.DWORD biSize; //指定此结构体的长度,为405.LONG biWidth; //位图宽,说明本图的宽度,以像素为单位6.LONG biHeight; //位图高,指明本图的高度,像素为单位7.WORD biPlanes; //平面数,为18.WORD biBitCount; //采用颜色位数,可以是1,2,4,8,16,24新的可以是329.DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩10.DWORD biSizeImage; //实际位图数据占用的字节数11.LONG biXPelsPerMeter; //X方向分辨率12.LONG biYPelsPerMeter; //Y方向分辨率13.DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数)14.DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的15.16.} BITMAPINFOHEADER,tagBITMAPINFOHEADER;由上述分析与WinHex软件的分析内容结合得到该图片的信息如下:文件大小:438保留字:0保留字:0实际位图数据的偏移字节数:54位图信息头:结构体的长度:40位图宽:15位图高:8biPlanes平面数:1biBitCount采用颜色位数:24压缩方式:0biSizeImage实际位图数据占用的字节数:0X方向分辨率:3780Y方向分辨率:3780使用的颜色数:0重要颜色数:02.图像像素数据部分(如果是24位真彩色,则54字节之后就是像素部分):图 0-4 图像像素数据有些读者可能已经发现,在像素部分夹杂着一些值为0的数据信息,如下图灰色部分所示:本例子中整张图片都是灰色的,为什么会有0像素的出现呢?对齐的数据,更容易被操作系统或者硬件调入cache,使得cache的命中率提高,从而提高访问效率。

相关文档
最新文档