一。 硬件連接
二。 LCD&lcddev結(jié)構(gòu)體
LCD結(jié)構(gòu)體在LCD.h中定義
訪問LCD_REG,地址就是0x6C000000|0x000007FE,此時RS= 0,發(fā)送命令
訪問完LCD_REG后,結(jié)構(gòu)體指針自動加1,訪問LCD_RAM,內(nèi)部地址相應(yīng)加2,此時RS= 1,發(fā)送數(shù)據(jù)
lcd_dev結(jié)構(gòu)體介紹:
width和height為LCD的寬度和高度。
id為LCD的ID,比如9341等。
dir為LCD是豎屏還是橫屏的標(biāo)志,0為豎屏,1為橫屏。
wramcmd為開始寫gram指令。
setxcm為設(shè)置x坐標(biāo)指令。
setycmd為設(shè)置y坐標(biāo)指令。
例:對于id = 0x9341的LCD
//設(shè)置LCD顯示方向函數(shù)這個函數(shù)會在LCD初始化的最后進(jìn)行調(diào)用。
//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;
}
}
三。 底層接口函數(shù)
寫寄存器內(nèi)容函數(shù)是寫寄存器值函數(shù)+寫數(shù)據(jù)函數(shù)
//寫寄存器函數(shù)
//regval:寄存器值 RS= 0
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG=regval; //寫入要寫的寄存器序號
}
//寫 LCD 數(shù)據(jù)函數(shù) RS= 1
//data:要寫入的值
void LCD_WR_DATA(u16 data)
{
LCD->LCD_RAM=data;
}
//讀 LCD 數(shù)據(jù)函數(shù)
//返回值:讀到的值
u16 LCD_RD_DATA(void)
{
return LCD->LCD_RAM;
}
//寫寄存器函數(shù)
//LCD_Reg:寄存器地址
//LCD_RegValue:要寫入的數(shù)據(jù)
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{ LCD->LCD_REG = LCD_Reg; //寫入要寫的寄存器序號
LCD->LCD_RAM = LCD_RegValue; //寫入數(shù)據(jù)
}
//讀寄存器函數(shù)
//LCD_Reg:寄存器地址
//返回值:讀到的數(shù)據(jù)
u16 LCD_ReadReg(u8 LCD_Reg)
{ LCD_WR_REG(LCD_Reg); //寫入要讀的寄存器序號
delay_us(5);
return LCD_RD_DATA(); //返回讀到的值
}
//開始寫 GRAM函數(shù)
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
}
四。 初始化函數(shù)
FSMC設(shè)置:
readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立時間(ADDSET)為2個HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持時間(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0x0f; // 數(shù)據(jù)保存時間為16個HCLK,因為液晶驅(qū)動IC的 讀數(shù)據(jù)的時候,速度不能太快,尤其對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; ////數(shù)據(jù)保存時間為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 ,也就對應(yīng) BTCR[6],[7]。
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不復(fù)用數(shù) 據(jù)地址
FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM; //SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存儲器數(shù)據(jù) 寬度為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; // 存儲器寫 使能