关键代码: lcd。c写寄存器函数regval:寄存器值voidLCDWRREG(vu16regval){regvalregval;使用O2优化的时候,必须插入的延时LCDLCDREGregval;写入要写的寄存器序号}写LCD数据data:要写入的值voidLCDWRDATA(vu16data){datadata;使用O2优化的时候,必须插入的延时LCDLCDRAMdata;}读LCD数据返回值:读到的值u16LCDRDDATA(void){vu16ram;防止被优化ramLCDLCDRAM;returnram;}写寄存器LCDReg:寄存器地址LCDRegValue:要写入的数据voidLCDWriteReg(u16LCDReg,u16LCDRegValue){LCDLCDREGLCDReg;写入要写的寄存器序号LCDLCDRAMLCDRegValue;写入数据}读寄存器LCDReg:寄存器地址返回值:读到的数据u16LCDReadReg(u16LCDReg){LCDWRREG(LCDReg);写入要读的寄存器序号delayus(5);returnLCDRDDATA();返回读到的值}开始写GRAMvoidLCDWriteRAMPrepare(void){LCDLCDREGlcddev。wramcmd;}LCD写GRAMRGBCode:颜色值voidLCDWriteRAM(u16RGBCode){LCDLCDRAMRGBCode;写十六位GRAM}读取个某点的颜色值x,y:坐标返回值:此点的颜色u16LCDReadPoint(u16x,u16y){u16r0,g0,b0;if(xlcddev。widthylcddev。height)return0;超过了范围,直接返回LCDSetCursor(x,y);if(lcddev。id0X5510)5510发送读GRAM指令{LCDWRREG(0X2E00);}else其他IC(9341531019637789)发送读GRAM指令{LCDWRREG(0X2E);}rLCDRDDATA();dummyReadif(lcddev。id0X1963)对1963来说,是真读{returnr;1963直接读就可以}rLCDRDDATA();实际坐标颜色9341531055107789要分2次读出bLCDRDDATA();gr0XFF;对于9341531055107789,第一次读取的是RG的值,R在前,G在后,各占8位g8;return(((r11)11)((g10)5)(b11));9341531055107789需要公式转换一下}LCD开启显示voidLCDDisplayOn(void){if(lcddev。id0X5510)5510开启显示指令{LCDWRREG(0X2900);开启显示}else9341531019637789等发送开启显示指令{LCDWRREG(0X29);开启显示}}LCD关闭显示voidLCDDisplayOff(void){if(lcddev。id0X5510)5510关闭显示指令{LCDWRREG(0X2800);关闭显示}else9341531019637789等发送关闭显示指令{LCDWRREG(0X28);关闭显示}}设置光标位置Xpos:横坐标Ypos:纵坐标voidLCDSetCursor(u16Xpos,u16Ypos){934153107789等设置坐标{LCDWRREG(lcddev。setxcmd);LCDWRDATA(Xpos8);LCDWRDATA(Xpos0XFF);LCDWRREG(lcddev。setycmd);LCDWRDATA(Ypos8);LCDWRDATA(Ypos0XFF);}}画点x,y:坐标POINTCOLOR:此点的颜色voidLCDDrawPoint(u16x,u16y){LCDSetCursor(x,y);设置光标位置LCDWriteRAMPrepare();开始写入GRAMLCDLCDRAMPOINTCOLOR;}SSD1963背光设置pwm:背光等级,0100。越大越亮。voidLCDSSDBackLightSet(u8pwm){LCDWRREG(0xBE);配置PWM输出LCDWRDATA(0x05);1设置PWM频率LCDWRDATA(pwm2。55);2设置PWM占空比LCDWRDATA(0x01);3设置CLCDWRDATA(0xFF);4设置DLCDWRDATA(0x00);5设置ELCDWRDATA(0x00);6设置F}初始化lcd该初始化函数可以初始化各种ILI93XX液晶,但是其他函数是基于ILI9320的!!!在其他型号的驱动芯片上没有测试!voidLCDInit(void){vu32i0;GPIOInitTypeDefGPIOInitStructure;FSMCNORSRAMInitTypeDefFSMCNORSRAMInitStructure;FSMCNORSRAMTimingInitTypeDefreadWriteTiming;FSMCNORSRAMTimingInitTypeDefwriteTiming;RCCAHB1PeriphClockCmd(RCCAHB1PeriphGPIOBRCCAHB1PeriphGPIODRCCAHB1PeriphGPIOERCCAHB1PeriphGPIOFRCCAHB1PeriphGPIOG,ENABLE);使能PD,PE,PF,PG时钟RCCAHB3PeriphClockCmd(RCCAHB3PeriphFSMC,ENABLE);使能FSMC时钟GPIOInitStructure。GPIOPinGPIOPin15;PB15推挽输出,控制背光GPIOInitStructure。GPIOModeGPIOModeOUT;普通输出模式GPIOInitStructure。GPIOOTypeGPIOOTypePP;推挽输出GPIOInitStructure。GPIOSpeedGPIOSpeed50MHz;100MHzGPIOInitStructure。GPIOPuPdGPIOPuPdUP;上拉GPIOInit(GPIOB,GPIOInitStructure);初始化PB15推挽输出,控制背光GPIOInitStructure。GPIOPin(30)(34)(78)(314);PD0,1,4,5,8,9,10,14,15AFOUTGPIOInitStructure。GPIOModeGPIOModeAF;复用输出GPIOInitStructure。GPIOOTypeGPIOOTypePP;推挽输出GPIOInitStructure。GPIOSpeedGPIOSpeed100MHz;100MHzGPIOInitStructure。GPIOPuPdGPIOPuPdUP;上拉GPIOInit(GPIOD,GPIOInitStructure);初始化GPIOInitStructure。GPIOPin(0X1FF7);PE715,AFOUTGPIOInitStructure。GPIOModeGPIOModeAF;复用输出GPIOInitStructure。GPIOOTypeGPIOOTypePP;推挽输出GPIOInitStructure。GPIOSpeedGPIOSpeed100MHz;100MHzGPIOInitStructure。GPIOPuPdGPIOPuPdUP;上拉GPIOInit(GPIOE,GPIOInitStructure);初始化GPIOInitStructure。GPIOPinGPIOPin12;PF12,FSMCA6GPIOInitStructure。GPIOModeGPIOModeAF;复用输出GPIOInitStructure。GPIOOTypeGPIOOTypePP;推挽输出GPIOInitStructure。GPIOSpeedGPIOSpeed100MHz;100MHzGPIOInitStructure。GPIOPuPdGPIOPuPdUP;上拉GPIOInit(GPIOF,GPIOInitStructure);初始化GPIOInitStructure。GPIOPinGPIOPin12;PF12,FSMCA6GPIOInitStructure。GPIOModeGPIOModeAF;复用输出GPIOInitStructure。GPIOOTypeGPIOOTypePP;推挽输出GPIOInitStructure。GPIOSpeedGPIOSpeed100MHz;100MHzGPIOInitStructure。GPIOPuPdGPIOPuPdUP;上拉GPIOInit(GPIOG,GPIOInitStructure);初始化GPIOPinAFConfig(GPIOD,GPIOPinSource0,GPIOAFFSMC);PD0,AF12GPIOPinAFConfig(GPIOD,GPIOPinSource1,GPIOAFFSMC);PD1,AF12GPIOPinAFConfig(GPIOD,GPIOPinSource4,GPIOAFFSMC);GPIOPinAFConfig(GPIOD,GPIOPinSource5,GPIOAFFSMC);GPIOPinAFConfig(GPIOD,GPIOPinSource8,GPIOAFFSMC);GPIOPinAFConfig(GPIOD,GPIOPinSource9,GPIOAFFSMC);GPIOPinAFConfig(GPIOD,GPIOPinSource10,GPIOAFFSMC);GPIOPinAFConfig(GPIOD,GPIOPinSource14,GPIOAFFSMC);GPIOPinAFConfig(GPIOD,GPIOPinSource15,GPIOAFFSMC);PD15,AF12GPIOPinAFConfig(GPIOE,GPIOPinSource7,GPIOAFFSMC);PE7,AF12GPIOPinAFConfig(GPIOE,GPIOPinSource8,GPIOAFFSMC);GPIOPinAFConfig(GPIOE,GPIOPinSource9,GPIOAFFSMC);GPIOPinAFConfig(GPIOE,GPIOPinSource10,GPIOAFFSMC);GPIOPinAFConfig(GPIOE,GPIOPinSource11,GPIOAFFSMC);GPIOPinAFConfig(GPIOE,GPIOPinSource12,GPIOAFFSMC);GPIOPinAFConfig(GPIOE,GPIOPinSource13,GPIOAFFSMC);GPIOPinAFConfig(GPIOE,GPIOPinSource14,GPIOAFFSMC);GPIOPinAFConfig(GPIOE,GPIOPinSource15,GPIOAFFSMC);PE15,AF12GPIOPinAFConfig(GPIOF,GPIOPinSource12,GPIOAFFSMC);PF12,AF12GPIOPinAFConfig(GPIOG,GPIOPinSource12,GPIOAFFSMC);readWriteTiming。FSMCAddressSetupTime0XF;地址建立时间(ADDSET)为16个HCLK1168M6ns1696nsreadWriteTiming。FSMCAddressHoldTime0x00;地址保持时间(ADDHLD)模式A未用到readWriteTiming。FSMCDataSetupTime60;数据保存时间为60个HCLK660360nsreadWriteTiming。FSMCBusTurnAroundDuration0x00;readWriteTiming。FSMCCLKDivision0x00;readWriteTiming。FSMCDataLatency0x00;readWriteTiming。FSMCAccessModeFSMCAccessModeA;模式AwriteTiming。FSMCAddressSetupTime9;地址建立时间(ADDSET)为9个HCLK54nswriteTiming。FSMCAddressHoldTime0x00;地址保持时间(AwriteTiming。FSMCDataSetupTime8;数据保存时间为6ns9个HCLK54nswriteTiming。FSMCBusTurnAroundDuration0x00;writeTiming。FSMCCLKDivision0x00;writeTiming。FSMCDataLatency0x00;writeTiming。FSMCAccessModeFSMCAccessModeA;模式AFSMCNORSRAMInitStructure。FSMCBankFSMCBank1NORSRAM4;这里我们使用NE4,也就对应BTCR〔6〕,〔7〕。FSMCNORSRAMInitStructure。FSMCDataAddressMuxFSMCDataAddressMuxDisable;不复用数据地址FSMCNORSRAMInitStructure。FSMCMemoryTypeFSMCMemoryTypeSRAM;FSMCMemoryTypeSRAM;SRAMFSMCNORSRAMInitStructure。FSMCMemoryDataWidthFSMCMemoryDataWidth16b;存储器数据宽度为16bitFSMCNORSRAMInitStructure。FSMCBurstAccessModeFSMCBurstAccessModeDisable;FSMCBurstAccessModeDisable;FSMCNORSRAMInitStructure。FSMCWaitSignalPolarityFSMCWaitSignalPolarityLow;FSMCNORSRAMInitStructure。FSMCAsynchronousWaitFSMCAsynchronousWaitDisable;FSMCNORSRAMInitStructure。FSMCWrapModeFSMCWrapModeDisable;FSMCNORSRAMInitStructure。FSMCWaitSignalActiveFSMCWaitSignalActiveBeforeWaitState;FSMCNORSRAMInitStructure。FSMCWriteOperationFSMCWriteOperationEnable;存储器写使能FSMCNORSRAMInitStructure。FSMCWaitSignalFSMCWaitSignalDisable;FSMCNORSRAMInitStructure。FSMCExtendedModeFSMCExtendedModeEnable;读写使用不同的时序FSMCNORSRAMInitStructure。FSMCWriteBurstFSMCWriteBurstDisable;FSMCNORSRAMInitStructure。FSMCReadWriteTimingStructreadWriteTiming;读写时序FSMCNORSRAMInitStructure。FSMCWriteTimingStructwriteTiming;写时序FSMCNORSRAMInit(FSMCNORSRAMInitStructure);初始化FSMC配置FSMCNORSRAMCmd(FSMCBank1NORSRAM4,ENABLE);使能BANK1delayms(50);delay50ms尝试9341ID的读取LCDWRREG(0XD3);lcddev。idLCDRDDATA();dummyreadlcddev。idLCDRDDATA();读到0X00lcddev。idLCDRDDATA();读取93lcddev。id8;lcddev。idLCDRDDATA();读取41if(lcddev。id0X9341lcddev。id0X7789lcddev。id0X5310lcddev。id0X5510lcddev。id0X1963)如果是这几个IC,则设置WR时序为最快{重新配置写时序控制寄存器的时序FSMCBank1EBWTR〔6〕(0XF0);地址建立时间(ADDSET)清零FSMCBank1EBWTR〔6〕(0XF8);数据保存时间清零FSMCBank1EBWTR〔6〕30;地址建立时间(ADDSET)为3个HCLK18nsif(lcddev。id0X7789){FSMCBank1EBWTR〔6〕38;数据保存时间(DATAST)为6ns3个HCLK18ns}else{FSMCBank1EBWTR〔6〕28;数据保存时间(DATAST)为6ns3个HCLK18ns}}printf(LCDID:xr,lcddev。id);打印LCDIDif(lcddev。id0X9341)9341初始化{LCDWRREG(0xCF);LCDWRDATA(0x00);LCDWRDATA(0xC1);LCDWRDATA(0X30);LCDWRREG(0xED);LCDWRDATA(0x64);LCDWRDATA(0x03);LCDWRDATA(0X12);LCDWRDATA(0X81);LCDWRREG(0xE8);LCDWRDATA(0x85);LCDWRDATA(0x10);LCDWRDATA(0x7A);LCDWRREG(0xCB);LCDWRDATA(0x39);LCDWRDATA(0x2C);LCDWRDATA(0x00);LCDWRDATA(0x34);LCDWRDATA(0x02);LCDWRREG(0xF7);LCDWRDATA(0x20);LCDWRREG(0xEA);LCDWRDATA(0x00);LCDWRDATA(0x00);LCDWRREG(0xC0);PowercontrolLCDWRDATA(0x1B);VRH〔5:0〕LCDWRREG(0xC1);PowercontrolLCDWRDATA(0x01);SAP〔2:0〕;BT〔3:0〕LCDWRREG(0xC5);VCMcontrolLCDWRDATA(0x30);3FLCDWRDATA(0x30);3CLCDWRREG(0xC7);VCMcontrol2LCDWRDATA(0XB7);LCDWRREG(0x36);MemoryAccessControlLCDWRDATA(0x48);LCDWRREG(0x3A);LCDWRDATA(0x55);LCDWRREG(0xB1);LCDWRDATA(0x00);LCDWRDATA(0x1A);LCDWRREG(0xB6);DisplayFunctionControlLCDWRDATA(0x0A);LCDWRDATA(0xA2);LCDWRREG(0xF2);3GammaFunctionDisableLCDWRDATA(0x00);LCDWRREG(0x26);GammacurveselectedLCDWRDATA(0x01);LCDWRREG(0xE0);SetGammaLCDWRDATA(0x0F);LCDWRDATA(0x2A);LCDWRDATA(0x28);LCDWRDATA(0x08);LCDWRDATA(0x0E);LCDWRDATA(0x08);LCDWRDATA(0x54);LCDWRDATA(0XA9);LCDWRDATA(0x43);LCDWRDATA(0x0A);LCDWRDATA(0x0F);LCDWRDATA(0x00);LCDWRDATA(0x00);LCDWRDATA(0x00);LCDWRDATA(0x00);LCDWRREG(0XE1);SetGammaLCDWRDATA(0x00);LCDWRDATA(0x15);LCDWRDATA(0x17);LCDWRDATA(0x07);LCDWRDATA(0x11);LCDWRDATA(0x06);LCDWRDATA(0x2B);LCDWRDATA(0x56);LCDWRDATA(0x3C);LCDWRDATA(0x05);LCDWRDATA(0x10);LCDWRDATA(0x0F);LCDWRDATA(0x3F);LCDWRDATA(0x3F);LCDWRDATA(0x0F);LCDWRREG(0x2B);LCDWRDATA(0x00);LCDWRDATA(0x00);LCDWRDATA(0x01);LCDWRDATA(0x3f);LCDWRREG(0x2A);LCDWRDATA(0x00);LCDWRDATA(0x00);LCDWRDATA(0x00);LCDWRDATA(0xef);LCDWRREG(0x11);ExitSleepdelayms(120);LCDWRREG(0x29);displayon}LCDDisplayDir(0);默认为竖屏LCDLED1;点亮背光LCDClear(WHITE);}清屏函数color:要清屏的填充色voidLCDClear(u16color){u32index0;u32totalpointlcddev。width;totalpointlcddev。height;得到总点数LCDSetCursor(0x00,0x0000);设置光标位置LCDWriteRAMPrepare();开始写入GRAMfor(index0;indextotalpoint;index){LCDLCDRAMcolor;}} main。cintmain(void){u8x0;u8lcdid〔12〕;存放LCDID字符串NVICPriorityGroupConfig(NVICPriorityGroup2);设置系统中断优先级分组2delayinit(168);初始化延时函数uartinit(115200);初始化串口波特率为115200LEDInit();初始化LEDLCDInit();初始化LCDFSMC接口POINTCOLORRED;画笔颜色:红色sprintf((char)lcdid,LCDID:04X,lcddev。id);将LCDID打印到lcdid数组。while(1){switch(x){case0:LCDClear(WHITE);break;case1:LCDClear(BLACK);break;case2:LCDClear(BLUE);break;case3:LCDClear(RED);break;case4:LCDClear(MAGENTA);break;case5:LCDClear(GREEN);break;case6:LCDClear(CYAN);break;case7:LCDClear(YELLOW);break;case8:LCDClear(BRRED);break;case9:LCDClear(GRAY);break;case10:LCDClear(LGRAY);break;case11:LCDClear(BROWN);break;}POINTCOLORRED;LCDShowString(30,40,210,24,24,ExplorerSTM32F4);LCDShowString(30,70,200,16,16,TFTLCDTEST);LCDShowString(30,90,200,16,16,ATOMALIENTEK);LCDShowString(30,110,200,16,16,lcdid);显示LCDIDLCDShowString(30,130,200,12,12,201454);x;if(x12)x0;LED0!LED0;delayms(1000);}}