零死角玩转stm32-高级篇5、3.2寸液晶显示(中英文+图片)
- 格式:pdf
- 大小:1.20 MB
- 文档页数:30
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显示汉字精讲本文是一个自学者的学习心得,通过大白话解释写代码,欢迎指教。
主要应用目的是在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的液晶与触摸屏显示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数组。
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接口的哪种模式。
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地。
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的液晶与触摸屏显示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数组。
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 开发板例程文档———图片及字符显示例程实验图片及字符显示例程实验平台:奋斗版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的显示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是独立的,可用于扩展不同类型的存储器。
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接口的哪种模式。
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是很重要的。
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的命中率提高,从而提高访问效率。