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. 执行结果