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]
一周热门 更多>