23. LCD液晶显示实验
扫描二维码
随时随地手机看文章
一。 硬件连接
二。 LCD&lcddev结构体
LCD结构体在LCD.h中定义
访问LCD_REG,地址就是0x6C000000|0x000007FE,此时RS= 0,发送命令
访问完LCD_REG后,结构体指针自动加1,访问LCD_RAM,内部地址相应加2,此时RS= 1,发送数据
lcd_dev结构体介绍:
width和height为LCD的宽度和高度。
id为LCD的ID,比如9341等。
dir为LCD是竖屏还是横屏的标志,0为竖屏,1为横屏。
wramcmd为开始写gram指令。
setxcm为设置x坐标指令。
setycmd为设置y坐标指令。
例:对于id = 0x9341的LCD
//设置LCD显示方向函数这个函数会在LCD初始化的最后进行调用。
//dir = 0,竖屏,dir = 1,横屏
void LCD_Display_Dir(u8 dir)
{
if (dir == 0) //竖屏
{
lcddev.dir = 0; //竖屏
lcddev.width = 240;
lcddev.height = 320;
lcddev.wramcmd = 0x2C;
lcddev.setxcmd = 0x2A;
lcddev.setycmd = 0x2B;
}
else //横屏
{
lcddev.dir = 1; //横屏
lcddev.width = 320;
lcddev.height = 240;
lcddev.wramcmd = 0x2C;
lcddev.setxcmd = 0x2A;
lcddev.setycmd = 0x2B;
}
}
三。 底层接口函数
写寄存器内容函数是写寄存器值函数+写数据函数
//写寄存器函数
//regval:寄存器值 RS= 0
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG=regval; //写入要写的寄存器序号
}
//写 LCD 数据函数 RS= 1
//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_WR_REG(LCD_Reg); //写入要读的寄存器序号
delay_us(5);
return LCD_RD_DATA(); //返回读到的值
}
//开始写 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
}
四。 初始化函数
FSMC设置:
readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持时间(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0x0f; // 数据保存时间为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 = 0x03; ////数据保存时间为4个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; // 存储器写 使能