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
原文地址:https://www.cnblogs.com/listenscience/p/10176511.html