开发板:野火指南者(STM32F103VE)
STM32库版本:STM32F10x_StdPeriph_Lib_V3.5.0
IDE:KEIL5(代码编写很不方便,只在编译的时候用到)
代码编写工具:Source Insight 4.0(跟读代码、编写代码的最佳工具)
硬件原理图:
1. 新建user_fsmc_lcd.h、user_fsmc_lcd.c、main.c 3个文件,并从STM32官方库的例子中将stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h拷贝到自己的工程目录下。
2. 在user_fsmc_lcd.h中添加如下代码
1 #ifndef __USER_FSMC_LCD_H 2 #define __USER_FSMC_LCD_H 3 4 #include "stm32f10x.h" 5 6 #define LCD_CMD ((uint32_t)0x60000000) 7 #define LCD_DATA ((uint32_t)0x60020000) 8 9 #define TEXTCOLOR 0xF80010 #define BACKGROUND 0x000011 12 13 14 void time_delay(uint32_t t); //时间延时函数15 void user_lcd_display_string(char * pchar); //显示英文字符串函数16 void user_lcd_fill_color(uint32_t fill_lcd, uint16_t color); //整个屏幕填充的颜色函数17 void user_lcd_clear(void); //清屏函数,将屏幕配置为黑色18 void user_lcd_display_char(uint16_t x, uint16_t y, char ch); //单个字符显示函数19 void user_View_Window(uint16_t lcd_x, uint16_t lcd_y, uint16_t lcd_width, uint16_t lcd_height); //初始化整个屏幕20 void user_LCD_Init(void); //LCD初始化函数21 void user_LCD_Scan(void); //LCD扫描函数,这里配置为模式六,即X--240, Y--320,X从左到右,Y从上到下扫描22 void user_LCD_DATA(uint16_t data); //LCD数据写入函数23 void user_LCD_CMD(uint16_t cmd); //LCD命令操作函数24 void user_LCD_REG_Config(void); //LCD对应的IC控制寄存器配置函数,这个配置与LCD上控制芯片相关,如何配置应该是向供应商获取的25 void user_FSMC_Config(void); //FSMC配置函数26 void user_LCD_BL(FunctionalState Status); //LCD背光信号控制函数27 void user_LCD_RST(FunctionalState Status); //LCD复位信号控制函数28 void user_LCD_GPIO_Config(void); //LCD相关GPIO PIN初始化函数29 30 31 32 #endif
3. 在user_fsmc_lcd.c中添加如下代码
1 #include "user_fsmc_lcd.h" 2 3 4 5 6 //存放英文字模的数组,宽度8bit像素,高度16bit像素 7 const uint8_t ASCII8x16_Table [ ] = { 8 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 9 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x08,0x00,0x08,0x18,0x00,0x00,0x00, 10 0x00,0x00,0x00,0x34,0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 11 0x00,0x00,0x00,0x00,0x16,0x24,0x7f,0x24,0x24,0x24,0x7e,0x24,0x24,0x00,0x00,0x00, 12 0x00,0x00,0x00,0x08,0x3e,0x68,0x48,0x68,0x1c,0x16,0x12,0x12,0x7c,0x10,0x10,0x00, 13 0x00,0x00,0x00,0x61,0xd2,0x96,0x74,0x08,0x10,0x16,0x29,0x49,0xc6,0x00,0x00,0x00, 14 0x00,0x00,0x00,0x00,0x3c,0x64,0x64,0x38,0x72,0x4a,0xce,0x46,0x7f,0x00,0x00,0x00, 15 0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 16 0x00,0x00,0x00,0x04,0x08,0x18,0x10,0x30,0x30,0x30,0x30,0x10,0x10,0x18,0x0c,0x04, 17 0x00,0x00,0x00,0x20,0x10,0x08,0x08,0x0c,0x04,0x04,0x04,0x0c,0x08,0x18,0x10,0x20, 18 0x00,0x00,0x00,0x08,0x0a,0x34,0x1c,0x6a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 19 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x7f,0x18,0x18,0x18,0x00,0x00,0x00, 20 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x08,0x30,0x00, 21 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00, 22 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 23 0x00,0x00,0x00,0x02,0x06,0x04,0x0c,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x00,0x00, 24 0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x47,0x5b,0x73,0x42,0x66,0x3c,0x00,0x00,0x00, 25 0x00,0x00,0x00,0x00,0x18,0x78,0x48,0x08,0x08,0x08,0x08,0x08,0x7e,0x00,0x00,0x00, 26 0x00,0x00,0x00,0x00,0x3c,0x46,0x06,0x06,0x04,0x08,0x10,0x20,0x7e,0x00,0x00,0x00, 27 0x00,0x00,0x00,0x00,0x7c,0x06,0x06,0x04,0x3c,0x02,0x02,0x06,0x7c,0x00,0x00,0x00, 28 0x00,0x00,0x00,0x00,0x0c,0x1c,0x14,0x24,0x64,0x44,0xff,0x04,0x04,0x00,0x00,0x00, 29 0x00,0x00,0x00,0x00,0x7e,0x60,0x60,0x60,0x7e,0x02,0x02,0x06,0x7c,0x00,0x00,0x00, 30 0x00,0x00,0x00,0x00,0x1e,0x30,0x60,0x48,0x76,0x42,0x42,0x62,0x3c,0x00,0x00,0x00, 31 0x00,0x00,0x00,0x00,0x7e,0x02,0x06,0x04,0x0c,0x08,0x18,0x10,0x30,0x00,0x00,0x00, 32 0x00,0x00,0x00,0x00,0x3c,0x62,0x42,0x36,0x1c,0x66,0x42,0x42,0x3c,0x00,0x00,0x00, 33 0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x42,0x66,0x1a,0x02,0x04,0x78,0x00,0x00,0x00, 34 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, 35 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x08,0x30,0x00, 36 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x18,0x30,0x60,0x10,0x0c,0x06,0x00,0x00,0x00, 37 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x7e,0x00,0x00,0x00,0x00,0x00, 38 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x18,0x04,0x06,0x0c,0x10,0x20,0x00,0x00,0x00, 39 0x00,0x00,0x00,0x30,0x1c,0x06,0x06,0x06,0x18,0x10,0x00,0x10,0x10,0x00,0x00,0x00, 40 0x00,0x00,0x00,0x1c,0x22,0x41,0x41,0xdd,0xb5,0xa5,0xa5,0xaf,0x94,0xc0,0x40,0x3c, 41 0x00,0x00,0x00,0x00,0x18,0x1c,0x34,0x24,0x26,0x62,0x7e,0x43,0xc1,0x00,0x00,0x00, 42 0x00,0x00,0x00,0x00,0x7c,0x46,0x42,0x46,0x7c,0x42,0x42,0x42,0x7c,0x00,0x00,0x00, 43 0x00,0x00,0x00,0x00,0x1e,0x20,0x40,0x40,0x40,0x40,0x40,0x60,0x3e,0x00,0x00,0x00, 44 0x00,0x00,0x00,0x00,0x7c,0x46,0x42,0x43,0x43,0x43,0x42,0x46,0x78,0x00,0x00,0x00, 45 0x00,0x00,0x00,0x00,0x7e,0x60,0x60,0x60,0x7e,0x60,0x60,0x60,0x7e,0x00,0x00,0x00, 46 0x00,0x00,0x00,0x00,0x7e,0x60,0x60,0x60,0x7e,0x60,0x60,0x60,0x60,0x00,0x00,0x00, 47 0x00,0x00,0x00,0x00,0x1e,0x60,0x40,0x40,0xce,0x42,0x42,0x62,0x3e,0x00,0x00,0x00, 48 0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x7e,0x42,0x42,0x42,0x42,0x00,0x00,0x00, 49 0x00,0x00,0x00,0x00,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00, 50 0x00,0x00,0x00,0x00,0x7c,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x78,0x00,0x00,0x00, 51 0x00,0x00,0x00,0x00,0x42,0x44,0x48,0x50,0x70,0x58,0x4c,0x44,0x42,0x00,0x00,0x00, 52 0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,0x00,0x00,0x00, 53 0x00,0x00,0x00,0x00,0x62,0x66,0x67,0x5f,0x5b,0x5b,0xc1,0xc1,0xc1,0x00,0x00,0x00, 54 0x00,0x00,0x00,0x00,0x62,0x62,0x72,0x52,0x5a,0x4a,0x4e,0x46,0x46,0x00,0x00,0x00, 55 0x00,0x00,0x00,0x00,0x3c,0x62,0x43,0xc3,0xc3,0xc3,0x43,0x62,0x3c,0x00,0x00,0x00, 56 0x00,0x00,0x00,0x00,0x7c,0x46,0x42,0x42,0x46,0x78,0x40,0x40,0x40,0x00,0x00,0x00, 57 0x00,0x00,0x00,0x00,0x3c,0x62,0x43,0xc3,0xc3,0xc3,0x43,0x62,0x3c,0x18,0x0f,0x00, 58 0x00,0x00,0x00,0x00,0x7c,0x66,0x62,0x66,0x7c,0x6c,0x64,0x66,0x62,0x00,0x00,0x00, 59 0x00,0x00,0x00,0x00,0x3e,0x60,0x40,0x60,0x1c,0x06,0x02,0x02,0x7c,0x00,0x00,0x00, 60 0x00,0x00,0x00,0x00,0x7f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00, 61 0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x62,0x3c,0x00,0x00,0x00, 62 0x00,0x00,0x00,0x00,0xc1,0x43,0x42,0x62,0x26,0x24,0x34,0x1c,0x18,0x00,0x00,0x00, 63 0x00,0x00,0x00,0x00,0xc1,0xc1,0x41,0x49,0x5b,0x5b,0x76,0x66,0x66,0x00,0x00,0x00, 64 0x00,0x00,0x00,0x00,0x43,0x66,0x34,0x18,0x18,0x1c,0x24,0x66,0xc3,0x00,0x00,0x00, 65 0x00,0x00,0x00,0x00,0xc1,0x42,0x66,0x34,0x1c,0x18,0x18,0x18,0x18,0x00,0x00,0x00, 66 0x00,0x00,0x00,0x00,0x7e,0x02,0x04,0x0c,0x18,0x10,0x20,0x60,0x7e,0x00,0x00,0x00, 67 0x00,0x00,0x00,0x1c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1c, 68 0x00,0x00,0x00,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x0c,0x04,0x06,0x02,0x00,0x00, 69 0x00,0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c, 70 0x00,0x00,0x00,0x00,0x18,0x1c,0x24,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 71 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff, 72 0x00,0x00,0x00,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 73 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x06,0x02,0x3e,0x42,0x46,0x7a,0x00,0x00,0x00, 74 0x00,0x00,0x00,0x40,0x40,0x40,0x5c,0x62,0x42,0x42,0x42,0x42,0x7c,0x00,0x00,0x00, 75 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x20,0x60,0x40,0x60,0x20,0x3e,0x00,0x00,0x00, 76 0x00,0x00,0x00,0x02,0x02,0x02,0x3e,0x62,0x42,0x42,0x42,0x66,0x3a,0x00,0x00,0x00, 77 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x62,0x42,0x7e,0x40,0x60,0x3e,0x00,0x00,0x00, 78 0x00,0x00,0x00,0x0f,0x18,0x10,0x10,0x7e,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, 79 0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x66,0x42,0x66,0x58,0x40,0x3e,0x43,0x42,0x3c, 80 0x00,0x00,0x00,0x40,0x40,0x40,0x5c,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, 81 0x00,0x00,0x00,0x18,0x18,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x7e,0x00,0x00,0x00, 82 0x00,0x00,0x00,0x04,0x0c,0x00,0x7c,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0c,0x78, 83 0x00,0x00,0x00,0x60,0x60,0x60,0x62,0x6c,0x78,0x70,0x68,0x64,0x62,0x00,0x00,0x00, 84 0x00,0x00,0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x7e,0x00,0x00,0x00, 85 0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x4b,0x4b,0x4b,0x4b,0x4b,0x4b,0x00,0x00,0x00, 86 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x62,0x42,0x42,0x42,0x42,0x42,0x00,0x00,0x00, 87 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x62,0x42,0x43,0x42,0x62,0x3c,0x00,0x00,0x00, 88 0x00,0x00,0x00,0x00,0x00,0x00,0x5c,0x62,0x42,0x42,0x42,0x42,0x7c,0x40,0x40,0x40, 89 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x62,0x42,0x42,0x42,0x66,0x3a,0x02,0x02,0x02, 90 0x00,0x00,0x00,0x00,0x00,0x00,0x6e,0x72,0x63,0x60,0x60,0x60,0x60,0x00,0x00,0x00, 91 0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x20,0x20,0x3c,0x06,0x02,0x7c,0x00,0x00,0x00, 92 0x00,0x00,0x00,0x00,0x10,0x10,0xfe,0x10,0x10,0x10,0x10,0x10,0x1e,0x00,0x00,0x00, 93 0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x66,0x3a,0x00,0x00,0x00, 94 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x42,0x66,0x24,0x34,0x18,0x18,0x00,0x00,0x00, 95 0x00,0x00,0x00,0x00,0x00,0x00,0xc1,0xc1,0x5b,0x5a,0x5e,0x66,0x66,0x00,0x00,0x00, 96 0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x26,0x1c,0x18,0x1c,0x26,0x62,0x00,0x00,0x00, 97 0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x42,0x66,0x24,0x34,0x1c,0x18,0x18,0x30,0xe0, 98 0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x06,0x0c,0x18,0x10,0x20,0x7e,0x00,0x00,0x00, 99 0x00,0x00,0x00,0x0e,0x18,0x10,0x10,0x10,0x30,0x70,0x10,0x10,0x10,0x10,0x18,0x0e,100 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,101 0x00,0x00,0x00,0x30,0x18,0x08,0x08,0x08,0x0c,0x0e,0x08,0x08,0x08,0x08,0x18,0x30,102 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0x4b,0x06,0x00,0x00,0x00,0x00,0x00,103 }; 104 105 106 107 //LCD相关GPIO PIN初始化函数108 void user_LCD_GPIO_Config(void)109 {110 GPIO_InitTypeDef LCD_GPIO_Config;111 112 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);113 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);114 115 LCD_GPIO_Config.GPIO_Mode = GPIO_Mode_AF_PP;116 LCD_GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;117 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_14;118 GPIO_Init(GPIOD, &LCD_GPIO_Config);119 120 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_15;121 GPIO_Init(GPIOD, &LCD_GPIO_Config);122 123 124 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_0;125 GPIO_Init(GPIOD, &LCD_GPIO_Config);126 127 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_1;128 GPIO_Init(GPIOD, &LCD_GPIO_Config);129 130 131 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_7;132 GPIO_Init(GPIOE, &LCD_GPIO_Config);133 134 135 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_8;136 GPIO_Init(GPIOE, &LCD_GPIO_Config);137 138 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_9;139 GPIO_Init(GPIOE, &LCD_GPIO_Config);140 141 142 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_10;143 GPIO_Init(GPIOE, &LCD_GPIO_Config);144 145 146 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_11;147 GPIO_Init(GPIOE, &LCD_GPIO_Config);148 149 150 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_12;151 GPIO_Init(GPIOE, &LCD_GPIO_Config);152 153 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_13;154 GPIO_Init(GPIOE, &LCD_GPIO_Config);155 156 157 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_14;158 GPIO_Init(GPIOE, &LCD_GPIO_Config);159 160 161 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_15;162 GPIO_Init(GPIOE, &LCD_GPIO_Config);163 164 165 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_8;166 GPIO_Init(GPIOD, &LCD_GPIO_Config);167 168 169 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_9;170 GPIO_Init(GPIOD, &LCD_GPIO_Config);171 172 173 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_10;174 GPIO_Init(GPIOD, &LCD_GPIO_Config);175 176 177 178 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_7;179 GPIO_Init(GPIOD, &LCD_GPIO_Config);180 181 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_4;182 GPIO_Init(GPIOD, &LCD_GPIO_Config);183 184 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_5;185 GPIO_Init(GPIOD, &LCD_GPIO_Config);186 187 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_11;188 GPIO_Init(GPIOD, &LCD_GPIO_Config);189 190 191 LCD_GPIO_Config.GPIO_Mode = GPIO_Mode_Out_PP;192 LCD_GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;193 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_1;194 GPIO_Init(GPIOE, &LCD_GPIO_Config);195 196 LCD_GPIO_Config.GPIO_Pin = GPIO_Pin_12;197 GPIO_Init(GPIOD, &LCD_GPIO_Config);198 199 user_LCD_RST(ENABLE);200 user_LCD_RST(DISABLE);201 202 user_LCD_BL(ENABLE);203 204 205 }206 207 //LCD复位信号控制函数208 void user_LCD_RST(FunctionalState Status)209 {210 211 if(Status == DISABLE)212 {213 GPIOE->BSRR = GPIO_Pin_1;214 }215 216 else217 {218 GPIOE->BRR = GPIO_Pin_1;219 }220 221 222 }223 224 //LCD背光信号控制函数225 void user_LCD_BL(FunctionalState Status)226 {227 if(Status == DISABLE)228 {229 GPIOD->BSRR = GPIO_Pin_12; 230 }231 232 else233 {234 GPIOD->BRR = GPIO_Pin_12;235 }236 237 }238 239 //FSMC配置函数240 void user_FSMC_Config(void)241 {242 FSMC_NORSRAMTimingInitTypeDef LCD_FSMC_Timing;243 FSMC_NORSRAMInitTypeDef LCD_FSMC_Config;244 245 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);246 247 LCD_FSMC_Timing.FSMC_AccessMode = FSMC_AccessMode_B;248 LCD_FSMC_Timing.FSMC_AddressHoldTime = 0x00;249 LCD_FSMC_Timing.FSMC_AddressSetupTime = 0x01;250 LCD_FSMC_Timing.FSMC_BusTurnAroundDuration = 0x00;251 LCD_FSMC_Timing.FSMC_CLKDivision = 0x00;252 LCD_FSMC_Timing.FSMC_DataLatency = 0x00;253 LCD_FSMC_Timing.FSMC_DataLatency = 0x00;254 LCD_FSMC_Timing.FSMC_DataSetupTime = 0x04;255 256 257 LCD_FSMC_Config.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;258 LCD_FSMC_Config.FSMC_Bank = FSMC_Bank1_NORSRAM1;259 LCD_FSMC_Config.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;260 LCD_FSMC_Config.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;261 LCD_FSMC_Config.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;262 LCD_FSMC_Config.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;263 LCD_FSMC_Config.FSMC_MemoryType = FSMC_MemoryType_NOR;264 LCD_FSMC_Config.FSMC_ReadWriteTimingStruct = &LCD_FSMC_Timing;265 LCD_FSMC_Config.FSMC_WaitSignal = FSMC_WaitSignal_Disable;266 LCD_FSMC_Config.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;267 LCD_FSMC_Config.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;268 LCD_FSMC_Config.FSMC_WrapMode = FSMC_WrapMode_Disable;269 LCD_FSMC_Config.FSMC_WriteBurst = FSMC_WriteBurst_Disable;270 LCD_FSMC_Config.FSMC_WriteOperation = FSMC_WriteOperation_Enable;271 LCD_FSMC_Config.FSMC_WriteTimingStruct = &LCD_FSMC_Timing;272 273 FSMC_NORSRAMInit(&LCD_FSMC_Config);274 FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);275 276 277 278 }279 280 //LCD对应的IC控制寄存器配置函数,这个配置与LCD上控制芯片相关,如何配置应该是向供应商获取的281 void user_LCD_REG_Config(void)282 {283 /* Power control B (CFh) */284 285 user_LCD_CMD( 0xCF );286 user_LCD_DATA ( 0x00 );287 user_LCD_DATA ( 0x81 );288 user_LCD_DATA ( 0x30 );289 290 /* Power on sequence control (EDh) */291 292 user_LCD_CMD ( 0xED );293 user_LCD_DATA ( 0x64 );294 user_LCD_DATA ( 0x03 );295 user_LCD_DATA ( 0x12 );296 user_LCD_DATA ( 0x81 );297 298 /* Driver timing control A (E8h) */299 300 user_LCD_CMD ( 0xE8 );301 user_LCD_DATA ( 0x85 );302 user_LCD_DATA ( 0x10 );303 user_LCD_DATA ( 0x78 );304 305 /* Power control A (CBh) */306 307 user_LCD_CMD ( 0xCB );308 user_LCD_DATA ( 0x39 );309 user_LCD_DATA ( 0x2C );310 user_LCD_DATA ( 0x00 );311 user_LCD_DATA ( 0x34 );312 user_LCD_DATA ( 0x02 );313 314 /* Pump ratio control (F7h) */315 316 user_LCD_CMD ( 0xF7 );317 user_LCD_DATA ( 0x20 );318 319 /* Driver timing control B */320 321 user_LCD_CMD ( 0xEA );322 user_LCD_DATA ( 0x00 );323 user_LCD_DATA ( 0x00 );324 325 /* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */326 327 user_LCD_CMD ( 0xB1 );328 user_LCD_DATA ( 0x00 );329 user_LCD_DATA ( 0x1B );330 331 /* Display Function Control (B6h) */332 333 user_LCD_CMD ( 0xB6 );334 user_LCD_DATA ( 0x0A );335 user_LCD_DATA ( 0xA2 );336 337 /* Power Control 1 (C0h) */338 339 user_LCD_CMD ( 0xC0 );340 user_LCD_DATA ( 0x35 );341 342 /* Power Control 2 (C1h) */343 344 user_LCD_CMD( 0xC1 );345 user_LCD_DATA( 0x11 );346 347 /* VCOM Control 1 (C5h) */348 user_LCD_CMD( 0xC5 );349 user_LCD_DATA( 0x45 );350 user_LCD_DATA( 0x45 );351 352 /* VCOM Control 2 (C7h) */353 user_LCD_CMD ( 0xC7 );354 user_LCD_DATA ( 0xA2 );355 356 /* Enable 3G (F2h) */357 user_LCD_CMD ( 0xF2 );358 user_LCD_DATA ( 0x00 );359 360 /* Gamma Set (26h) */361 user_LCD_CMD ( 0x26 );362 user_LCD_DATA ( 0x01 );363 364 365 /* Positive Gamma Correction */366 user_LCD_CMD ( 0xE0 ); //Set Gamma367 user_LCD_DATA ( 0x0F );368 user_LCD_DATA ( 0x26 );369 user_LCD_DATA ( 0x24 );370 user_LCD_DATA ( 0x0B );371 user_LCD_DATA ( 0x0E );372 user_LCD_DATA ( 0x09 );373 user_LCD_DATA ( 0x54 );374 user_LCD_DATA ( 0xA8 );375 user_LCD_DATA ( 0x46 );376 user_LCD_DATA ( 0x0C );377 user_LCD_DATA ( 0x17 );378 user_LCD_DATA ( 0x09 );379 user_LCD_DATA ( 0x0F );380 user_LCD_DATA ( 0x07 );381 user_LCD_DATA ( 0x00 );382 383 /* Negative Gamma Correction (E1h) */384 user_LCD_CMD ( 0XE1 ); //Set Gamma385 user_LCD_DATA ( 0x00 );386 user_LCD_DATA ( 0x19 );387 user_LCD_DATA ( 0x1B );388 user_LCD_DATA ( 0x04 );389 user_LCD_DATA ( 0x10 );390 user_LCD_DATA ( 0x07 );391 user_LCD_DATA ( 0x2A );392 user_LCD_DATA ( 0x47 );393 user_LCD_DATA ( 0x39 );394 user_LCD_DATA ( 0x03 );395 user_LCD_DATA ( 0x06 );396 user_LCD_DATA ( 0x06 );397 user_LCD_DATA ( 0x30 );398 user_LCD_DATA ( 0x38 );399 user_LCD_DATA ( 0x0F );400 401 /* memory access control set */402 403 user_LCD_CMD ( 0x36 ); 404 user_LCD_DATA ( 0xC8 ); /*���� ���Ͻǵ� (���)�����½� (�յ�)ɨ�跽ʽ*/405 406 407 /* column address control set */408 user_LCD_CMD ( 0x2A ); 409 user_LCD_DATA ( 0x00 );410 user_LCD_DATA ( 0x00 );411 user_LCD_DATA ( 0x00 );412 user_LCD_DATA ( 0xEF );413 414 /* page address control set */415 416 user_LCD_CMD ( 0x2B ); 417 user_LCD_DATA ( 0x00 );418 user_LCD_DATA ( 0x00 );419 user_LCD_DATA ( 0x01 );420 user_LCD_DATA ( 0x3F );421 422 /* Pixel Format Set (3Ah) */423 424 user_LCD_CMD ( 0x3a ); 425 user_LCD_DATA ( 0x55 );426 427 /* Sleep Out (11h) */428 user_LCD_CMD ( 0x11 ); 429 //ILI9341_Delay ( 0xAFFf<<2 );430 431 432 /* Display ON (29h) */433 user_LCD_CMD ( 0x29 ); 434 435 436 437 }438 439 //LCD命令操作函数440 void user_LCD_CMD(uint16_t cmd)441 {442 *(volatile uint16_t *) (LCD_CMD) = cmd;443 444 }445 446 //LCD数据写入函数447 void user_LCD_DATA(uint16_t data)448 {449 *(volatile uint16_t *) (LCD_DATA) = data;450 451 }452 453 454 455 //LCD扫描函数,这里配置为模式六,即X--240, Y--320,X从左到右,Y从上到下扫描456 void user_LCD_Scan(void)457 {458 459 user_LCD_CMD(0x36);460 //user_LCD_DATA(0x08 | (6 << 5));461 user_LCD_CMD(0x68);462 463 user_LCD_CMD(0x2A);464 user_LCD_DATA(0x00);465 user_LCD_DATA(0x00);466 user_LCD_DATA(((240 - 1) >> 8)&0xFF); //因为从0开始,所以需要-1467 user_LCD_DATA((240 - 1) &0xFF);468 469 470 471 user_LCD_CMD(0x2B);472 user_LCD_DATA(0x00);473 user_LCD_DATA(0x00);474 user_LCD_DATA(((320 - 1) >> 8)&0xFF);475 user_LCD_DATA((320 - 1) &0xFF);476 477 // user_LCD_CMD(0x2C); //这条语句后面没有跟填充的数据,去掉也不影响,这里应该是多余的478 479 480 481 }482 483 //LCD初始化函数484 void user_LCD_Init(void)485 {486 user_LCD_GPIO_Config();487 user_FSMC_Config();488 489 user_LCD_REG_Config();490 491 user_LCD_Scan();492 }493 494 495 //初始化整个屏幕496 void user_View_Window(uint16_t lcd_x, uint16_t lcd_y, uint16_t lcd_width, uint16_t lcd_height)497 {498 499 user_LCD_CMD(0x2A); //行初始化命令500 user_LCD_DATA(lcd_x >> 8); //行起始点坐标,先给高8bit501 user_LCD_DATA(lcd_x & 0xFF);502 user_LCD_DATA((lcd_x + lcd_width - 1) >> 8 ); //行结束点坐标,先给高8bit503 user_LCD_DATA((lcd_x + lcd_width -1) & 0xFF);504 505 506 user_LCD_CMD(0x2B); //列初始化命令507 user_LCD_DATA(lcd_y >> 8); //列起始点坐标,先给高8bit508 user_LCD_DATA(lcd_y & 0xFF);509 user_LCD_DATA((lcd_y + lcd_height -1 ) >> 8); //列结束点坐标,先给高8bit510 user_LCD_DATA((lcd_y + lcd_height -1 ) & 0xFF);511 512 }513 514 //单个字符显示函数515 void user_lcd_display_char(uint16_t x, uint16_t y, char ch)516 {517 uint16_t a,b,c,d;518 519 uint8_t * pfont;520 521 a = ch - ' ';522 b = 16;523 524 pfont = (uint8_t *)&ASCII8x16_Table[a * b]; //找到字模开始的位置,一个字的字模占16个字节525 526 user_View_Window(x, y, 8, 16); //显示单个字模所需屏幕尺寸527 528 user_LCD_CMD(0x2C); //填充像素命令529 530 for(c = 0; c < 16; c++)531 {532 for(d = 0; d < 8; d++)533 {534 if(*pfont & (0x80 >> d))535 {536 user_LCD_DATA(TEXTCOLOR);537 }538 else539 {540 user_LCD_DATA(BACKGROUND);541 }542 543 }544 pfont++;545 }546 547 548 549 550 551 552 }553 554 //清屏函数,将屏幕配置为黑色555 void user_lcd_clear(void)556 {557 user_View_Window(0, 0, 240, 320);558 user_lcd_fill_color(240*320, BACKGROUND);559 560 561 }562 563 //整个屏幕填充的颜色函数564 void user_lcd_fill_color(uint32_t fill_lcd, uint16_t color)565 {566 uint32_t i;567 568 user_LCD_CMD(0x2C);569 for(i = 0; i < fill_lcd; i++)570 {571 user_LCD_DATA(color);572 573 }574 575 }576 577 //显示英文字符串函数578 void user_lcd_display_string(char * pchar)579 {580 uint16_t x = 0,y = 0;581 582 while(*pchar != '\0')583 {584 585 if((x + 8) > 240)586 {587 x = 0;588 y += 16;589 }590 if((y + 16) > 320)591 {592 x = 0;593 y = 0;594 }595 596 user_lcd_display_char(x, y, *pchar);597 598 pchar++;599 x +=8;600 601 602 }603 604 605 }606 607 //时间延时函数608 void time_delay(volatile uint32_t t)609 {610 uint32_t time = t;611 uint32_t i;612 613 for(i = 0; i < time; i++)614 {615 616 }617 618 }
4. 在main.c中添加如下代码
1 #include "stm32f10x.h" 2 #include "user_fsmc_lcd.h" 3 4 5 int main(void) 6 { 7 user_LCD_Init(); 8 9 //user_LCD_Scan();10 11 while(1)12 {13 user_lcd_clear();14 15 user_lcd_display_string("it's test!");16 17 time_delay(0xFFFFFF);18 19 }20 21 }
总结:
1. void user_LCD_REG_Config(void)这个LCD 控制寄存器配置没有搞清楚是要怎么配置,有可能直接是向ILI9341芯片厂商索取的
2. 本实验有个很奇怪的现象就是,每次开关开发的电源时,LCD会白屏一段时间,其多次开关后,会一直白屏,原因暂未找到
实验源码:
链接:
提取码:whaa