ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

stm3210x 点亮LCD

2022-05-24 22:35:55  阅读:206  来源: 互联网

标签:点亮 FSMC Write LCD stm3210x GPIO Data ILI9341


1. 野火stm32f10x点亮LCD, 并实现动态显示。

2. 代码

  主函数main.c

#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
#include "./led/bsp_led.h"
#include "./lcd/bsp_ili9341_lcd.h"
#include <stdio.h>

void LCD_Test(void);
void Delay(__IO uint32_t nCount);
void Printf_Charater(void);
    
int main(void)
{    
    ILI9341_Init();    /*需优先配置,不然执行异常*/
    
    LED_GPIO_Config();
    LED_BLUE;
    
    /* 配置串口为:波特率115200 8-N-1 */
    USART_Config();
    printf("\r\n---这是一个stm32点亮LCD的实验---\r\n");
//    printf("\r\n0x0C命令返回值测试:0x%x",Read_Pixel_Format());    /*DBI[2:0]:101(16位/像素点)*/
//    ILI9341_DrawRectangle(10,20,80,40,1);        /*x=10,y=20,width=80,height=40,Fillcolor=1(填充)*/
//    ILI9341_DrawRectangle(150,20,80,40,0);    /*x=150,y=20,width=80,height=40,Fillcolor=0(不填充)*/
//    ILI9341_DrawRectangle(50,200,100,30,1);
//    ILI9341_DrawLine (10,20,50,100);
//    ILI9341_GramScan ( 6 );

    while(1)
    {
        LCD_Test();
    }
}


void Delay(__IO uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}


/*用于测试各种液晶的函数*/
void LCD_Test(void)
{
    /*演示显示变量*/
    static uint8_t testCNT = 0;    
    char dispBuff[100];
    
    testCNT++;    
    
    LCD_SetFont(&Font8x16);
    LCD_SetColors(RED,BLACK);

   ILI9341_Clear(0,0,LCD_X_LENGTH,LCD_Y_LENGTH);    /* 清屏,显示全黑 */
    /********显示字符串示例*******/
    ILI9341_DispStringLine_EN(LINE(0),"BH 3.2 inch LCD para:");
    ILI9341_DispStringLine_EN(LINE(1),"Image resolution:240x320 px");
    ILI9341_DispStringLine_EN(LINE(2),"ILI9341 LCD driver");
    ILI9341_DispStringLine_EN(LINE(3),"XPT2046 Touch Pad driver");

  
    /********显示变量示例*******/
    LCD_SetFont(&Font16x24);
    LCD_SetTextColor(GREEN);

    /*使用c标准库把变量转化成字符串*/
    sprintf(dispBuff,"Count : %d ",testCNT);
    LCD_ClearLine(LINE(4));    /* 清除单行文字 */
    
    /*然后显示该字符串即可,其它变量也是这样处理*/
    ILI9341_DispStringLine_EN(LINE(4),dispBuff);

    /*******显示图形示例******/
    LCD_SetFont(&Font24x32);
  /* 画直线 */
  
    LCD_ClearLine(LINE(4));/* 清除单行文字 */
    LCD_SetTextColor(BLUE);

    ILI9341_DispStringLine_EN(LINE(4),"Draw line:");
  
    LCD_SetTextColor(RED);
    ILI9341_DrawLine(50,170,210,230);  
    ILI9341_DrawLine(50,200,210,240);
  
    LCD_SetTextColor(GREEN);
    ILI9341_DrawLine(100,170,200,230);  
    ILI9341_DrawLine(200,200,220,240);
    
    LCD_SetTextColor(BLUE);
    ILI9341_DrawLine(110,170,110,230);  
    ILI9341_DrawLine(130,200,220,240);
  
    Delay(0xFFFFFF);
  
    ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8);    /* 清屏,显示全黑 */
  
  
  /*画矩形*/

    LCD_ClearLine(LINE(4));    /* 清除单行文字 */
    LCD_SetTextColor(BLUE);

    ILI9341_DispStringLine_EN(LINE(4),"Draw Rect:");

    LCD_SetTextColor(RED);
    ILI9341_DrawRectangle(50,200,100,30,1);
    
    LCD_SetTextColor(GREEN);
    ILI9341_DrawRectangle(160,200,20,40,0);
    
    LCD_SetTextColor(BLUE);
    ILI9341_DrawRectangle(170,200,50,20,1);
  
    Delay(0xFFFFFF);
    
    ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8);    /* 清屏,显示全黑 */

  /* 画圆 */
    LCD_ClearLine(LINE(4));    /* 清除单行文字 */
    LCD_SetTextColor(BLUE);
    
    ILI9341_DispStringLine_EN(LINE(4),"Draw Cir:");

    LCD_SetTextColor(RED);
    ILI9341_DrawCircle(100,200,20,0);
    
    LCD_SetTextColor(GREEN);
    ILI9341_DrawCircle(100,200,10,1);
    
    LCD_SetTextColor(BLUE);
    ILI9341_DrawCircle(140,200,20,0);

    Delay(0xFFFFFF);
  
    ILI9341_Clear(0,16*8,LCD_X_LENGTH,LCD_Y_LENGTH-16*8);    /* 清屏,显示全黑 */

}

  子函数定义bsp_ili9341_lcd.c

#include "./lcd/bsp_ili9341_lcd.h"
#include "./font/fonts.h"    

/*根据液晶扫描方向而变化的XY像素宽度*/
/*调用ILI9341_GramScan函数设置方向时会自动更改*/
uint16_t LCD_X_LENGTH = ILI9341_LESS_PIXEL;
uint16_t LCD_Y_LENGTH = ILI9341_MORE_PIXEL;

/*液晶屏扫描模式,本变量主要用于方便选择触摸屏的计算参数,参数可选0-7
调用ILI9341_GramScan函数设置方向时会自动更改
LCD刚初始化完成时会使用本默认值*/
uint8_t LCD_SCAN_MODE = 6;

static sFONT *LCD_Currentfonts = &Font8x16;    /*英文字体*/
static uint16_t CurrentTextColor = BLACK;        /*前景色*/
static uint16_t CurrentBackColor = WHITE;        /*背景色*/
//static uint16_t CurrentTextColor2 = BLUE;        /*前景色*/

__inline void                 ILI9341_Write_Cmd           ( uint16_t usCmd );
__inline void                 ILI9341_Write_Data          ( uint16_t usData );
__inline uint16_t             ILI9341_Read_Data           ( void );
static void                   ILI9341_Delay               ( __IO uint32_t nCount );
static void                   ILI9341_GPIO_Config         ( void );
static void                   ILI9341_FSMC_Config         ( void );
static void                   ILI9341_REG_Config          ( void );
static void                   ILI9341_SetCursor           ( uint16_t usX, uint16_t usY );
static __inline void          ILI9341_FillColor           ( uint32_t ulAmout_Point, uint16_t usColor );
static uint16_t               ILI9341_Read_PixelData      ( void );


/*FSMC的GPIO初始化函数*/
void ILI9341_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    // 打开GPIO的时钟
    RCC_APB2PeriphClockCmd(ILI9341_CS_CLK|ILI9341_RST_CLK|ILI9341_BK_CLK|ILI9341_RD_CLK|
                        ILI9341_WR_CLK|ILI9341_DC_CLK|ILI9341_D0_CLK|ILI9341_D1_CLK|ILI9341_D2_CLK|
                        ILI9341_D3_CLK|ILI9341_D4_CLK|ILI9341_D5_CLK|ILI9341_D6_CLK|ILI9341_D7_CLK|
                        ILI9341_D8_CLK|ILI9341_D9_CLK|ILI9341_D10_CLK|ILI9341_D11_CLK|ILI9341_D12_CLK|
                        ILI9341_D13_CLK|ILI9341_D14_CLK|ILI9341_D15_CLK    , ENABLE);
    
    // 将的GPIO配置为推挽模式
    GPIO_InitStructure.GPIO_Pin = ILI9341_BK_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(ILI9341_BK_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_RST_PIN;
    GPIO_Init(ILI9341_RST_PORT, &GPIO_InitStructure);
    
    
    // 将的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = ILI9341_CS_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(ILI9341_CS_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_RD_PIN;
    GPIO_Init(ILI9341_RD_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_WR_PIN;
    GPIO_Init(ILI9341_WR_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_DC_PIN;
    GPIO_Init(ILI9341_DC_PORT, &GPIO_InitStructure);
    
    
        /* 配置FSMC相对应的数据线,FSMC-D0~D15 */    
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF_PP;
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D0_PIN;
    GPIO_Init ( ILI9341_D0_PORT, & GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = ILI9341_D1_PIN;
    GPIO_Init ( ILI9341_D1_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D2_PIN;
    GPIO_Init ( ILI9341_D2_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D3_PIN;
    GPIO_Init ( ILI9341_D3_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D4_PIN;
    GPIO_Init ( ILI9341_D4_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D5_PIN;
    GPIO_Init ( ILI9341_D5_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D6_PIN;
    GPIO_Init ( ILI9341_D6_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D7_PIN;
    GPIO_Init ( ILI9341_D7_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D8_PIN;
    GPIO_Init ( ILI9341_D8_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D9_PIN;
    GPIO_Init ( ILI9341_D9_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D10_PIN;
    GPIO_Init ( ILI9341_D10_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D11_PIN;
    GPIO_Init ( ILI9341_D11_PORT, & GPIO_InitStructure );

    GPIO_InitStructure.GPIO_Pin = ILI9341_D12_PIN;
    GPIO_Init ( ILI9341_D12_PORT, & GPIO_InitStructure );    
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D13_PIN;
    GPIO_Init ( ILI9341_D13_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D14_PIN;
    GPIO_Init ( ILI9341_D14_PORT, & GPIO_InitStructure );
    
    GPIO_InitStructure.GPIO_Pin = ILI9341_D15_PIN;
    GPIO_Init ( ILI9341_D15_PORT, & GPIO_InitStructure );
}



/*配置FSMC模式*/
/*把 FSMC 配置成异步 NOR FLASH 使用的模式 B,使用该方式模拟 8080 时序控制液晶屏*/
void ILI9341_FSMC_Config(void)
{
    
    FSMC_NORSRAMInitTypeDef                      FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef           readWriteTiming;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);    
    /*使能FSMC外设时钟*/
    readWriteTiming.FSMC_AddressSetupTime = 0x01;        
    //地址建立时间(ADDSET)为1个HCLK= 2/72MHz = 28ns 
    readWriteTiming.FSMC_DataSetupTime = 0x04;    
    //数据保持时间(DATAST)+1个HCLK = 5/72MHz = 70ns         
    readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_B;    
    //选择匹配SRAM的模式
    
    
/*以下配置与模式B无关*/
    //地址保持时间(ADDHLD)模式B未用到
    readWriteTiming.FSMC_AddressHoldTime = 0x00;    
    //设置总线转换周期,仅用于复用模式的NOR操作     
    readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;    
    //设置时钟分频,仅用于同步类型的存储器
    readWriteTiming.FSMC_CLKDivision = 0x00;
    //数据保持时间,仅用于NOR    
    readWriteTiming.FSMC_DataLatency = 0x00;
    // 选择FSMC映射的存储区域: Bank1 NORSRAMx        
    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_BANK_NORSRAMx; 
    //设置地址总线与数据总线是否复用,仅用于NOR
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    //设置要控制的存储器类型:NOR类型 
    FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_NOR;
    //存储器数据宽度:16位   
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
    //设置是否使用突发访问模式,仅用于同步类型的存储器 
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;
    //设置是否使能等待信号,仅用于同步类型的存储器
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
    //设置等待信号的有效极性,仅用于同步类型的存储器    
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    //设置是否支持把非对齐的突发操作,仅用于同步类型的存储器
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; 
    //设置等待信号插入的时间,仅用于同步类型的存储器
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    //存储器写使能
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    //不使用等待信号
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  
    // 不使用扩展模式,读写使用相同的时序        
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    //突发写操作 
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; 
    //读写时序配置 
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;
    //读写同样时序,使用扩展模式时这个配置才有效
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming; 
    //初始化FSMC配置
    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  
    // 使能BANK
    FSMC_NORSRAMCmd(FSMC_BANK_NORSRAMx, ENABLE);              
}


/**
  * @brief  向ILI9341写入命令
  * @param  usCmd :要写入的命令(表寄存器地址)
  * @retval 无
  */    
__inline void ILI9341_Write_Cmd(uint16_t usCmd)
{    
    * ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_CMD ) = usCmd;
}


/**
  * @brief  向ILI9341写入数据
  * @param  usData :要写入的数据
  * @retval 无
  */    
__inline void ILI9341_Write_Data(uint16_t usData)
{
    *( __IO uint16_t * ) ( FSMC_Addr_ILI9341_DATA ) = usData;    
}


/**
  * @brief  从ILI9341读取数据
  * @param  无
  * @retval 读取到的数据
  */    
__inline uint16_t ILI9341_Read_Data ( void )
{
    return ( * ( __IO uint16_t * ) ( FSMC_Addr_ILI9341_DATA ) );
}


/**
 * @brief  初始化ILI9341寄存器(向液晶屏写入初始化配置)
 * @param  无
 * @retval 无
 */
static void ILI9341_REG_Config ( void )
{
    /*  Power control B (CFh) */
    DEBUG_DELAY  ();
    ILI9341_Write_Cmd ( 0xCF  );
    ILI9341_Write_Data ( 0x00  );
    ILI9341_Write_Data ( 0x81  );
    ILI9341_Write_Data ( 0x30  );
    
    /*  Power on sequence control (EDh) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xED );
    ILI9341_Write_Data ( 0x64 );
    ILI9341_Write_Data ( 0x03 );
    ILI9341_Write_Data ( 0x12 );
    ILI9341_Write_Data ( 0x81 );
    
    /*  Driver timing control A (E8h) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xE8 );
    ILI9341_Write_Data ( 0x85 );
    ILI9341_Write_Data ( 0x10 );
    ILI9341_Write_Data ( 0x78 );
    
    /*  Power control A (CBh) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xCB );
    ILI9341_Write_Data ( 0x39 );
    ILI9341_Write_Data ( 0x2C );
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x34 );
    ILI9341_Write_Data ( 0x02 );
    
    /* Pump ratio control (F7h) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xF7 );
    ILI9341_Write_Data ( 0x20 );
    
    /* Driver timing control B */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xEA );
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x00 );
    
    /* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xB1 );
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x1B );
    
    /*  Display Function Control (B6h) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xB6 );
    ILI9341_Write_Data ( 0x0A );
    ILI9341_Write_Data ( 0xA2 );
    
    /* Power Control 1 (C0h) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xC0 );
    ILI9341_Write_Data ( 0x35 );
    
    /* Power Control 2 (C1h) */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0xC1 );
    ILI9341_Write_Data ( 0x11 );
    
    /* VCOM Control 1 (C5h) */
    ILI9341_Write_Cmd ( 0xC5 );
    ILI9341_Write_Data ( 0x45 );
    ILI9341_Write_Data ( 0x45 );
    
    /*  VCOM Control 2 (C7h)  */
    ILI9341_Write_Cmd ( 0xC7 );
    ILI9341_Write_Data ( 0xA2 );
    
    /* Enable 3G (F2h) */
    ILI9341_Write_Cmd ( 0xF2 );
    ILI9341_Write_Data ( 0x00 );
    
    /* Gamma Set (26h) */
    ILI9341_Write_Cmd ( 0x26 );
    ILI9341_Write_Data ( 0x01 );
    DEBUG_DELAY ();
    
    /* Positive Gamma Correction */
    ILI9341_Write_Cmd ( 0xE0 ); //Set Gamma
    ILI9341_Write_Data ( 0x0F );
    ILI9341_Write_Data ( 0x26 );
    ILI9341_Write_Data ( 0x24 );
    ILI9341_Write_Data ( 0x0B );
    ILI9341_Write_Data ( 0x0E );
    ILI9341_Write_Data ( 0x09 );
    ILI9341_Write_Data ( 0x54 );
    ILI9341_Write_Data ( 0xA8 );
    ILI9341_Write_Data ( 0x46 );
    ILI9341_Write_Data ( 0x0C );
    ILI9341_Write_Data ( 0x17 );
    ILI9341_Write_Data ( 0x09 );
    ILI9341_Write_Data ( 0x0F );
    ILI9341_Write_Data ( 0x07 );
    ILI9341_Write_Data ( 0x00 );
    
    /* Negative Gamma Correction (E1h) */
    ILI9341_Write_Cmd ( 0XE1 ); //Set Gamma
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x19 );
    ILI9341_Write_Data ( 0x1B );
    ILI9341_Write_Data ( 0x04 );
    ILI9341_Write_Data ( 0x10 );
    ILI9341_Write_Data ( 0x07 );
    ILI9341_Write_Data ( 0x2A );
    ILI9341_Write_Data ( 0x47 );
    ILI9341_Write_Data ( 0x39 );
    ILI9341_Write_Data ( 0x03 );
    ILI9341_Write_Data ( 0x06 );
    ILI9341_Write_Data ( 0x06 );
    ILI9341_Write_Data ( 0x30 );
    ILI9341_Write_Data ( 0x38 );
    ILI9341_Write_Data ( 0x0F );
    
    /* memory access control set */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0x36 );     
    ILI9341_Write_Data ( 0xC8 );    /*竖屏  左上角到 (起点)到右下角 (终点)扫描方式*/
    DEBUG_DELAY ();
    
    /* column address control set */
    ILI9341_Write_Cmd ( CMD_SetCoordinateX );  
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0xEF );
    
    /* page address control set */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( CMD_SetCoordinateY ); 
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x00 );
    ILI9341_Write_Data ( 0x01 );
    ILI9341_Write_Data ( 0x3F );
    
    /*  Pixel Format Set (3Ah)  */
    DEBUG_DELAY ();
    ILI9341_Write_Cmd ( 0x3a ); 
    ILI9341_Write_Data ( 0x55 );
    
    /* Sleep Out (11h)  */
    ILI9341_Write_Cmd ( 0x11 );    
    ILI9341_Delay ( 0xAFFf<<2 );
    DEBUG_DELAY ();
    
    /* Display ON (29h) */
    ILI9341_Write_Cmd ( 0x29 ); 
}


/*在ILI9341显示器上开辟一个窗口*/
void ILI9341_OpenWindow(uint16_t usX,uint16_t usY,uint16_t usWidth,uint16_t usHeight)
    {/*usX: 起始X坐标值, usY: 起始Y坐标值; usWidth: 窗口宽度值, usHeight: 窗口高度值*/
    /* column address control set */
//    ILI9341_Write_Cmd ( CMD_SetCoordinateX );  
//    ILI9341_Write_Data ( (usX&0xFF00) >> 8 );    /*先高8位,再低8位*/
//    ILI9341_Write_Data ( (usX&0x00FF) );    
//    ILI9341_Write_Data ( ((usX+usWidth-1)&0xFF00) >> 8 );    /*设置起始点和结束点*/
//    ILI9341_Write_Data ( ((usX+usWidth-1)&0x00FF) );    

//    ILI9341_Write_Cmd ( CMD_SetCoordinateY ); 
//    ILI9341_Write_Data ( (usY&0xFF00) >> 8 );
//    ILI9341_Write_Data ( (usY&0x00FF) );
//    ILI9341_Write_Data ( ((usY+usHeight-1)&0xFF00) >> 8 );
//    ILI9341_Write_Data ( ((usY+usHeight-1)&0x00FF) );    
        
    ILI9341_Write_Cmd ( CMD_SetCoordinateX );                  /* 设置X坐标 */
    ILI9341_Write_Data ( usX >> 8  );     /* 先高8位,然后低8位 */
    ILI9341_Write_Data ( usX & 0xff  );     /* 设置起始点和结束点*/
    ILI9341_Write_Data ( ( usX + usWidth - 1 ) >> 8  );
    ILI9341_Write_Data ( ( usX + usWidth - 1 ) & 0xff  );

    ILI9341_Write_Cmd ( CMD_SetCoordinateY );                  /* 设置Y坐标*/
    ILI9341_Write_Data ( usY >> 8  );
    ILI9341_Write_Data ( usY & 0xff  );
    ILI9341_Write_Data ( ( usY + usHeight - 1 ) >> 8 );
    ILI9341_Write_Data ( ( usY + usHeight - 1) & 0xff );
        
    }
    
    
/*读取像素格式*/
//uint16_t Read_Pixel_Format(void)
//{
//    ILI9341_Write_Cmd(0x0C);
//    ILI9341_Read_Data();
//    
//    return ILI9341_Read_Data();
//}


/**
 * @brief  ILI9341背光LED控制
 * @param  enumState :决定是否使能背光LED
  *   该参数为以下值之一:
  *     @arg ENABLE :使能背光LED
  *     @arg DISABLE :禁用背光LED
 * @retval 无
 */
void ILI9341_BackLed_Control ( FunctionalState enumState )
{
    if ( enumState )
        GPIO_ResetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );    
    else
        GPIO_SetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
        
}


/**
  * @brief  用于 ILI9341 简单延时函数
  * @param  nCount :延时计数值
  * @retval 无
  */    
static void ILI9341_Delay ( __IO uint32_t nCount )
{
  for ( ; nCount != 0; nCount -- );
    
}


/**
 * @brief  ILI9341 软件复位
 * @param  无
 * @retval 无
 */
void ILI9341_Rst ( void )
{            
    GPIO_ResetBits ( ILI9341_RST_PORT, ILI9341_RST_PIN );     //低电平复位

    ILI9341_Delay ( 0xAFF );                        

    GPIO_SetBits ( ILI9341_RST_PORT, ILI9341_RST_PIN );              

    ILI9341_Delay ( 0xAFF );     
    
}




/*设置ILI9341的GRAM的扫描方向*/
void ILI9341_GramScan(uint8_t ucOption)
{
    if(ucOption > 7)    /*参数检查,只可以输入0-7*/
        return;
    LCD_SCAN_MODE = ucOption;        /*根据模式更新LCD_SCAN_MODE值,主要用于触摸屏选择计算参数*/
    if(ucOption%2 == 0)                    /*根据模式更新XY方向的像素宽度*/
    {
        LCD_X_LENGTH = ILI9341_LESS_PIXEL;    /*0 2 4 6模式下X方向像素宽度为240,Y方向为320*/
        LCD_Y_LENGTH = ILI9341_MORE_PIXEL;
    }
    else
    {
        LCD_X_LENGTH = ILI9341_MORE_PIXEL;    /*1 3 5 7模式下X方向像素宽度为320,Y方向为240*/
        LCD_Y_LENGTH = ILI9341_LESS_PIXEL;
    }
    /*0x36命令参数的高3位可用于设置GRAM扫描方向*/
    ILI9341_Write_Cmd(0x36);
    ILI9341_Write_Data(0x08|(ucOption<<5));    /*根据ucOption的值设置LCD参数,共0-7种模式*/
    ILI9341_Write_Cmd(CMD_SetCoordinateX);
    ILI9341_Write_Data(0x00);    /*x起始坐标高8位*/
    ILI9341_Write_Data(0x00);    /*x起始坐标低8位*/
    ILI9341_Write_Data(((LCD_X_LENGTH-1)>>8)&0xFF);    /*x结束坐标高8位*/
    ILI9341_Write_Data((LCD_X_LENGTH-1)&0xFF);    /*x结束坐标低8位*/
    
    ILI9341_Write_Cmd(CMD_SetCoordinateY);
    ILI9341_Write_Data(0x00);    /*y起始坐标高8位*/
    ILI9341_Write_Data(0x00);    /*y起始坐标低8位*/
    ILI9341_Write_Data(((LCD_Y_LENGTH-1)>>8)&0xFF);    /*y结束坐标高8位*/
    ILI9341_Write_Data((LCD_Y_LENGTH-1)&0xFF);    /*y结束坐标低8位*/
    
    /*write gram start*/
    ILI9341_Write_Cmd(CMD_SetPixel);
}


/*发送像素数据*/
static __inline void ILI9341_FillColor(uint32_t ulAmount_Point, uint16_t usColor)
{
    uint32_t i=0;
    /*memory write*/
    ILI9341_Write_Cmd(CMD_SetPixel);
    for(i=0; i<ulAmount_Point; i++)
    {
        ILI9341_Write_Data(usColor);
    }
}


/*设定ILI9341光标坐标*/
static void ILI9341_SetCursor(uint16_t usX, uint16_t usY)    /*usX: 在特定扫描方向下改点的X坐标*/
{                                                           /*usY: 在特定扫描方向下改点的Y坐标*/
    ILI9341_OpenWindow(usX, usY, 1, 1);    
}


/*对显示器某点以某种颜色填充*/
void ILI9341_SetPointPixel(uint16_t usX, uint16_t usY)
{
    if((usX<LCD_X_LENGTH) && (usY<LCD_Y_LENGTH))
    {
        ILI9341_SetCursor(usX, usY);
        ILI9341_FillColor(1,CurrentTextColor);
    }
}


/*绘制矩形*/
//void ILI9341_Draw_Rec(void)
//{
//    uint32_t i;
//    ILI9341_OpenWindow(10,20,40,80);
//    
//    ILI9341_Write_Cmd(CMD_SetPixel);
//    
//    for(i=0;i<200*100;i++)
//        ILI9341_Write_Data(RGB888_2_RGB565(0,0,255)); //
//     
//}

/**
 * @brief  在 ILI9341 显示器上画一个矩形
 * @param  usX_Start :在特定扫描方向下矩形的起始点X坐标
 * @param  usY_Start :在特定扫描方向下矩形的起始点Y坐标
 * @param  usWidth:矩形的宽度(单位:像素)
 * @param  usHeight:矩形的高度(单位:像素)
 * @param  ucFilled :选择是否填充该矩形
  *   该参数为以下值之一:
  *     @arg 0 :空心矩形
  *     @arg 1 :实心矩形 
 * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
 * @retval 无
 */
void ILI9341_DrawRectangle ( uint16_t usX_Start, uint16_t usY_Start, uint16_t usWidth, uint16_t usHeight, uint8_t ucFilled )
{
    if ( ucFilled )
    {
        ILI9341_OpenWindow ( usX_Start, usY_Start, usWidth, usHeight );
        ILI9341_FillColor ( usWidth * usHeight ,CurrentTextColor);    
    }
    else
    {
//        ILI9341_OpenWindow ( usX_Start, usY_Start, usWidth, usHeight );
//        ILI9341_FillColor ( usWidth * usHeight ,CurrentTextColor2);    
        ILI9341_DrawLine ( usX_Start, usY_Start, usX_Start + usWidth - 1, usY_Start );
        ILI9341_DrawLine ( usX_Start, usY_Start + usHeight - 1, usX_Start + usWidth - 1, usY_Start + usHeight - 1 );
        ILI9341_DrawLine ( usX_Start, usY_Start, usX_Start, usY_Start + usHeight - 1 );
        ILI9341_DrawLine ( usX_Start + usWidth - 1, usY_Start, usX_Start + usWidth - 1, usY_Start + usHeight - 1 );        
    }

}

//初始化LCD
void ILI9341_Init(void)
{
    ILI9341_GPIO_Config();
    ILI9341_FSMC_Config();
    
    ILI9341_BackLed_Control(ENABLE);    /*点亮LCD背光*/
    ILI9341_Rst();
    ILI9341_REG_Config();
    
    /*设置默认扫描方向,其中模式6为大部分液晶例程的默认显示方向*/
    ILI9341_GramScan(LCD_SCAN_MODE);
}



/*ILI9341显示器的某一窗口以某种颜色进行清屏*/
void ILI9341_Clear(uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight)
{
    ILI9341_OpenWindow(usX, usY, usWidth, usHeight);
    ILI9341_FillColor(usWidth * usHeight, CurrentBackColor);
}

    
/*读取ILI9341 GRAN的一个像素数据*/
static uint16_t ILI9341_Read_PixelData(void)
{
    uint16_t usR=0, usG=0, usB=0;
    ILI9341_Write_Cmd(0x2E);
    usR = ILI9341_Read_Data();
    usR = ILI9341_Read_Data();
    usR = ILI9341_Read_Data();
    
    return (((usR >> 11) << 11)|((usG  >>10) <<5 )|(usB >> 11));
}


/*获取ILI9341显示器上某个坐标点的像素数据*/
uint16_t ILI9341_GetPointPixel(uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight)
{
    uint16_t usPixelData;
    ILI9341_SetCursor(usX, usY);
    usPixelData = ILI9341_Read_PixelData();
    return usPixelData;
}


/*在ILI9341显示器上使用Bresenham算法画线段*/
void ILI9341_DrawLine ( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 )
    {/*usX1: 起始X坐标值,usY1: 起始Y坐标值, usX2: 终止X坐标值, usY2: 终止Y坐标值*/
    uint16_t us; 
    uint16_t usX_Current, usY_Current;
    
    int32_t lError_X = 0, lError_Y = 0, lDelta_X, lDelta_Y, lDistance; 
    int32_t lIncrease_X, lIncrease_Y;     
    
    
    lDelta_X = usX2 - usX1; //计算坐标增量 
    lDelta_Y = usY2 - usY1; 
    
    usX_Current = usX1; 
    usY_Current = usY1; 
    
    
    if ( lDelta_X > 0 ) 
        lIncrease_X = 1; //设置单步方向 
    
    else if ( lDelta_X == 0 ) 
        lIncrease_X = 0;//垂直线 
    
    else 
  { 
    lIncrease_X = -1;
    lDelta_X = - lDelta_X;
  } 

    
    if ( lDelta_Y > 0 )
        lIncrease_Y = 1; 
    
    else if ( lDelta_Y == 0 )
        lIncrease_Y = 0;//水平线 
    
    else 
  {
    lIncrease_Y = -1;
    lDelta_Y = - lDelta_Y;
  } 

    
    if (  lDelta_X > lDelta_Y )
        lDistance = lDelta_X; //选取基本增量坐标轴 
    
    else 
        lDistance = lDelta_Y; 

    
    for ( us = 0; us <= lDistance + 1; us++ )//画线输出 
    {  
        ILI9341_SetPointPixel ( usX_Current, usY_Current );//画点 
        
        lError_X += lDelta_X ; 
        lError_Y += lDelta_Y ; 
        
        if ( lError_X > lDistance ) 
        { 
            lError_X -= lDistance; 
            usX_Current += lIncrease_X; 
        }  
        
        if ( lError_Y > lDistance ) 
        { 
            lError_Y -= lDistance; 
            usY_Current += lIncrease_Y; 
        } 
    }  
}   

/**
  * @brief  设置LCD的前景(字体)颜色,RGB565
  * @param  Color: 指定前景(字体)颜色 
  * @retval None
  */
void LCD_SetTextColor(uint16_t Color)
{
    CurrentTextColor = Color;
}


/**
  * @brief  清除某行文字
  * @param  Line: 指定要删除的行
  *   本参数可使用宏LINE(0)、LINE(1)等方式指定要删除的行,
  *   宏LINE(x)会根据当前选择的字体来计算Y坐标值,并删除当前字体高度的第x行。
  * @retval None
  */
void LCD_ClearLine(uint16_t Line)
{
  ILI9341_Clear(0,Line,LCD_X_LENGTH,((sFONT *)LCD_GetFont())->Height);    /* 清屏,显示全黑 */

}

void ILI9341_DispChar_EN ( uint16_t usX, uint16_t usY, const char cChar )
{
    uint8_t  byteCount, bitCount,fontLength;    
    uint16_t ucRelativePositon;
    uint8_t *Pfont;
    
    //对ascii码表偏移(字模表不包含ASCII表的前32个非图形符号)
    ucRelativePositon = cChar - ' ';
    
    //每个字模的字节数
    fontLength = (LCD_Currentfonts->Width*LCD_Currentfonts->Height)/8;
        
    //字模首地址
    /*ascii码表偏移值乘以每个字模的字节数,求出字模的偏移位置*/
    Pfont = (uint8_t *)&LCD_Currentfonts->table[ucRelativePositon * fontLength];
    
    //设置显示窗口
    ILI9341_OpenWindow ( usX, usY, LCD_Currentfonts->Width, LCD_Currentfonts->Height);
    
    ILI9341_Write_Cmd ( CMD_SetPixel );            

    //按字节读取字模数据
    //由于前面直接设置了显示窗口,显示数据会自动换行
    for ( byteCount = 0; byteCount < fontLength; byteCount++ )
    {
            //一位一位处理要显示的颜色
            for ( bitCount = 0; bitCount < 8; bitCount++ )
            {
                    if ( Pfont[byteCount] & (0x80>>bitCount) )
                        ILI9341_Write_Data ( CurrentTextColor );            
                    else
                        ILI9341_Write_Data ( CurrentBackColor );
            }    
    }    
}


/**
 * @brief  在 ILI9341 显示器上显示英文字符串
 * @param  line :在特定扫描方向下字符串的起始Y坐标
  *   本参数可使用宏LINE(0)、LINE(1)等方式指定文字坐标,
  *   宏LINE(x)会根据当前选择的字体来计算Y坐标值。
    *        显示中文且使用LINE宏时,需要把英文字体设置成Font8x16
 * @param  pStr :要显示的英文字符串的首地址
 * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
 * @retval 无
 */
void ILI9341_DispStringLine_EN (  uint16_t line,  char * pStr )
{
    uint16_t usX = 0;
    
    while ( * pStr != '\0' )
    {
        if ( ( usX - ILI9341_DispWindow_X_Star + LCD_Currentfonts->Width ) > LCD_X_LENGTH )
        {
            usX = ILI9341_DispWindow_X_Star;
            line += LCD_Currentfonts->Height;
        }
        
        if ( ( line - ILI9341_DispWindow_Y_Star + LCD_Currentfonts->Height ) > LCD_Y_LENGTH )
        {
            usX = ILI9341_DispWindow_X_Star;
            line = ILI9341_DispWindow_Y_Star;
        }
        
        ILI9341_DispChar_EN ( usX, line, * pStr);

        pStr ++;
    
        usX += LCD_Currentfonts->Width;
        
    }
    
}


/**
 * @brief  在 ILI9341 显示器上使用 Bresenham 算法画圆
 * @param  usX_Center :在特定扫描方向下圆心的X坐标
 * @param  usY_Center :在特定扫描方向下圆心的Y坐标
 * @param  usRadius:圆的半径(单位:像素)
 * @param  ucFilled :选择是否填充该圆
  *   该参数为以下值之一:
  *     @arg 0 :空心圆
  *     @arg 1 :实心圆
 * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
 * @retval 无
 */
void ILI9341_DrawCircle ( uint16_t usX_Center, uint16_t usY_Center, uint16_t usRadius, uint8_t ucFilled )
{
    int16_t sCurrentX, sCurrentY;
    int16_t sError;
    
    
    sCurrentX = 0; sCurrentY = usRadius;      
    
    sError = 3 - ( usRadius << 1 );     //判断下个点位置的标志
    
    
    while ( sCurrentX <= sCurrentY )
    {
        int16_t sCountY;
        
        
        if ( ucFilled )             
            for ( sCountY = sCurrentX; sCountY <= sCurrentY; sCountY ++ ) 
            {                      
                ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center + sCountY );           //1,研究对象 
                ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center + sCountY );           //2       
                ILI9341_SetPointPixel ( usX_Center - sCountY,   usY_Center + sCurrentX );           //3
                ILI9341_SetPointPixel ( usX_Center - sCountY,   usY_Center - sCurrentX );           //4
                ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center - sCountY );           //5    
        ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center - sCountY );           //6
                ILI9341_SetPointPixel ( usX_Center + sCountY,   usY_Center - sCurrentX );           //7     
        ILI9341_SetPointPixel ( usX_Center + sCountY,   usY_Center + sCurrentX );           //0                
            }
        
        else
        {          
            ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center + sCurrentY );             //1,研究对象
            ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center + sCurrentY );             //2      
            ILI9341_SetPointPixel ( usX_Center - sCurrentY, usY_Center + sCurrentX );             //3
            ILI9341_SetPointPixel ( usX_Center - sCurrentY, usY_Center - sCurrentX );             //4
            ILI9341_SetPointPixel ( usX_Center - sCurrentX, usY_Center - sCurrentY );             //5       
            ILI9341_SetPointPixel ( usX_Center + sCurrentX, usY_Center - sCurrentY );             //6
            ILI9341_SetPointPixel ( usX_Center + sCurrentY, usY_Center - sCurrentX );             //7 
            ILI9341_SetPointPixel ( usX_Center + sCurrentY, usY_Center + sCurrentX );             //0
    }            
        
        sCurrentX ++;        
        if ( sError < 0 ) 
            sError += 4 * sCurrentX + 6;      
        
        else
        {
            sError += 10 + 4 * ( sCurrentX - sCurrentY );   
            sCurrentY --;
        }     
    }
}


/**
 * @brief  在 ILI9341 显示器上显示英文字符串
 * @param  usX :在特定扫描方向下字符的起始X坐标
 * @param  usY :在特定扫描方向下字符的起始Y坐标
 * @param  pStr :要显示的英文字符串的首地址
 * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
 * @retval 无
 */
void ILI9341_DispString_EN (     uint16_t usX ,uint16_t usY,  char * pStr )
{
    while ( * pStr != '\0' )
    {
        if ( ( usX - ILI9341_DispWindow_X_Star + LCD_Currentfonts->Width ) > LCD_X_LENGTH )
        {
            usX = ILI9341_DispWindow_X_Star;
            usY += LCD_Currentfonts->Height;
        }
        
        if ( ( usY - ILI9341_DispWindow_Y_Star + LCD_Currentfonts->Height ) > LCD_Y_LENGTH )
        {
            usX = ILI9341_DispWindow_X_Star;
            usY = ILI9341_DispWindow_Y_Star;
        }
        
        ILI9341_DispChar_EN ( usX, usY, * pStr);
        
        pStr ++;
        
        usX += LCD_Currentfonts->Width;
        
    }
    
}


/**
 * @brief  在 ILI9341 显示器上显示英文字符串(沿Y轴方向)
 * @param  usX :在特定扫描方向下字符的起始X坐标
 * @param  usY :在特定扫描方向下字符的起始Y坐标
 * @param  pStr :要显示的英文字符串的首地址
 * @note 可使用LCD_SetBackColor、LCD_SetTextColor、LCD_SetColors函数设置颜色
 * @retval 无
 */
void ILI9341_DispString_EN_YDir (     uint16_t usX,uint16_t usY ,  char * pStr )    /*字符沿着Y方向自增,其他函数默认沿着X轴方向*/
{    
    while ( * pStr != '\0' )
    {
        if ( ( usY - ILI9341_DispWindow_Y_Star + LCD_Currentfonts->Height ) >LCD_Y_LENGTH  )
        {
            usY = ILI9341_DispWindow_Y_Star;
            usX += LCD_Currentfonts->Width;    /*usX+当前字体的宽度作为下一个字符的X位置*/
        }
        
        if ( ( usX - ILI9341_DispWindow_X_Star + LCD_Currentfonts->Width ) >  LCD_X_LENGTH)
        {
            usX = ILI9341_DispWindow_X_Star;
            usY = ILI9341_DispWindow_Y_Star;
        }
        
        ILI9341_DispChar_EN ( usX, usY, * pStr);
        
        pStr ++;
        
        usY += LCD_Currentfonts->Height;    /**/    
    }    
}


/**
  * @brief  设置英文字体类型
  * @param  fonts: 指定要选择的字体
    *        参数为以下值之一
  *     @arg:Font24x32;
  *     @arg:Font16x24;
  *     @arg:Font8x16;
  * @retval None
  */
void LCD_SetFont(sFONT *fonts)
{
  LCD_Currentfonts = fonts;
}

/**
  * @brief  获取当前字体类型
  * @param  None.
  * @retval 返回当前字体类型
  */
sFONT *LCD_GetFont(void)
{
  return LCD_Currentfonts;
}


/**
  * @brief  设置LCD的背景颜色,RGB565
  * @param  Color: 指定背景颜色 
  * @retval None
  */
void LCD_SetBackColor(uint16_t Color)
{
  CurrentBackColor = Color;
}


/**
  * @brief  设置LCD的前景(字体)及背景颜色,RGB565
  * @param  TextColor: 指定前景(字体)颜色
  * @param  BackColor: 指定背景颜色
  * @retval None
  */
void LCD_SetColors(uint16_t TextColor, uint16_t BackColor) 
{
  CurrentTextColor = TextColor; 
  CurrentBackColor = BackColor;
}

/**
  * @brief  获取LCD的前景(字体)及背景颜色,RGB565
  * @param  TextColor: 用来存储前景(字体)颜色的指针变量
  * @param  BackColor: 用来存储背景颜色的指针变量
  * @retval None
  */
void LCD_GetColors(uint16_t *TextColor, uint16_t *BackColor)
{
  *TextColor = CurrentTextColor;
  *BackColor = CurrentBackColor;
}

  函数声明bsp_ili9341_lcd.h

#ifndef __ILI9341_LCD_H
#define __ILI9341_LCD_H

#include "stm32f10x.h"
#include "./font/fonts.h"

/*FSMC_Bank1_NORSRAM用于LCD命令操作的地址*/
#define FSMC_Addr_ILI9341_CMD        ((uint32_t) 0x60000000)
/*FSMC_Bank1_NORSRAM用于LCD数据操作的地址*/
#define FSMC_Addr_ILI9341_DATA    ((uint32_t) 0x60020000)
#define RGB888_2_RGB565(R,G,B)    (uint16_t)(((R & 0x1F) << 11) | ((G & 0x3F) << 5) | (B & 0x1F) )


#define USE_ZNZ 1

/*LCD控制信号****************************/
#ifdef USE_ZNZ
    /*由片选引脚决定的NOR/SRAM块*/
    #define     FSMC_BANK_NORSRAMx                FSMC_Bank1_NORSRAM1
    
    #define         ILI9341_CMD_ADDR          (__IO uint16_t*)(0x60000000)
  #define         ILI9341_DATA_ADDR          (__IO uint16_t*)(0x60020000)
 

    #define      ILI9341_CS_CLK           RCC_APB2Periph_GPIOD
    #define      ILI9341_CS_PORT          GPIOD
    #define      ILI9341_CS_PIN           GPIO_Pin_7

    #define      ILI9341_RST_CLK           RCC_APB2Periph_GPIOE
    #define      ILI9341_RST_PORT          GPIOE
    #define      ILI9341_RST_PIN           GPIO_Pin_1


    #define      ILI9341_BK_CLK           RCC_APB2Periph_GPIOD
    #define      ILI9341_BK_PORT          GPIOD
    #define      ILI9341_BK_PIN           GPIO_Pin_12


    #define      ILI9341_RD_CLK           RCC_APB2Periph_GPIOD
    #define      ILI9341_RD_PORT          GPIOD
    #define      ILI9341_RD_PIN           GPIO_Pin_4

    #define      ILI9341_WR_CLK           RCC_APB2Periph_GPIOD
    #define      ILI9341_WR_PORT          GPIOD
    #define      ILI9341_WR_PIN           GPIO_Pin_5

    #define      ILI9341_DC_CLK           RCC_APB2Periph_GPIOD
    #define      ILI9341_DC_PORT          GPIOD
    #define      ILI9341_DC_PIN           GPIO_Pin_11

#else

    #define     FSMC_BANK_NORSRAMx                FSMC_Bank1_NORSRAM4
    
    #define         ILI9341_CMD_ADDR          (__IO uint16_t*)(0x6c000000)
  #define         ILI9341_DATA_ADDR          (__IO uint16_t*)(0x6d000000)

    #define      ILI9341_CS_CLK           RCC_APB2Periph_GPIOG
    #define      ILI9341_CS_PORT          GPIOG
    #define      ILI9341_CS_PIN           GPIO_Pin_12

    #define      ILI9341_RST_CLK           RCC_APB2Periph_GPIOG
    #define      ILI9341_RST_PORT          GPIOG
    #define      ILI9341_RST_PIN           GPIO_Pin_11


    #define      ILI9341_BK_CLK           RCC_APB2Periph_GPIOG
    #define      ILI9341_BK_PORT          GPIOG
    #define      ILI9341_BK_PIN           GPIO_Pin_6


    #define      ILI9341_RD_CLK           RCC_APB2Periph_GPIOD
    #define      ILI9341_RD_PORT          GPIOD
    #define      ILI9341_RD_PIN           GPIO_Pin_4

    #define      ILI9341_WR_CLK           RCC_APB2Periph_GPIOD
    #define      ILI9341_WR_PORT          GPIOD
    #define      ILI9341_WR_PIN           GPIO_Pin_5

    #define      ILI9341_DC_CLK           RCC_APB2Periph_GPIOE
    #define      ILI9341_DC_PORT          GPIOE
    #define      ILI9341_DC_PIN           GPIO_Pin_2
    
#endif


#define      ILI9341_D0_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D0_PORT               GPIOD
#define      ILI9341_D0_PIN                GPIO_Pin_14

#define      ILI9341_D1_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D1_PORT               GPIOD
#define      ILI9341_D1_PIN                GPIO_Pin_15

#define      ILI9341_D2_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D2_PORT               GPIOD
#define      ILI9341_D2_PIN                GPIO_Pin_0

#define      ILI9341_D3_CLK                RCC_APB2Periph_GPIOD  
#define      ILI9341_D3_PORT               GPIOD
#define      ILI9341_D3_PIN                GPIO_Pin_1

#define      ILI9341_D4_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D4_PORT               GPIOE
#define      ILI9341_D4_PIN                GPIO_Pin_7

#define      ILI9341_D5_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D5_PORT               GPIOE
#define      ILI9341_D5_PIN                GPIO_Pin_8

#define      ILI9341_D6_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D6_PORT               GPIOE
#define      ILI9341_D6_PIN                GPIO_Pin_9

#define      ILI9341_D7_CLK                RCC_APB2Periph_GPIOE  
#define      ILI9341_D7_PORT               GPIOE
#define      ILI9341_D7_PIN                GPIO_Pin_10

#define      ILI9341_D8_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D8_PORT               GPIOE
#define      ILI9341_D8_PIN                GPIO_Pin_11

#define      ILI9341_D9_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D9_PORT               GPIOE
#define      ILI9341_D9_PIN                GPIO_Pin_12

#define      ILI9341_D10_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D10_PORT               GPIOE
#define      ILI9341_D10_PIN                GPIO_Pin_13

#define      ILI9341_D11_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D11_PORT               GPIOE
#define      ILI9341_D11_PIN                GPIO_Pin_14

#define      ILI9341_D12_CLK                RCC_APB2Periph_GPIOE   
#define      ILI9341_D12_PORT               GPIOE
#define      ILI9341_D12_PIN                GPIO_Pin_15

#define      ILI9341_D13_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D13_PORT               GPIOD
#define      ILI9341_D13_PIN                GPIO_Pin_8

#define      ILI9341_D14_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D14_PORT               GPIOD
#define      ILI9341_D14_PIN                GPIO_Pin_9

#define      ILI9341_D15_CLK                RCC_APB2Periph_GPIOD   
#define      ILI9341_D15_PORT               GPIOD
#define      ILI9341_D15_PIN                GPIO_Pin_10



/*************************************** 调试预用 ******************************************/

#define      DEBUG_DELAY()                

/******************************    ILI9341显示区域的起始坐标********************************/
#define ILI9341_DispWindow_X_Star                    0                        //起始点的X坐标
#define ILI9341_DispWindow_Y_Star                    0                        //起始点的Y坐标

#define ILI9341_LESS_PIXEL                                240                    //液晶屏较短方向的像素宽度
#define ILI9341_MORE_PIXEL                                320                    //液晶屏较长方向的像素宽度

/*根据液晶扫描方向而变化的XY像素宽度*/
/*调整ILI9341_GramScan函数设置方向时会自动更改*/
extern uint16_t LCD_X_LENGTH,LCD_Y_LENGTH;


/*液晶屏扫描模式,参数可选0-7*/
extern uint8_t LCD_SCAN_MORE;

/*******************************定义ILI9341常用颜色***********************************/
#define BACKGROUND                                            BLACK    /*默认黑色*/
#define WHITE                                                        0XFFFF
#define BLACK                                                        0X0000
#define GREY                                                        0XF7DE
#define BLUE                                                        0X001F
#define BLUE2                                                        0X051F
#define RED                                                            0XF800
#define MAGENTA                                                    0XF81F
#define GREEN                                                        0X07E0
#define CYAN                                                        0X7FFF
#define YELLOW                                                    0XFFE0
#define BRED                                                        0XF81F
#define GRED                                                        0XFFE0
#define GBLUE                                                        0X07FF


/******************************* 定义 ILI934 常用命令 ********************************/
#define      CMD_SetCoordinateX                     0x2A         //设置X坐标,Columu Address Set命令
#define      CMD_SetCoordinateY                     0x2B         //设置Y坐标,Page Address Set命令
#define      CMD_SetPixel                           0x2C         //填充像素
                                                                                    
/**************************声明ILI9341函数************************************************/                                                                                    
void ILI9341_Init(void);
void ILI9341_Rst(void);
void ILI9341_BackLed_Control(FunctionalState enumState);
void ILI9341_GramScan(uint8_t uc0tion);
void ILI9341_OpenWindow( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight );
void ILI9341_Clear( uint16_t usX, uint16_t usY, uint16_t usWidth, uint16_t usHeight );
void ILI9341_SetPointPixel( uint16_t usX, uint16_t usY );
//uint16_t  ILI9341_GetPointPixel( uint16_t usX , uint16_t usY );
void ILI9341_DrawLine( uint16_t usX1, uint16_t usY1, uint16_t usX2, uint16_t usY2 );
void ILI9341_DrawRectangle( uint16_t usX_Start, uint16_t usY_Start, uint16_t usWidth, uint16_t usHeight,uint8_t ucFilled );
void ILI9341_DrawCircle( uint16_t usX_Center, uint16_t usY_Center, uint16_t usRadius, uint8_t ucFilled );
void ILI9341_DispChar_EN( uint16_t usX, uint16_t usY, const char cChar );
void ILI9341_DispStringLine_EN( uint16_t line, char * pStr );
void ILI9341_DispString_EN( uint16_t usX, uint16_t usY, char * pStr );
void ILI9341_DispString_EN_YDir         (   uint16_t usX,uint16_t usY ,  char * pStr );
uint16_t Read_Pixel_Format(void);
    

void                                             LCD_SetFont                                            (sFONT *fonts);
sFONT                                         *LCD_GetFont                                            (void);
void                                             LCD_ClearLine                                        (uint16_t Line);
void                                             LCD_SetBackColor                                (uint16_t Color);
void                                             LCD_SetTextColor                                (uint16_t Color)    ;
void                                             LCD_SetColors                                        (uint16_t TextColor, uint16_t BackColor);
void                                             LCD_GetColors                                        (uint16_t *TextColor, uint16_t *BackColor);                                                
void LCD_Test(void);

#endif /* __ILI9341_LCD_H */

                                                                                    

 

3. 执行结果

     

 

   

 

 

  

 

标签:点亮,FSMC,Write,LCD,stm3210x,GPIO,Data,ILI9341
来源: https://www.cnblogs.com/kevin-hou1991/p/16307455.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有