23. LCD液晶顯示實(shí)驗(yàn)
一。 硬件連接
二。 LCD&lcddev結(jié)構(gòu)體
LCD結(jié)構(gòu)體在LCD.h中定義
訪問(wèn)LCD_REG,地址就是0x6C000000|0x000007FE,此時(shí)RS= 0,發(fā)送命令
訪問(wèn)完LCD_REG后,結(jié)構(gòu)體指針自動(dòng)加1,訪問(wèn)LCD_RAM,內(nèi)部地址相應(yīng)加2,此時(shí)RS= 1,發(fā)送數(shù)據(jù)
lcd_dev結(jié)構(gòu)體介紹:
width和height為L(zhǎng)CD的寬度和高度。
id為L(zhǎng)CD的ID,比如9341等。
dir為L(zhǎng)CD是豎屏還是橫屏的標(biāo)志,0為豎屏,1為橫屏。
wramcmd為開(kāi)始寫(xiě)gram指令。
setxcm為設(shè)置x坐標(biāo)指令。
setycmd為設(shè)置y坐標(biāo)指令。
例:對(duì)于id = 0x9341的LCD
//設(shè)置LCD顯示方向函數(shù)這個(gè)函數(shù)會(huì)在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ù)
寫(xiě)寄存器內(nèi)容函數(shù)是寫(xiě)寄存器值函數(shù)+寫(xiě)數(shù)據(jù)函數(shù)
//寫(xiě)寄存器函數(shù)
//regval:寄存器值 RS= 0
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG=regval; //寫(xiě)入要寫(xiě)的寄存器序號(hào)
}
//寫(xiě) LCD 數(shù)據(jù)函數(shù) RS= 1
//data:要寫(xiě)入的值
void LCD_WR_DATA(u16 data)
{
LCD->LCD_RAM=data;
}
//讀 LCD 數(shù)據(jù)函數(shù)
//返回值:讀到的值
u16 LCD_RD_DATA(void)
{
return LCD->LCD_RAM;
}
//寫(xiě)寄存器函數(shù)
//LCD_Reg:寄存器地址
//LCD_RegValue:要寫(xiě)入的數(shù)據(jù)
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue)
{ LCD->LCD_REG = LCD_Reg; //寫(xiě)入要寫(xiě)的寄存器序號(hào)
LCD->LCD_RAM = LCD_RegValue; //寫(xiě)入數(shù)據(jù)
}
//讀寄存器函數(shù)
//LCD_Reg:寄存器地址
//返回值:讀到的數(shù)據(jù)
u16 LCD_ReadReg(u8 LCD_Reg)
{ LCD_WR_REG(LCD_Reg); //寫(xiě)入要讀的寄存器序號(hào)
delay_us(5);
return LCD_RD_DATA(); //返回讀到的值
}
//開(kāi)始寫(xiě) GRAM函數(shù)
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG=lcddev.wramcmd;
}
//LCD寫(xiě)GRAM
//RGB_Code:顏色值
void LCD_WriteRAM(u16 RGB_Code)
{
LCD->LCD_RAM = RGB_Code;//寫(xiě)十六位GRAM
}
四。 初始化函數(shù)
FSMC設(shè)置:
readWriteTiming.FSMC_AddressSetupTime = 0x01; //地址建立時(shí)間(ADDSET)為2個(gè)HCLK 1/36M=27ns
readWriteTiming.FSMC_AddressHoldTime = 0x00; //地址保持時(shí)間(ADDHLD)模式A未用到
readWriteTiming.FSMC_DataSetupTime = 0x0f; // 數(shù)據(jù)保存時(shí)間為16個(gè)HCLK,因?yàn)橐壕?qū)動(dòng)IC的 讀數(shù)據(jù)的時(shí)候,速度不能太快,尤其對(duì)1289這個(gè)IC。
readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
readWriteTiming.FSMC_CLKDivision = 0x00;
readWriteTiming.FSMC_DataLatency = 0x00;
readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
writeTiming.FSMC_AddressSetupTime = 0x00; //地址建立時(shí)間(ADDSET)為1個(gè)HCLK
writeTiming.FSMC_AddressHoldTime = 0x00; //地址保持時(shí)間(A
writeTiming.FSMC_DataSetupTime = 0x03; ////數(shù)據(jù)保存時(shí)間為4個(gè)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 ,也就對(duì)應(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;//存儲(chǔ)器數(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; // 存儲(chǔ)器寫(xiě) 使能





