LCD_FSMC
/************************************************************************** * 文件名:LCD_FSMC.h * * 编写人:离逝的风 * * 更新时间:2018.12.15 * * 说明:此文件属于开源,所有权对任何人开放 * * 如有问题请联系邮箱:1477153217@qq.com * * 使用步骤: * * 1.在主函数中调用LcdInit()函数对LCD初始化即可使用其他函数 * * 说明:程序中采用的是ILI9325液晶控制器,若不是该控制器,则需要在初始化中 * * 修改替换成相对应得控制器初始化程序 * ***************************************************************************/ #ifndef __LCD_FSMC_H_ #define __LCD_FSMC_H_ #include "stm32f10x.h" /*################################FSMC引脚说明############################################### FSMC_NOE-----PD4 FSMC_NE1/FSMC_NCE2-----PD7 FSMC_NE2/FSMC_NCE3----PG9 FSMC_NWE-----PD5 FSMC_NCE4_1/FSMC_NE3---PG10 FSMC_NCE4_2------PG11 FSMC_NE4-----PG12 FSMC_A0----PF0 FSMC_A1----PF1 FSMC_A2----PF2 FSMC_A3----PF3 FSMC_A4----PF4 FSMC_A5----PF5 FSMC_A6----PF12 FSMC_A7----PF13 FSMC_A8----PF14 FSMC_A9----PF15 FSMC_A10---PG0 FSMC_A11---PG1 FSMC_A12---PG2 FSMC_A13---PG3 FSMC_A14---PG4 FSMC_A15---PG5 FSMC_A16---PD11 FSMC_A17---PD12 FSMC_A18---PD13 FSMC_A19---PE3 FSMC_A20---PE4 FSMC_A21---PE5 FSMC_A22---PE6 FSMC_A23---PE2 FSMC_A24---PG13 FSMC_A25---PG14 FSMC_D0----PD14 FSMC_D1----PD15 FSMC_D2----PD0 FSMC_D3----PD1 FSMC_D4----PE7 FSMC_D5----PE8 FSMC_D6----PE9 FSMC_D7----PE10 FSMC_D8----PE11 FSMC_D9----PE12 FSMC_D10---PE13 FSMC_D11---PE14 FSMC_D12---PE15 FSMC_D13---PD8 FSMC_D14---PD9 FSMC_D15---PD10 FSMC_INT2--PG6 FSMC_INT3--PG77 FSMC_NIORD-PF6 FSMC_NREG--PF7 FSMC_NIOWR-PF8 FSMC_CD----PF9 FSMC_INTR--PF10 FSMC_NIOS16-PF11 FSMC_CLK---PD3 FSMC_NWAIT-PD6 FSMC_NBL0--PE0 FSMC_NBL1---PE1 *********************************************************************************************/ /*################################寄存器说明################################################## BTCR[0]---FSMC_BCR1 BTCR[1]---FSMC_BTR1 BTCR[2]---FSMC_BCR2 BTCR[3]---FSMC_BTR2 BTCR[4]---FSMC_BCR3 BTCR[5]---FSMC_BTR3 BTCR[6]---FSMC_BCR4 BTCR[7]---FSMC_BTR4 BWTR[0]---FSMC_BWTR1 BWTR[2]---FSMC_BWTR2 BWTR[4]---FSMC_BWTR3 BWTR[6]---FSMC_BWTR4 BWTR[1] BWTR[3] BWTR[5]保留 *********************************************************************************************/ /*###################################下面是LCD的引脚连线#####################################*/ //片选线 1:连接在块1 2:连接在块2 3:连接在块3 4:连接在块4 #define LCD_CS 4 //数据和命令选择线 0-25:分别连接在A0-A25上 #define LCD_RS 10 //背光线 #define LCD_BLK RCC->APB2ENR|=(1<<3);GPIOB->CRL&=0xffffffF0;GPIOB->CRL|=0X00000003; //背光控制 #define LCD_BLK_ON GPIOB->BRR|=(1<<0); #define LCD_BLK_OFF GPIOB->BSRR|=(1<<0); /*###################################下面函数供用户调用#####################################*/ //液晶初始化函数 void LcdInit(void); //液晶填充函数 void LcdFill(unsigned long color); #endif //FILE END
/************************************************************************** * 文件名:LCD_FSMC.c * * 编写人:离逝的风 * * 更新时间:2018.12.15 * * 说明:此文件属于开源,所有权对任何人开放 * * 如有问题请联系邮箱:1477153217@qq.com * * 使用步骤: * * 1.在主函数中调用LcdInit()函数对LCD初始化即可使用其他函数 * * 说明:程序中采用的是ILI9325液晶控制器,若不是该控制器,则需要在初始化中 * * 修改替换成相对应得控制器初始化程序 * ***************************************************************************/ #include "LCD_FSMC.h" /************************************************************************************ 函数:LcdDelay 参数:time时间长短 返回值:无 说明:初始化使用的延时函数 *************************************************************************************/ void LcdDelay(unsigned int time) { unsigned int x,y; for(x=0;x<time;x++) for(y=0;y<11000;y++); } /************************************************************************************ 函数:LcdWriteData 参数:Data:写入的数据 返回值:无 说明:液晶屏写数据函数 *************************************************************************************/ void LcdWriteData(unsigned int Data) { *(volatile unsigned long *)(0x6c000000+0X000007FE+(1<<(LCD_RS+1)))=Data; } /************************************************************************************ 函数:LcdWriteCom 参数:Com:写入的指令 返回值:无 说明:液晶屏写指令函数 *************************************************************************************/ void LcdWriteCom(unsigned int Com) { *(volatile unsigned long *)(0x6c000000+0X000007FE)=Com; } /************************************************************************************ 函数:LcdWriteDatCom 参数:Com:写入的指令 Data:写入的数据 返回值:无 说明:液晶屏写指令和数据函数 *************************************************************************************/ void LcdWriteDatCom(unsigned int Com,unsigned int Data) { LcdWriteCom(Com); LcdWriteData(Data); } /************************************************************************************ 函数:LcdInit 参数:无 返回值:无 说明:初始化液晶屏 *************************************************************************************/ void LcdInit(void) { RCC->AHBENR |= 1 << 8; //开启FSMC是时钟 RCC->APB2ENR |=1 << 3 | 1 << 5 | 1 << 6 | 1 << 8; // 开启GPIO B,D,E,G引脚时钟 RCC->APB2ENR |= 1 << 0; //开启引脚复用时钟 //GPIOB配置为复用推完输出 GPIOB->CRL &= 0xfffffff0; GPIOB->CRL |= 0x00000003; //GPIOD配置为复用推完输出 GPIOD->CRL &= 0xff00ff00; GPIOD->CRL |= 0x00bb00bb; GPIOD->CRH &= 0x00fff000; GPIOD->CRH |= 0xbb000bbb; //GPIOE配置为复用推完输出 GPIOE->CRL &= 0x0fffffff; GPIOE->CRL |= 0xb0000000; GPIOE->CRH &= 0x00000000; GPIOE->CRH |= 0xbbbbbbbb; //GPIOG配置为复用推完输出 GPIOG->CRL &= 0xfffffff0; GPIOG->CRL |= 0x0000000b; GPIOG->CRH &= 0xfff0ffff; GPIOG->CRH |= 0x000b0000; FSMC_Bank1->BTCR[(LCD_CS-1)*2] &= 0x00000000; FSMC_Bank1->BTCR[(LCD_CS-1)*2] |= 1 << 14| 1 << 12 | 0x01 << 4 | 0x00 << 2 | 1 << 0; FSMC_Bank1->BTCR[(LCD_CS-1)*2+1] &= 0x00000000; FSMC_Bank1->BTCR[(LCD_CS-1)*2+1] |= 0x00 << 28 | 0x0000 << 20 | 0x0f << 8 | 0x01; FSMC_Bank1E->BWTR[(LCD_CS-1)*2] &= 0x00000000; FSMC_Bank1E->BWTR[(LCD_CS-1)*2] |= 0x00 << 28 | 0x0000 << 20 | 0x03 << 8 | 0x00; /*******下面为LCD初始化**************/ LcdWriteDatCom(0xE5, 0x78f0); // set SRAM internal timing LcdWriteDatCom(0x01, 0x0100); // set Driver Output Control LcdWriteDatCom(0x02, 0x0700); // set 1 line inversion LcdWriteDatCom(0x03, 0xe030); // set GRAM write direction and BGR=1. LcdWriteDatCom(0x04, 0x0000); // Resize register LcdWriteDatCom(0x08, 0x0207); // set the back porch and front porch LcdWriteDatCom(0x09, 0x0000); // set non-display area refresh cycle ISC[3:0] LcdWriteDatCom(0x0A, 0x0000); // FMARK function LcdWriteDatCom(0x0C, 0x0001); // RGB interface setting LcdWriteDatCom(0x0D, 0x0000); // Frame marker Position LcdWriteDatCom(0x0F, 0x0000); // RGB interface polarity //*************Power On sequence ****************// LcdWriteDatCom(0x10, 0x0000); // SAP, BT[3:0], AP, DSTB, SLP, STB LcdWriteDatCom(0x11, 0x0007); // DC1[2:0], DC0[2:0], VC[2:0] LcdWriteDatCom(0x12, 0x0000); // VREG1OUT voltage LcdWriteDatCom(0x13, 0x0000); // VDV[4:0] for VCOM amplitude LcdWriteDatCom(0x07, 0x0001); LcdDelay(20); // Dis-charge capacitor power voltage LcdWriteDatCom(0x10, 0x1090); // SAP, BT[3:0], AP, DSTB, SLP, STB LcdWriteDatCom(0x11, 0x0227); // Set DC1[2:0], DC0[2:0], VC[2:0] LcdDelay(5); // Delay 50ms LcdWriteDatCom(0x12, 0x001F); // 0012 LcdDelay(5); // Delay 50ms LcdWriteDatCom(0x13, 0x1500); // VDV[4:0] for VCOM amplitude LcdWriteDatCom(0x29, 0x0027); // 04 VCM[5:0] for VCOMH LcdWriteDatCom(0x2B, 0x000D); // Set Frame Rate LcdDelay(5); // Delay 50ms LcdWriteDatCom(0x20, 0x0000); // GRAM horizontal Address LcdWriteDatCom(0x21, 0x0000); // GRAM Vertical Address // ----------- Adjust the Gamma Curve ----------// LcdWriteDatCom(0x30, 0x0000); LcdWriteDatCom(0x31, 0x0707); LcdWriteDatCom(0x32, 0x0307); LcdWriteDatCom(0x35, 0x0200); LcdWriteDatCom(0x36, 0x0008); LcdWriteDatCom(0x37, 0x0004); LcdWriteDatCom(0x38, 0x0000); LcdWriteDatCom(0x39, 0x0707); LcdWriteDatCom(0x3C, 0x0002); LcdWriteDatCom(0x3D, 0x1D04); //------------------ Set GRAM area ---------------// LcdWriteDatCom(0x50, 0x0000); // Horizontal GRAM Start Address LcdWriteDatCom(0x51, 0x00EF); // Horizontal GRAM End Address LcdWriteDatCom(0x52, 0x0000); // Vertical GRAM Start Address LcdWriteDatCom(0x53, 0x013F); // Vertical GRAM Start Address LcdWriteDatCom(0x60, 0xA700); // Gate Scan Line LcdWriteDatCom(0x61, 0x0001); // NDL,VLE, REV LcdWriteDatCom(0x6A, 0x0000); // set scrolling line //-------------- Partial Display Control ---------// LcdWriteDatCom(0x80, 0x0000); LcdWriteDatCom(0x81, 0x0000); LcdWriteDatCom(0x82, 0x0000); LcdWriteDatCom(0x83, 0x0000); LcdWriteDatCom(0x84, 0x0000); LcdWriteDatCom(0x85, 0x0000); //-------------- Panel Control -------------------// LcdWriteDatCom(0x90, 0x0010); LcdWriteDatCom(0x92, 0x0600); LcdWriteDatCom(0x07, 0x0133); // 262K color and display ON LcdWriteDatCom(0x00,0x0022);// LcdDelay(50); } /************************************************************************************ 函数:LcdFill 参数:color:颜色值,16bit 返回值:无 说明:整屏填充颜色 *************************************************************************************/ void LcdFill(unsigned long color) { unsigned int x,y; LcdWriteDatCom(0x50, 0); // Horizontal GRAM Start Address LcdWriteDatCom(0x51, 240); // Horizontal GRAM End Address LcdWriteDatCom(0x52, 0); // Vertical GRAM Start Address LcdWriteDatCom(0x53, 320); // Vertical GRAM Start Address for(x=0;x<240;x++) for(y=0;y<320;y++) { LcdWriteDatCom(0x22,color); } } //FILE END