7寸电容屏F407下的驱动问题。

2019-07-21 03:39发布

7寸的LCD 用旗舰版驱动正常, 移植到F407上就一直不行。不知道哪里出问题。

驱动代码如下 :  

[mw_shl_code=c,true]#include "ILI93XX.h" #include "Delay.h" //LCD的画笔颜 {MOD}和背景 {MOD} u16 POINT_COLOR=0x0000; //画笔颜 {MOD} u16 BACK_COLOR=0xFFFF; //背景 {MOD} //管理LCD重要参数 //默认为竖屏 _lcd_dev lcddev; //写寄存器函数 //regval:寄存器值 void LCD_WR_REG(u16 regval) { LCD->LCD_REG=regval;//写入要写的寄存器序号 } //写LCD数据 //data:要写入的值 void LCD_WR_DATA(u16 data) { LCD->LCD_RAM=data; } //读LCD数据 //返回值:读到的值 u16 LCD_RD_DATA(void) { return LCD->LCD_RAM; } //写寄存器 //LCD_Reg:寄存器地址 //LCD_RegValue:要写入的数据 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue) { LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号 LCD->LCD_RAM = LCD_RegValue;//写入数据 } //读寄存器 //LCD_Reg:寄存器地址 //返回值:读到的数据 u16 LCD_ReadReg(u8 LCD_Reg) { LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号 return LCD->LCD_RAM; } //开始写GRAM void LCD_WriteRAM_Prepare(void) { LCD->LCD_REG=lcddev.wramcmd; } //LCD写GRAM //RGB_Code:颜 {MOD}值 void LCD_WriteRAM(u16 RGB_Code) { LCD->LCD_RAM = RGB_Code;//写十六位GRAM } //读取个某点的颜 {MOD}值 //x,y:坐标 //返回值:此点的颜 {MOD} u16 LCD_ReadPoint(u16 x,u16 y) { u16 t=0; LCD_SetCursor(x,y); while(t<0X1FFF) { if(LCD->LCD_REG&0x0001)break; t++; } return LCD->LCD_RAM; } //LCD背光设置 //pwm:背光等级,0~63.越大越亮. void LCD_BackLightSet(u8 pwm) { lcddev.sysreg&=~0X003F; //清除之前的设置 lcddev.sysreg|=pwm&0X3F; //设置新的值 LCD_WriteReg(LCD_PREF,lcddev.sysreg); //写LCD_PREF寄存器 } //扫描方向上,X的终点坐标. void LCD_EndXSet(u16 x) { LCD_WriteReg(LCD_END_X,x); //设置X终坐标 } //LCD开启显示 void LCD_DisplayOn(void) { LCD_WriteReg(LCD_PREF,lcddev.sysreg); //恢复LCD_PREF寄存器 } //LCD关闭显示 void LCD_DisplayOff(void) { LCD_WriteReg(LCD_PREF,0); //关闭TFT,相当于把背光关掉,无背光,无显示 } //设置当前显示层 //layer:当前显示层 void LCD_SetDisplayLayer(u16 layer) { lcddev.sysreg&=~0X0E00; //清除之前的设置 lcddev.sysreg|=(layer&0X07)<<9; //设置新的值 LCD_WriteReg(LCD_PREF,lcddev.sysreg); //写LCD_PREF寄存器 } //设置当前操作层 //layer:当前显示层 void LCD_SetOperateLayer(u16 layer) { lcddev.sysreg&=~0X7000; //清除之前的设置 lcddev.sysreg|=(layer&0X07)<<12; //设置新的值 LCD_WriteReg(LCD_PREF,lcddev.sysreg); //写LCD_PREF寄存器 } //设置光标位置 //Xpos:横坐标 //Ypos:纵坐标 void LCD_SetCursor(u16 Xpos, u16 Ypos) { LCD_WriteReg(lcddev.setycmd,Ypos); //设置Y坐标 LCD_WriteReg(lcddev.setxcmd,Xpos); //设置X坐标 } //设置LCD的自动扫描方向 //注意:我们的驱动器,只支持左右扫描设置,不支持上下扫描设置 void LCD_Scan_Dir(u8 dir) { switch(dir) { case L2R_U2D: //从左到右,从上到下 LCD_WriteReg(LCD_MIRROR,1); //写LCD_PREF寄存器 break; case L2R_D2U: //从左到右,从下到上 LCD_WriteReg(LCD_MIRROR,3); //写LCD_PREF寄存器 break; case R2L_U2D: //从右到左,从上到下 LCD_WriteReg(LCD_MIRROR,0); //写LCD_PREF寄存器 break; case R2L_D2U: //从右到左,从下到上 LCD_WriteReg(LCD_MIRROR,2); //写LCD_PREF寄存器 break; default: //其他,默认从左到右,从上到下 LCD_WriteReg(LCD_MIRROR,1); //写LCD_PREF寄存器 break; } } //设置LCD显示方向(7寸屏,不能简单的修改为横屏显示) //dir:0,竖屏;1,横屏 void LCD_Display_Dir(u8 dir) { } //设置窗口,并自动设置画点坐标到窗口左上角(sx,sy). //sx,sy:窗口起始坐标(左上角) //width,height:窗口宽度和高度,必须大于0!! //窗体大小:width*height. //68042,横屏时不支持窗口设置!! void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height) { LCD_EndXSet(sx+width-1); LCD_SetCursor(sx,sy); //设置光标位置 } //初始化lcd //该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!! //在其他型号的驱动芯片上没有测试! void LCD_Init(void) { u16 i; GPIO_InitTypeDef GPIO_InitStructure; FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef readWriteTiming; FSMC_NORSRAMTimingInitTypeDef writeTiming; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟 RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOG, ENABLE); //使能PB,PD,PE,PG端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PF12,FSMC_A6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 //PORTD复用推挽输出 GPIO_InitStructure.GPIO_Pin = (3<<0)|(3<<4)|(7<<8)|(3<<14);//PD0,1,4,5,8,9,10,14,15 AF OUT GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化 //PORTE复用推挽输出 GPIO_InitStructure.GPIO_Pin = (0X1FF<<7);//PE7~15,AF OUT GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化 // //PORTG12复用推挽输出 A0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PF12,FSMC_A6 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化 readWriteTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到 readWriteTiming.FSMC_DataSetupTime = 0x03; // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。 readWriteTiming.FSMC_BusTurnAroundDuration = 0x00; readWriteTiming.FSMC_CLKDivision = 0x00; readWriteTiming.FSMC_DataLatency = 0x00; readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立时间(ADDSET)为1个HCLK writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(A writeTiming.FSMC_DataSetupTime = 0x01; ////数据保存时间为2个HCLK writeTiming.FSMC_BusTurnAroundDuration = 0x00; writeTiming.FSMC_CLKDivision = 0x00; writeTiming.FSMC_DataLatency = 0x00; writeTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;// 这里我们使用NE4 ,也就对应BTCR[6],[7]。 FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址 FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; // 存储器写使能 FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序 FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序 FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming; //写时序 FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); //初始化FSMC配置 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); // 使能BANK1 LCD_RST=0; delay_ms(100); LCD_RST=1; while(i<0X1FFF) { if(LCD_RD_DATA()&0x0001)break;//等待控制器准备好 i++; } lcddev.setxcmd=LCD_CUR_X; //设置写X坐标指令 lcddev.setycmd=LCD_CUR_Y; //设置写Y坐标指令 lcddev.wramcmd=LCD_PIXELS; //设置写入GRAM的指令 lcddev.width=800; //设置宽度 lcddev.height=480; //设置高度 LCD_Scan_Dir(L2R_U2D); //设置默认扫描方向. LCD_SetDisplayLayer(0); //显示层为0 LCD_SetOperateLayer(0); //操作层也为0 LCD_EndXSet(799); //x终点坐标为800 LCD_BackLightSet(63); //背光设置为最亮 LCD_DisplayOn(); LCD_Clear(RED); //清屏 } //清屏函数 //color:要清屏的填充 {MOD} void LCD_Clear(u16 color) { u32 index=0; u32 totalpoint=lcddev.width; totalpoint*=lcddev.height; //得到总点数 LCD_SetCursor(0x00,0x0000); //设置光标位置 LCD_WriteRAM_Prepare(); //开始写入GRAM for(index=0;index<totalpoint;index++) { LCD->LCD_RAM=color; } } [/mw_shl_code]


[mw_shl_code=c,true]#ifndef __ILI93XX_H #define __ILI93XX_H #include <stm32f4xx.h> #include "RCC_Configuration.h" #include "stdlib.h" ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK STM32开发板 //7寸 TFT液晶驱动 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2014/4/1 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved //******************************************************************************** //无 ////////////////////////////////////////////////////////////////////////////////// //LCD重要参数集 typedef struct { u16 width; //LCD 宽度 u16 height; //LCD 高度 u16 id; //LCD ID(ATK-7' TFTLCD不支持id读) u8 dir; //横屏还是竖屏控制:0,竖屏;1,横屏。 u16 sysreg; //PREF寄存器,设置当前操作页,显示页和背光等(ATK-7' TFTLCD暂不支持横竖屏设置,统一为横屏)。 u16 wramcmd; //开始写gram指令 u16 setxcmd; //设置x坐标指令 u16 setycmd; //设置y坐标指令 }_lcd_dev; //LCD参数 extern _lcd_dev lcddev; //管理LCD重要参数 //LCD的画笔颜 {MOD}和背景 {MOD} extern u16 POINT_COLOR;//默认红 {MOD} extern u16 BACK_COLOR; //背景颜 {MOD}.默认为白 {MOD} ////////////////////////////////////////////////////////////////////////////////// //-----------------LCD端口定义---------------- #define LCD_LED PCout(0) //LCD背光不由IO口控制,有驱动器自己控制,通过指令设置 #define LCD_RST PBout(0) //LCD复位口,和开发板共用,这里设置为PB0,其实并没有用到 //LCD地址结构体 typedef struct { u16 LCD_REG; u16 LCD_RAM; } LCD_TypeDef; //使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线 //注意设置时STM32内部会右移一位对其! 111110=0X3E #define LCD_BASE ((u32)(0x6C000000 | 0x0000007E)) #define LCD ((LCD_TypeDef *) LCD_BASE) ////////////////////////////////////////////////////////////////////////////////// //LCD 指令定义 #define LCD_CUR_Y 0X00 #define LCD_CUR_X 0X01 #define LCD_PIXELS 0X02 #define LCD_END_X 0X03 #define LCD_PREF 0X05 #define LCD_MIRROR 0X07 ////////////////////////////////////////////////////////////////////////////////// //扫描方向定义 #define L2R_U2D 0 //从左到右,从上到下 #define L2R_D2U 1 //从左到右,从下到上 #define R2L_U2D 2 //从右到左,从上到下 #define R2L_D2U 3 //从右到左,从下到上 #define U2D_L2R 4 //从上到下,从左到右 #define U2D_R2L 5 //从上到下,从右到左 #define D2U_L2R 6 //从下到上,从左到右 #define D2U_R2L 7 //从下到上,从右到左 #define DFT_SCAN_DIR L2R_U2D //默认的扫描方向 //画笔颜 {MOD} #define WHITE 0xFFFF #define BLACK 0x0000 #define BLUE 0x001F #define BRED 0XF81F #define GRED 0XFFE0 #define GBLUE 0X07FF #define RED 0xF800 #define MAGENTA 0xF81F #define GREEN 0x07E0 #define CYAN 0x7FFF #define YELLOW 0xFFE0 #define BROWN 0XBC40 //棕 {MOD} #define BRRED 0XFC07 //棕红 {MOD} #define GRAY 0X8430 //灰 {MOD} //GUI颜 {MOD} #define DARKBLUE 0X01CF //深蓝 {MOD} #define LIGHTBLUE 0X7D7C //浅蓝 {MOD} #define GRAYBLUE 0X5458 //灰蓝 {MOD} //以上三 {MOD}为PANEL的颜 {MOD} #define LIGHTGREEN 0X841F //浅绿 {MOD} //#define LIGHTGRAY 0XEF5B //浅灰 {MOD}(PANNEL) #define LGRAY 0XC618 //浅灰 {MOD}(PANNEL),窗体背景 {MOD} #define LGRAYBLUE 0XA651 //浅灰蓝 {MOD}(中间层颜 {MOD}) #define LBBLUE 0X2B12 //浅棕蓝 {MOD}(选择条目的反 {MOD}) void LCD_Init(void); //初始化 void LCD_DisplayOn(void); //开显示 void LCD_DisplayOff(void); //关显示 void LCD_Clear(u16 Color); //清屏 void LCD_SetCursor(u16 Xpos, u16 Ypos); //设置光标 u16 LCD_ReadPoint(u16 x,u16 y); //读点 void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue); u16 LCD_ReadReg(u8 LCD_Reg); void LCD_WriteRAM_Prepare(void); void LCD_WriteRAM(u16 RGB_Code); void LCD_Scan_Dir(u8 dir); //设置屏扫描方向 void LCD_Display_Dir(u8 dir); //设置屏幕显示方向 void LCD_BackLightSet(u8 pwm); //设置背光 void LCD_EndXSet(u16 x); //设置X终点坐标 void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height);//设置窗口 void LCD_SetDisplayLayer(u16 layer); void LCD_SetOperateLayer(u16 layer); #endif [/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。