OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9098|回复: 5

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

[复制链接]

20

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-6-10
在线时间
0 小时
发表于 2015-3-21 12:57:18 | 显示全部楼层 |阅读模式
5金钱
7寸的LCD 用旗舰版驱动正常, 移植到F407上就一直不行。不知道哪里出问题。

驱动代码如下 :  

[mw_shl_code=c,true]#include "ILI93XX.h" #include "Delay.h" //LCD的画笔颜色和背景色 u16 POINT_COLOR=0x0000; //画笔颜色 u16 BACK_COLOR=0xFFFF; //背景色 //管理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:颜色值 void LCD_WriteRAM(u16 RGB_Code) { LCD->LCD_RAM = RGB_Code;//写十六位GRAM } //读取个某点的颜色值 //x,y:坐标 //返回值:此点的颜色 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:要清屏的填充色 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的画笔颜色和背景色 extern u16 POINT_COLOR;//默认红色 extern u16 BACK_COLOR; //背景颜色.默认为白色 ////////////////////////////////////////////////////////////////////////////////// //-----------------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 //默认的扫描方向 //画笔颜色 #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 //棕色 #define BRRED 0XFC07 //棕红色 #define GRAY 0X8430 //灰色 //GUI颜色 #define DARKBLUE 0X01CF //深蓝色 #define LIGHTBLUE 0X7D7C //浅蓝色 #define GRAYBLUE 0X5458 //灰蓝色 //以上三色为PANEL的颜色 #define LIGHTGREEN 0X841F //浅绿色 //#define LIGHTGRAY 0XEF5B //浅灰色(PANNEL) #define LGRAY 0XC618 //浅灰色(PANNEL),窗体背景色 #define LGRAYBLUE 0XA651 //浅灰蓝色(中间层颜色) #define LBBLUE 0X2B12 //浅棕蓝色(选择条目的反色) 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]

最佳答案

查看完整内容[请看2#楼]

\探索者STM32F4光盘资料\9,增值资料\1,ALIENTEK 产品资料\3,ATK-7' TFTLCD电容触摸屏模块\2,程序源码
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-3-21 12:57:19 | 显示全部楼层
\探索者STM32F4光盘资料\9,增值资料\1,ALIENTEK 产品资料\3,ATK-7' TFTLCD电容触摸屏模块\2,程序源码
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-3-21 14:58:27 | 显示全部楼层
哪个七寸屏?我们的7寸屏有407的驱动的吧
开往春天的手扶拖拉机
回复

使用道具 举报

20

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-6-10
在线时间
0 小时
 楼主| 发表于 2015-3-21 16:21:03 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
就是原子店里买的7寸电容屏 ,。 有代码吗??在哪里?我怎么只知道旗舰版和,MINI开发板的驱动。
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5136
金钱
5136
注册时间
2014-8-26
在线时间
1316 小时
发表于 2015-3-21 18:41:10 | 显示全部楼层
探索者光盘/增值资料/ALIENTEK产品资料
回复

使用道具 举报

20

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2012-6-10
在线时间
0 小时
 楼主| 发表于 2015-3-21 23:24:43 | 显示全部楼层
谢谢~驱动了。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 10:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表