ministm32f103开发版lcd显示实验和触摸屏_第1页
ministm32f103开发版lcd显示实验和触摸屏_第2页
ministm32f103开发版lcd显示实验和触摸屏_第3页
ministm32f103开发版lcd显示实验和触摸屏_第4页
ministm32f103开发版lcd显示实验和触摸屏_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

TFTLCD而且尺寸也较小。本章介绍ALIENTEK2.8寸TFTLCD模块,该模块采用TFTLCD面TFTLCDASCIILCDID,同时在LCD上面显示。本章分为如下几个部分:本章通过STM32的普通IO口模拟8080总线来控制TFTLCD的显示。TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:ThinFilmTransistor-LiquidCrystalDisy。TFT-LCD(TFT因此大大提高了图像质量。TFT-LCD也被叫做真彩液晶显示器。800*480分辨率为320×240,接口为1680并口,自带触摸屏。16.1.1ALIENTEK2.8寸TFTLCD图 图 16.1.3可以看出,ALIENTEKTFTLCD16位的并方式与外部连接,之所以列出了触摸屏的接口,关于触摸屏本章我们不多介绍,后面的章节会有详细的介绍。该模块的80并口有如下一些信号线:CS:TFTLCD片选信号。WRTFTLCD写入数据。RD:从TFTLCD数据。RST:硬复位TFTLCD。TFTLCDIO口数ALIENTEK提供2.8/3.5/4.3/7寸等不同尺寸的TFTLCD模块,其驱动有很多种类型,比:ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408LCD显示查看)ILI9341控制器为例进行介绍,其他178(20320188万色)下的显存量。在16位模式下,ILI9341采用RGB565格式颜色数据,此时ILI934118位数据线与MCU16位数据线以及LCDGRAM的对应关系如图16.1.4所示:图 从图中可以看出,ILI934116位模式下面,数据线有用的是:D17~D13和D11~D1,D0D12LCD模块里面,ILI9341D0和D12压根就没有引出来,这样,ILI9341的D17~D13D11~D1对应MCU的D15~D0。接下来,我们介绍一下ILI9341的几个重令,因为ILI9341令很多,我们这里就绍。介绍:0XD3,0X36,0X2A,0X2B,0X2C,0X2E等6条指令。01↑110100111↑1XXXXXXXXX1↑1000000001↑1100100111↑10100000116.1.10XD3刚好是我们控制器ILI9341LCD驱动器是什兼容不同驱动IC的屏,使得一个代码支持多款LCD。接下来看指令:0X36,这是控制指令,可以控制ILI9341器的读写方向,简单的说,就是在连续写GRAM的时候,可以控制GRAM指针的增长方向,从而控制显示方式(读GRAM也是一样16.1.201↑0011011011↑00016.1.20X36从上表可以看出,0X36指令后面,紧跟一个参数,这里我们主要关注:MY、MX、MV这三个位,通过这三个位的设置,我们可以ILI9341的全部扫描方向,如表16.1.3所000100010110001011101111这样,我们在利用ILI9341显示内容的时候,就有很大灵活性了,比如显示BMP,BMP数据,就是从的左下角开始,慢慢显示到右上角,如果设置LCD扫描方向为从下面,该指令用于设置横坐标(x坐标16.1.4所示:01↑0010101011↑11↑11↑11↑16.1.40X2ASCEC,即列地址的起始值和结束值,SCEC0≤SC/EC≤239。一般在设我们只需要设置一次即可(在初始化ILI9341的时候设置01↑0010101011↑11↑11↑11↑16.1.50X2B们只需要设置一次即可(在初始化ILI9341的时候设置,从而提高速度。01↑0010110011↑11↑11↑16.1.60X2C0X2C16LCDGRAMGRAMMY/MX/MV设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(SC,SP设置)后,每写入(SC++直到坐标:EC,EP结束,其间无需再次设置的坐标,从而大大提高写入速度。RAM该指令在ILI9341的上面的描述是有误的,真实的输出情况如表16.1.7所示:01↑001011101↑11↑11↑11↑11↑11↑116.1.70X2E数据,也就是无效的数据,第二次开始,到的才是有效的GRAM数据(从坐标:SC,SP开始82个颜色分量。比如:第一次输出是R1G1,随后的规律为:B1R2→G2B2→R3G3→B3R4→G4B4→R5G5...以此类推。如果我们只一般TFTLCD接下来该模块用来来显示字符和数字,通过以上介绍,我们可以得出TFTLCD显示需要TFTLCDIO口进行初始化,以便驱动LCD。这里需要根据连接电路以及TFTLCD模块的设置来确定。TFTLCDRSTSTM32的RESETRESET键,就,初始化之后,LCD才可以正常使用。TFTLCD模块的电路面已有详细说明了,这里我们介绍TFTLCD模块与ALIETEK16.2.1中圈出来的部分就是连接TFTLCD模块的接口,板上的接口比液晶模块的插针要这里的时候,是靠左插的,这个要注意。在硬件上,TFTLCDMiniSTM32IOLCD_LED对应LCD_CS对应LCD_RSLCD_WRLCD_RDLCD_D[17:1]对应这些线的连接,MiniSTM32TFTLCD模块插lcd.h里面的一个重要结构体u16u16 //LCD u16wramcmd; //开始写gram指令u16 u16 LCD14个字节的内存,但是却可以让我们的驱动函数LCDLCD横竖屏切换等重要功能,所以还是利大于弊的。有了以上了解,下面我们开始介绍ILI93xx.c里面的一些重要函数。}LCD_WR_DATAlcd.h里面,通过宏定义的方式申明。该函数通}里的‘\’正是起这个作用。在上面的函数中,LCD_RS_SET/LCD_CS_CLR/LCD_WR_CLR/{}给LCD_Init函数调用,从而大大减少flash占用量。voidLCD_WR_REG(u16{}voidLCD_WR_REG(u16{}该函数用 LCD控制器的寄存器数据(非GRAM数据该函数代码如下u16{u16 ;//PB0-7 ;//PB8-15上拉输入 //全部输出0 if(lcddev.id==0X8989)delay_us(2);//FOR8989,延时2us ;//PB0-7上拉输出 ;//PB8-15上拉输出GPIOB->ODR=0XFFFF;//全部输出高return}4个函数,用于实现LCD2LCD寄存器操作的函数,LCD_WriteReg和LCD_ReadReg,这两个函数代码如下: {}u16LCD_ReadReg(u16{ returnLCD_RD_DATA();}这两个函数函数十分简单,LCD_WriteReg用于向LCDLCD_ReadReg则用于指定寄存器的数据,这两个函数,都只带一个参数/返回值,所以,voidLCD_SetCursor(u16Xpos,u16{{}else{}else{{}}{ }LCD的背景色。LCD_DrawPoint函数虽然简单,但是至关重要,其他几乎所有上有了画点,当然还需要有读点的函数,第九个介绍的函数就是读点函数,用于LCD150K字节,这对任何一款单片机来说,都不是一个小数目了。而且我们在图形这样在做一些简单菜单的时候,是很有用的。这里我们TFTLCD模块数据的函数为LCD_ReadPoint,该函数直接返回读到的GRAM值。该函数使用之前要先设置的GRAM地址,通过LCD_SetCursoru16LCD_ReadPoint(u16x,u16{u16if(x>=lcddev.width||y>=lcddev.height)return0; LCD_WR_REG(0X2E);//9341/6804/3510/1963发送读GRAMelseif(lcddev.id==0X5510)LCD_WR_REG(0X2E00);//5510发送读GRAMelse //IC发送读GRAM //PB8-15 {;//PB0-7上拉输出;//PB8-15return}//dummy{ 的是RG的值 }else{ }; ;//PB8-15lcddev.id==0XB505)returnr; //这几种IC直接返回颜色值elseelsereturn }LCD_ReadPointLCD驱动器,所以,我们根据//size://size:voidLCD_ShowChar(u16x,u16y,u8num,u8size,u8{u16y0=y;{if(size==12)temp=asc2_1206[num][t];//调用1206字体elseif(size==16)temp=asc2_1608[num][t];//调用1608字体elseif(size==24)temp=asc2_2412[num][t];//调用2412字体else { {y=y0; }}}}asc2_2412、asc2_1206asc2_1608,最后,我们再介绍一下TFTLCD模块的初始化函数LCD_Init,该函数先初始化STM32与TFTLCD连接的IO口,然后LCD控制器的型号,根据控制IC的型号执行不同的初始化 的LCD液晶//本函数占用较大flash,可根据自己的实际情况,删掉未用到的LCD初始化代码.以节省空间.voidLCD_Init(void){GPIO_InitTypeDefGPIO_InitStructure;//PORTB,C时钟以及AFIO GPIO_Pin_8|GPIO_Pin_7|GPIO_Pin_6;PORTC6~10复用推挽输出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);//GPIOCGPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;//PORTB推挽输出GPIO_Init(GPIOB,&GPIO_InitStructure);//GPIOBGPIO_SetBits(GPIOB,GPIO_Pin_All);delay_ms(50);//delay50msLCD_WriteReg(0x0000,0x0001);//可以去掉delay_ms(50);//delay50lcddev.id=LCD_ReadReg(0x0000);{ { { //这里读回0X10 //也不是NT35310,尝试看看是不是NT35510{ lcddev.id|=LCD_RD_DATA();//读回0X00//8000H,为方便区分,5510{ //读回0X61}}}}}}{}else{} }elseifIC执口,那么将导致程序死在printf里面!!如果不想用printf,那么请注释掉它。 LCD_H#include"sys.h"typedef{u16width;u16height;u16id;u8u16wramcmd;u16setxcmd; //LCD

//LCD//LCD//LCDextern_lcd_devlcddevLCDextern extern ;//LCD_LED//LCD // //数据/ // //#define #defineL2R_U2D0//从左到右,从上到下#defineL2R_D2U1//从左到右,从下到上#defineR2L_U2D2//从右到左,从上到下#defineR2L_D2U3//从右到左,从下到上#defineU2D_L2R4//从上到下,从左到右#defineU2D_R2L5//从上到下,从右到左#defineD2U_L2R6//从下到上,从左到右#defineD2U_R2L7从下到上,从右到左#define #define #defineLBBLUE voidLCD_Init(void); //SSD1963LCD#define#define#define1#define#define#define1#defineSSD_VER_BACK_PORCH#define#defineSSD_VER_BACK_PORCH#define#defineSSD_HT #defineSSD_HPS(SSD_HOR_PULSE_WIDTH+SSD_HOR_BACK_PORCH)#defineSSD_VT }}sprintfprintfsprintf把打印内容输出到指定的内存区间上,sprintf的详细用法,请。则都会死机,即停在usart.c里面的fputc函数,出不来。16.4验将程序到MiniSTM32后,可以看到DS0不停的闪烁,提示程序已经在运行了。同时可以看到TFTLCD模块的显示如图16.4.1所示:了,达到了我们预期的目的。另外,本例程除了不支持CPLD7寸屏模块,其余所有的本章,介绍如何使用STM32来驱动触摸屏,ALIENTEKMiniSTM32开发板本身并TFTLCD模块来实现触摸屏控制。在本章中,向大家介绍STM32控制ALIENTKETFTLCD模块(包括电阻触摸与电容触摸,实现触摸屏驱动,最终实现一个手写板的功能。在面世之前,几乎清的都是使用电阻式触摸屏,电阻式触摸屏利用压力感XY两个从以上介绍可知,触摸屏都需要一个AD转换器,一般来说是需要一个控制器的。ALIENTEKTFTLCD模块选择的是四线电阻式触摸屏,这种触摸屏的控制有很多,包括:ADS7843、ADS7846、TSC2046、XPT2046和AK4182等。这几款的驱动基本上是一样的,也就是你只要写出了ADS7843的驱动,这个驱动对其他几个也是有效的。而且封装也有一样的,完全PINTOPIN兼容。所以在替换起来,很方便。ALIENTEKTFTLCD模块自带的触摸屏控制为XPT2046。XPT2046是一款4导线制触摸屏控制器,内含12位分辨率125KHz转换速率逐步近型A/D转换器。XPT2046支1.5V5.25VI/O接口。XPT2046能通过执行两次A/D转换查出被按的屏幕0V6V。XPT2046片XPT2046采用微小的封装形式:TSSOP-16,QFN-16(0.75mm厚度)VFBGA-48。工作温度该完全是兼容ADS7843和ADS7846的,关于这个的详细使用,可以参考这两个的datasheet。ITO制成的横向与纵向的扫描电极,这些电极和地之间就构成IC依次扫描纵向和横向电极,并X*Y的传感电极阵列形成一个传感格子,当手指靠近触摸输交互电容又叫做电容,它是在玻璃表面的横向和纵向的ITO电极的交叉处形成电X轴电极和Y26.1.2.1所示:26.1.2.1电容触摸屏的缺点:成本高、精度不高、能力差。ICIIC接口输出触摸数据的。ALIENTEK7TFTLCD15*10的驱动结构(10个模块有两种成触摸屏:1OTT2001AIC13*8的驱动结构(8个感应通道,17个驱动通道。5ALIENTEK4.37GT811/FT5206的驱动方法同这两款IC是类似的,大家可以参考着学习即可。OTT2001A是旭曜科技生产的一颗电容触摸屏驱动IC,最多支持208个通道。支SPI/IIC接口,在ALIENTEK4.3TFTLCD电容触摸屏上,OTT2001A104个通,INT断输出信号,关于IIC我们就不详细介绍了,请参考第二十九章。9接下来,介绍一下OTT2001A的几个重要的寄存器。据,该寄存器各位描述如表26.1.2.1所示:位说明位说明26.1.2.1ID如果读到的全是0,则说明没有任何触摸。(ODH26.1.2.2从表中可以看出,每个坐标的值,可以通过4个寄存器读出,比如坐标1(X1,从而提高速度。OTT2001A相关寄存器的介绍就介绍到这里,更详细的资料,请参考:OTT2001AIIC协议指导.pdf这个文档。OTT2001A只需要经过简单的初始化就可以正常使用了,初始化流1,OTT2001A816位(高八位有效,2,OTT2001A的输出坐标,默认是以:X2700,Y1500的分辨率输出的,也就是输出范围为:X:0~2700,Y:0~1500;MCU在到坐标后,必须根据LCD分辨率做一个换算,才能得到真实的LCD坐标。下面我们简单介GT9147,该是汇顶科技研发的一颗电容触摸屏驱动IC,不过,GT9147IIC0X140X5D5msINT.pdf0X14作为器件地址(不含最低位,换算成读写命令则是读:0X29,写:0X28,接下来,介绍一下GT9147的几个重要的寄存器。即可正常坐标数据(并且会结束软复位。GT9147的配置。由于GT9147可以保存配置信息(FLASH,从而不需要每次上电都更新配置,我们有几点注意的地方提醒大家:1,0X8047寄存器用于指示配置文件版用于控制是否将配置保存在本地,写0,则不保存配置,写1则保存配置。是:9,1,4,7符(ASCII码格式。因此,我们可以通过这4个寄存器的值,来判断驱动IC的型号,从而判断是OTT2001A还是GT9147,以便执行不同的初始化。26.1.2.3,buffer26.1.2.41我们一般只用到触点的x,y坐标,所以只需要0X8150~0X8153的数据,组合即可4组分别是:0X8158、0X8160、0X81680X817016个寄2~4GT9147也支持寄存器地址自增,我们只需要发送寄存器组的首地址,然后连续即可,GT9147会自动地址自增,从而提高速度。GT9147只需要经过简单的初始化就可以正常使用了,初始化流程:硬复位→延时位。此时GT9147即可正常使用了。本章实验功能简介:开机的时候先初始化LCD,LCDID,随后,根据LCDID判断是电阻触摸屏还是电容触摸屏,如果是电阻触摸屏,则先24C02的数据判断触摸屏OTT2001A7寸电容触摸屏(仅KEY0KEY0就会进入强制校准程序。所有这些资源与STM32的连接图,面都已经介绍了,这里我们只针对TFTLCD模与STM32连接,连接电路图如图26.2.1所示:PC2、PC0、PC13PC1到五根线了,而是四根线,分别是:T_PEN(CT_INT)、T_CS(CT_RST)、T_CLK(CT_SCL)和的:中断输出信号、复位信号,IIC的SCL和SDA信号。这里,我们用查询的方式地址设定,所以需要4根线连接。ott2001a.cott2001a.h等六个文件,并保存在TOUCH分组下面。其中,touch.ctouch.h 过 u8TP_Read_XY2(u16*x,u16*y){u8flag;u8TP_Read_XY2(u16*x,u16*y){u8flag;{return1;}elsereturn}void{ cnt=0;u16d1,d2;u32tem1,tem2; TP_Drow_Touch_Point(20,20,RED);//画点1{ {case case);//清除点 case 清除点3case {tem1*=tem1;tem2*=tem2;tem1*=tem1;tem2*=tem2;{WHITE);//清除点4TP_Drow_Touch_Point(20,20,RED);//画点1gotoREADJ;//不合格,重新校准}}gotoREADJ;//不合格,重新校准}}pos_temp[0][0]);//得到xfacpos_temp[0][0]))/2;//得到xoffpos_temp[0][1]);//得到yfacpos_temp[0][1]))/2;//得到yoff{WHITE);//清除点4 //画点1"TPNeedreadjust!");if(tp_dev.touchtype)//X,Y方向与屏幕相反{}elseCMD_RDX=0XD0;CMD_RDY=0X90;与屏相同"TouchScreenAdjustOK!");//校正完成delay_ms(1000);TP_Save_Adjdata();}}}}(2020(220300摸屏中读出的是点的物理坐标,其坐标轴的方向、XY值的比例因子、偏移量都与LCD坐标不同,所以,需要在程序中把物理坐标首先转换为像素坐标,然后再赋给POS结构,达(yfac分别是X轴方向和Y轴方向的比例因子,而xoffyoff则是这两个方向的偏移量。4个点(这四个点的坐标是已知的4xfac、yfac、xoff、TP_Adjust就是根据上面的原理设计的校准函数,注意该函数里面多次使用了lcddev.widthlcddev.heightLCD(比如320*240、480*320和800*480的屏都可以兼容。returnreturn}else{return{GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_Init(GPIOC,&GPIO_InitStructure); //PC0~313全部上拉 AT24CXX_Init();//初始化24CXXif(TP_Get_Adjdata())return0;//已经校准 { }}return}的,如果是电阻屏则用默认的即可,如果是电容屏,则指向新的扫描函数GT9147_Scan、OTT2001A_Scan或FT5206_Scan(根据ID判断到底指向那个,执行电容触摸屏的扫#ifndef#ifndefTOUCH_H#defineTOUCH_H#include"sys.h"#include#include#defineTP_PRES_DOWN0x80 #defineCT_MAX_TOUCH typedefstruct{u8 u8 void(*adjust)(void); u16x[CT_MAX_TOUCH];//当前坐标////此次扫描时,触屏的坐标,用x[4],y[4] floatxfac;floatyfac;shortxoff;short//b0:0,竖屏(适合左右为X坐标,上下为Y坐标的 1,横屏(适合左右为Y坐标,上下为X坐标的 u8extern_m_tp_dev #definePEN PCin(1) #defineDOUTPCin(2) #defineTDINPCout(3) #defineTCLKPCout(0) #defineTCS voidvoidTP_Drow_Touch_Point(u16x,u16y,u16color);//voidTP_Draw_Big_Point(u16x,u16y,u16voidvoidTP_Adjust(void);voidTP_Adj_Info_Show(u16x0,u16y0,u16x1,u16y1,u16x2,u16y2,u16x3,u16u8TP_Scan(u8的相关成员函数/变量屏即可达到需要的效果,这种设计简化了接口,且方便管理和,u8OTT2001A_WR_Reg(u16u8OTT2001A_WR_Reg(u16reg,u8*buf,u8{u8i;u8ret=0;CT_IIC_Send_Byte(reg>>8);CT_IIC_Wait_Ack();CT_IIC_Send_Byte(reg&0XFF);CT_IIC_Wait_Ack();{ } returnret;}voidOTT2001A_RD_Reg(u16reg,u8*buf,u8{u8i;CT_IIC_Send_Byte(OTT_CMD_WR);CT_IIC_Wait_Ack(); //发送写命令CT_IIC_Send_Byte(reg>>8);CT_IIC_Wait_Ack(); CT_IIC_Send_Byte(reg&0XFF);CT_IIC_Wait_Ack(); CT_IIC_Send_Byte(OTT_CMD_RD);CT_IIC_Wait_Ack(); for(i=0;i<len;i++)buf[i]=CT_IIC_Read_Byte(i==(len-1)?0:1);//发数据}{u8regval=0X00;}u8OTT2001A_Init(void){u8 钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; //PC1输入GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStructure);= //PC13GPIO_Init(GPIOC,&GPIO_InitStructure); OTT_RST=0;delay_ms(100); if(regval&0x80)return0;return}u8OTT2001A_Scan(u8{u8i=0;u8res=0;{ {{ { XY{{}

}}// //触发一次,10次,}}{{{}}return}OTT2001A,这里特别注意寄存器地址是16位的,与OTT2001A手册介绍的是有出入的,必须16位才能正常操作。另外,重点介OTT2001A_Scan函数,OTT2001A_Scan函数用于扫描电容触摸屏是否有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论