OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 759|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第二十五章 TFTLCD(MCU屏)实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-4-15 17:25:49 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-4-13 17:57 编辑

第二十五章 TFTLCD(MCU屏)实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版


4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章将介绍使用STM32F103驱动TFTLCD(MCU屏)进行显示。通过本章的学习,读者将学习到FSMC的使用。
本章分为如下几个小节:
25.1硬件设计
25.2 程序设计
25.3 下载验证

25.1 硬件设计
25.1.1 例程功能
1. TFTLCD上显示实验信息,并不断刷新底色
2. LED0闪烁,提示程序正在运行

25.1.2 硬件资源
1. LED
       LED0 - PB5
2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块

25.1.3 原理图
本章实验使用了正点原子的TFTLCD模块(兼容正点原子2.8/3.5/4.3/7/10寸的TFTLCD模块),该模块需通过LCD转接板与板载的TFTLCD接口进行连接,该接口与板载MCU的连接原理图,如下图所示:                                 
1.png
图25.1.3.1 TFTLCD模块与MCU的连接原理图
从上图中可以看到,TFTLCD模块连接至FSMC的存储块1的区域块1,并且使用了地址线A19作为TFTLCD模块命令或数据的选择信号,可计算出配置好FSMC后,TFTLCD模块的命令访问地址被映射到0x600FFFFE,TFTLCD模块的数据访问地址被映射到0x60100000。

25.2 程序设计
25.2.1 HAL库的FSMC驱动
本章实验通过FSMC驱动8080并口的TFTLCD模块,通过FSMC可以将TFTLCD模块的命令和数据寄存器映射为两个地址,往这两个地址写入或读取数据就可直接与TFTLCD模块进行通讯,因此需要对FSMC做相应的配置,具体的步骤如下:
①:配置FSMC存储块1的区域块1
在HAL库中对应的驱动函数如下:
①:配置FSMC存储块1的区域块
该函数用于配置FSMC存储块1的区域块,其函数原型如下所示:
  1. HAL_StatusTypeDef HAL_SRAM_Init(   SRAM_HandleTypeDef *hsram,
  2.                                      FMC_NORSRAM_TimingTypeDef*Timing,
  3.                                      FMC_NORSRAM_TimingTypeDef*ExtTiming);
复制代码
该函数的形参描述,如下表所示:
QQ截图20240413175716.png
表25.2.1.1 函数HAL_SRAM_Init()形参描述
该函数的返回值描述,如下表所示:
QQ截图20240413175726.png
表25.2.1.2 函数HAL_SRAM_Init()返回值描述
该函数使用FMC_NORSRAM_TimingTypeDef类型的结构体变量传入FSMC存储块1区域块的读写时序配置参数,该结构体的定义如下所示:
  1. typedef struct
  2. {
  3.     uint32_t AddressSetupTime;      /* 地址建立时间 */
  4.     uint32_t AddressHoldTime;       /* 地址保持时间 */
  5.     uint32_t DataSetupTime;         /* 数据建立时间 */
  6.     uint32_tBusTurnAroundDuration; /* 总线转换时间 */
  7.     uint32_t CLKDivision;           /* 时钟分频系数 */
  8.     uint32_t DataLatency;           /* 数据延时 */
  9.     uint32_t AccessMode;            /* 访问模式 */
  10. }FSMC_NORSRAM_TimingTypeDef;
复制代码
该函数的使用示例,如下所示:
  1. #include "stm32f1xx_hal.h"
  2. void example_fun(void)
  3. {
  4.    SRAM_HandleTypeDef sram_handle = {0};
  5.    FSMC_NORSRAM_TimingTypeDef read_timing = {0};
  6.    FSMC_NORSRAM_TimingTypeDef write_timing = {0};
  7.    
  8.     /* 填充读数据结构体 */
  9.    read_timing.AddressSetupTime = 0xFF;
  10.    read_timing.AddressHoldTime = 0xFF;
  11.    read_timing.DataSetupTime = 0xFF;
  12.    read_timing.AccessMode = FSMC_ACCESS_MODE_A;
  13.    
  14.     /* 填充写时序结构体 */
  15.    write_timing.AddressSetupTime = 0xFF;
  16.    write_timing.AddressHoldTime = 0xFF;
  17.    write_timing.DataSetupTime = 0xFF;
  18.    write_timing.AccessMode = FSMC_ACCESS_MODE_A;
  19.    
  20.     /* 配置FSMC存储块1的区域块 */
  21.    sram_handle.Instance =FSMC_NORSRAM_DEVICE;
  22.    sram_handle.Extended =FSMC_NORSRAM_EXTENDED_DEVICE;
  23.    sram_handle.Init.NSBank = FSMC_NORSRAM_BANK1;
  24.    sram_handle.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE;
  25.    sram_handle.Init.MemoryType =FSMC_MEMORY_TYPE_SRAM;
  26.    sram_handle.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  27.    sram_handle.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE;
  28.    sram_handle.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;
  29.    sram_handle.Init.WrapMode =FSMC_WRAP_MODE_DISABLE;
  30.    sram_handle.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS;
  31.    sram_handle.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE;
  32.    sram_handle.Init.WaitSignal =FSMC_WAIT_SIGNAL_DISABLE;
  33.    sram_handle.Init.ExtendedMode =FSMC_EXTENDED_MODE_ENABLE;
  34.    sram_handle.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  35.    sram_handle.Init.WriteBurst =FSMC_WRITE_BURST_DISABLE;
  36.    sram_handle.Init.PageSize =FSMC_PAGE_SIZE_NONE;
  37.    HAL_SRAM_Init(&sram_handle, &read_timing, &write_timing);
  38. }
复制代码

25.2.2 TFTLCD驱动
本章实验的TFTLCD驱动主要负责向应用层提供TFTLCD的初始化和各种TFTLCD显示的操作函数。本章实验中,TFTLCD的驱动代码包括lcd.c、lcd_ex.c、lcd.h和字体文件lcdfont.h四个文件。
由于TFTLCD模块需要使用到大量的GPIO引脚,因此对于GPIO的相关定义,请读者自行查看lcd.c和lcd.h这两个文件。
TFTLCD驱动中,TFTLCD的初始化函数,如下所示:
  1. /**
  2. *@brief       初始化LCD
  3. *@note        该初始化函数可以初始化各种型号的LCD(详见本.c文件最前面的描述)
  4. *
  5. *@param       无
  6. *@retval      无
  7. */
  8. void lcd_init(void)
  9. {
  10.    GPIO_InitTypeDef gpio_init_struct;
  11.    FSMC_NORSRAM_TimingTypeDef fsmc_read_handle;
  12.    FSMC_NORSRAM_TimingTypeDef fsmc_write_handle;
  13.    LCD_CS_GPIO_CLK_ENABLE();                               /* LCD_CS脚时钟使能 */
  14.    LCD_WR_GPIO_CLK_ENABLE();                               /* LCD_WR脚时钟使能 */
  15.     LCD_RD_GPIO_CLK_ENABLE();                               /* LCD_RD脚时钟使能 */
  16.    LCD_RS_GPIO_CLK_ENABLE();                               /* LCD_RS脚时钟使能 */
  17.    LCD_BL_GPIO_CLK_ENABLE();                               /* LCD_BL脚时钟使能 */
  18.    
  19.    gpio_init_struct.Pin = LCD_CS_GPIO_PIN;
  20.    gpio_init_struct.Mode = GPIO_MODE_AF_PP;               /* 推挽复用 */
  21.    gpio_init_struct.Pull = GPIO_PULLUP;                    /* 上拉 */
  22.    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;         /* 高速 */
  23.    HAL_GPIO_Init(LCD_CS_GPIO_PORT, &gpio_init_struct);    /* 初始化LCD_CS引脚 */
  24.    gpio_init_struct.Pin = LCD_WR_GPIO_PIN;
  25.    HAL_GPIO_Init(LCD_WR_GPIO_PORT, &gpio_init_struct);    /* 初始化LCD_WR引脚 */
  26.    gpio_init_struct.Pin = LCD_RD_GPIO_PIN;
  27.    HAL_GPIO_Init(LCD_RD_GPIO_PORT, &gpio_init_struct);    /* 初始化LCD_RD引脚 */
  28.    gpio_init_struct.Pin = LCD_RS_GPIO_PIN;
  29.    HAL_GPIO_Init(LCD_RS_GPIO_PORT, &gpio_init_struct);    /* 初始化LCD_RS引脚 */
  30.    gpio_init_struct.Pin = LCD_BL_GPIO_PIN;
  31. gpio_init_struct.Mode =GPIO_MODE_OUTPUT_PP;           /* 推挽输出 */
  32. /* LCD_BL引脚模式设置(推挽输出) */
  33.    HAL_GPIO_Init(LCD_BL_GPIO_PORT, &gpio_init_struct);
  34.    g_sram_handle.Instance =FSMC_NORSRAM_DEVICE;
  35.    g_sram_handle.Extended =FSMC_NORSRAM_EXTENDED_DEVICE;
  36.    
  37. g_sram_handle.Init.NSBank = FSMC_NORSRAM_BANK4;        /* 使用NE4 */
  38. /* 地址/数据线不复用 */
  39. g_sram_handle.Init.DataAddressMux=FSMC_DATA_ADDRESS_MUX_DISABLE;
  40. /* 16位数据宽度 */
  41. g_sram_handle.Init.MemoryDataWidth=FSMC_NORSRAM_MEM_BUS_WIDTH_16;
  42. /* 是否使能突发访问,仅对同步突发存储器有效,此处未用到 */
  43. g_sram_handle.Init.BurstAccessMode=FSMC_BURST_ACCESS_MODE_DISABLE;
  44. /* 等待信号的极性,仅在突发模式访问下有用 */
  45. g_sram_handle.Init.WaitSignalPolarity=FSMC_WAIT_SIGNAL_POLARITY_LOW;
  46. /* 存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT */
  47. g_sram_handle.Init.WaitSignalActive=FSMC_WAIT_TIMING_BEFORE_WS;
  48. /* 存储器写使能 */
  49. g_sram_handle.Init.WriteOperation=FSMC_WRITE_OPERATION_ENABLE;
  50. /* 等待使能位,此处未用到 */
  51. g_sram_handle.Init.WaitSignal =FSMC_WAIT_SIGNAL_DISABLE;
  52. /* 读写使用不同的时序 */
  53. g_sram_handle.Init.ExtendedMode =FSMC_EXTENDED_MODE_ENABLE;
  54. /* 是否使能同步传输模式下的等待信号,此处未用到 */
  55. g_sram_handle.Init.AsynchronousWait=FSMC_ASYNCHRONOUS_WAIT_DISABLE;
  56. /* 禁止突发写 */
  57.    g_sram_handle.Init.WriteBurst =FSMC_WRITE_BURST_DISABLE;
  58.     /* 地址建立时间(ADDSET)为1个HCLK 1/72M = 13.9ns (实际 > 200ns) */
  59. fsmc_read_handle.AddressSetupTime = 0;
  60. /* 地址保持时间(ADDHLD) 模式A是没有用到 */
  61.    fsmc_read_handle.AddressHoldTime = 0;      
  62.     /* 数据保存时间(DATAST)为16个HCLK = 13.9 * 16 = 222.4ns */
  63.    fsmc_read_handle.DataSetupTime = 15;
  64.    fsmc_read_handle.AccessMode = FSMC_ACCESS_MODE_A;      /* 模式A */
  65.    
  66. /* FSMC写时序控制寄存器 */
  67. /* 地址建立时间(ADDSET)为1个HCLK =13.9ns */
  68. fsmc_write_handle.AddressSetupTime = 0;
  69. /* 地址保持时间(ADDHLD) 模式A是没有用到 */
  70. fsmc_write_handle.AddressHoldTime = 0;
  71. /* 数据保存时间(DATAST)为2个HCLK = 13.9* 2 = 27.8ns (实际 > 200ns)*/
  72.    fsmc_write_handle.DataSetupTime = 1;        
  73.     /* 某些液晶驱动IC的写信号脉宽,最少也得50ns。 */
  74.    fsmc_write_handle.AccessMode = FSMC_ACCESS_MODE_A;     /* 模式A */
  75.    HAL_SRAM_Init(&g_sram_handle, &fsmc_read_handle, &fsmc_write_handle);
  76.    delay_ms(50);                /* 初始化FSMC后,必须等待一定时间才能开始初始化 */
  77.     /* 尝试9341 ID的读取 */
  78.    lcd_wr_regno(0XD3);
  79.    lcddev.id = lcd_rd_data();  /* dummy read */
  80.    lcddev.id = lcd_rd_data();  /* 读到0X00 */
  81.    lcddev.id = lcd_rd_data();  /* 读取0X93 */
  82.    lcddev.id <<= 8;
  83.    lcddev.id |= lcd_rd_data(); /* 读取0X41 */
  84.     if (lcddev.id != 0X9341)                /* 不是 9341 , 尝试看看是不是 ST7789 */
  85.     {
  86.        lcd_wr_regno(0X04);
  87.        lcddev.id = lcd_rd_data();          /* dummy read */
  88.        lcddev.id = lcd_rd_data();          /* 读到0X85 */
  89.        lcddev.id = lcd_rd_data();          /* 读取0X85 */
  90.        lcddev.id <<= 8;
  91.        lcddev.id |= lcd_rd_data();         /* 读取0X52 */
  92.       
  93.        if (lcddev.id == 0X8552)            /* 将8552的ID转换成7789 */
  94.        {
  95.            lcddev.id = 0x7789;
  96.        }
  97.        if (lcddev.id != 0x7789)            /* 也不是ST7789, 尝试是不是 NT35310 */
  98.        {
  99.            lcd_wr_regno(0xD4);
  100.            lcddev.id = lcd_rd_data();       /* dummyread */
  101.            lcddev.id = lcd_rd_data();       /* 读回0x01 */
  102.            lcddev.id = lcd_rd_data();       /* 读回0x53 */
  103.            lcddev.id <<= 8;
  104.            lcddev.id |= lcd_rd_data();      /* 这里读回0x10 */
  105.            if (lcddev.id != 0x5310)         /* 也不是NT35310,尝试看看是不是ST7796 */
  106.            {
  107.                 lcd_wr_regno(0XD3);
  108.                 lcddev.id = lcd_rd_data();    /* dummy read */
  109.                 lcddev.id = lcd_rd_data();    /* 读到0X00 */
  110.                 lcddev.id = lcd_rd_data();    /* 读取0X77 */
  111.                 lcddev.id <<= 8;
  112.                lcddev.id |= lcd_rd_data();   /* 读取0X96 */
  113.                
  114.                 if (lcddev.id != 0x7796)      /* 也不是ST7796,尝试看看是不是NT35510 */
  115.                 {
  116.                     /* 发送密钥(厂家提供) */
  117.                     lcd_write_reg(0xF000, 0x0055);
  118.                     lcd_write_reg(0xF001, 0x00AA);
  119.                     lcd_write_reg(0xF002, 0x0052);
  120.                     lcd_write_reg(0xF003, 0x0008);
  121.                     lcd_write_reg(0xF004, 0x0001);
  122.                     lcd_wr_regno(0xC500);     /* 读取ID低八位 */
  123.                     lcddev.id = lcd_rd_data();/* 读回0x55 */
  124.                     lcddev.id <<= 8;
  125.                     lcd_wr_regno(0xC501);     /* 读取ID高八位 */
  126.                     lcddev.id |= lcd_rd_data();/* 读回0x10 */
  127.                     
  128.                     delay_ms(5);
  129.                     if (lcddev.id != 0x5510)  /* 也不是NT5510,尝试看看是不是ILI9806 */
  130.                     {
  131.                         lcd_wr_regno(0XD3);
  132.                         lcddev.id = lcd_rd_data();  /* dummyread */
  133.                         lcddev.id = lcd_rd_data();  /* 读回0X00 */
  134.                         lcddev.id = lcd_rd_data();  /* 读回0X98 */
  135.                         lcddev.id <<= 8;
  136.                         lcddev.id |= lcd_rd_data(); /* 读回0X06 */
  137.                         /* 也不是ILI9806,尝试看看是不是SSD1963 */
  138.                         if (lcddev.id != 0x9806)
  139.                         {
  140.                             lcd_wr_regno(0xA1);
  141.                             lcddev.id = lcd_rd_data();
  142.                             lcddev.id = lcd_rd_data();  /* 读回0x57 */
  143.                             lcddev.id <<= 8;
  144.                             lcddev.id |= lcd_rd_data(); /* 读回0x61 */
  145. /* SSD1963读回的ID是5761H,为方便区分,我们强制设置为1963 */
  146.                             if (lcddev.id == 0x5761) lcddev.id = 0x1963;
  147.                         }
  148.                     }
  149.                 }
  150.             }
  151.        }
  152.     }
  153.     /* 特别注意, 如果在main函数里面屏蔽串口1初始化, 则会卡死在printf
  154.      *里面(卡死在f_putc函数), 所以, 必须初始化串口1, 或者屏蔽掉下面
  155.      *这行 printf 语句 !!!!!!!
  156.     */
  157.    printf("LCDID:%x\r\n", lcddev.id); /* 打印LCD ID */
  158.     if (lcddev.id == 0X7789)
  159.     {
  160.        lcd_ex_st7789_reginit();     /* 执行ST7789初始化 */
  161.     }
  162.     else if (lcddev.id == 0X9341)
  163.     {
  164.        lcd_ex_ili9341_reginit();    /* 执行ILI9341初始化 */
  165.     }
  166.     else if (lcddev.id == 0x5310)
  167.     {
  168.        lcd_ex_nt35310_reginit();    /* 执行NT35310初始化 */
  169.     }
  170.     else if (lcddev.id == 0x7796)
  171.     {
  172.        lcd_ex_st7796_reginit();     /* 执行ST7796初始化 */
  173.     }
  174.     else if (lcddev.id == 0x5510)
  175.     {
  176.        lcd_ex_nt35510_reginit();    /* 执行NT35510初始化 */
  177.     }
  178.     else if (lcddev.id == 0x9806)
  179.     {
  180.        lcd_ex_ili9806_reginit();    /* 执行ILI9806初始化 */
  181.     }
  182.     else if (lcddev.id == 0x1963)
  183.     {
  184.        lcd_ex_ssd1963_reginit();    /* 执行SSD1963初始化 */
  185.        lcd_ssd_backlight_set(100); /* 背光设置为最亮 */
  186.     }
  187.    lcd_display_dir(0);             /* 默认为竖屏 */
  188.    LCD_BL(1);                        /* 点亮背光 */
  189.    lcd_clear(WHITE);
  190. }
复制代码
从上的代码中可以看出,本章实验的TFTLCD驱动是兼容了正点原子的多款TFTLCD模块的,因此在初始化完FSMC后,会与TFTLCD进行通讯,确定TFTLCD的型号,然后根据型号针对性地对TFTLCD模块进行配置。
TFTLCD驱动中与TFTLCD模块通讯的函数,如下所示:
  1. /**
  2. *@brief   LCD写数据
  3. *@param   data: 要写入的数据
  4. *@retval  无
  5. */
  6. void lcd_wr_data(volatile uint16_t data)
  7. {
  8.    data = data;
  9.     LCD->LCD_RAM = data;
  10. }
  11. /**
  12. *@brief   LCD写寄存器编号或地址
  13. *@param   regno: 寄存器编号或地址
  14. *@retval  无
  15. */
  16. void lcd_wr_regno(volatile uint16_t regno)
  17. {
  18.    regno = regno;
  19.     LCD->LCD_REG = regno;
  20. }
  21. /**
  22. *@brief   LCD写寄存器
  23. *@param   regno: 寄存器编号
  24. *@param   data : 要写入的数据
  25. *@retval  无
  26. */
  27. voidlcd_write_reg(uint16_t regno, uint16_t data)
  28. {
  29.     LCD->LCD_REG = regno;
  30.     LCD->LCD_RAM = data;
  31. }
  32. /**
  33. *@brief   LCD读数据
  34. *@param   无
  35. *@retval  读取到的数据
  36. */
  37. static uint16_t lcd_rd_data(void)
  38. {
  39.     volatile uint16_t ram;
  40.    
  41.     ram= LCD->LCD_RAM;
  42.    
  43.     return ram;
  44. }
复制代码
从上面的代码中可以看出,与TFTLCD的通讯都是通过LCD这一结构体对象来完成的,对于LCD结构体的相关定义,如下所示:
  1. typedef struct
  2. {
  3.     volatile uint16_t LCD_REG;
  4.     volatile uint16_t LCD_RAM;
  5. } LCD_TypeDef;
  6. #define LCD_FSMC_NEX   1
  7. #define LCD_FSMC_AX     19
  8. #define LCD_BASE    \
  9.    (uint32_t)((0x60000000+(0x4000000*(LCD_SMC_NEX-1)))|(((1<<LCD_SMC_AX)*2)-2))
  10. #define LCD         ((LCD_TypeDef*)LCD_BASE)
复制代码
从LCD结构体的相关定义中可以看出,与TFTLCD模块的通讯地址是与TFTLCD连接的FSMC存储块1的区域块和TFTLCD模块命令、数据选择信号所连接的FSMC地址线是有关的。通过上面宏定义的计算,可以算出LCD_BASE宏定义的值为0x600FFFFE,因此访问LCD->LCD_REG就是访问0x600FFFFE这一地址,访问LCD->LCD_RAM就是访问0x60100000这一地址,这两个地址也就是通过FSMC映射的TFTLCD命令和数据寄存器的访问地址。
通过上面介绍的驱动函数就能够与TFTLCD模块进行通讯了,而在TFTLCD模块的显示屏上显示出特定的图案或字符或设置TFTLCD模块的显示方向等等的操作都是能够通过TFTLCD模块规定的特定命令来完成的,想深究的读者可以产看正点原子TFTLCD模块的用户手册或查看实际使用的TFTLCD模块的相关文档。

25.2.3 实验应用代码
本章实验的应用代码,如下所示:
  1. int main(void)
  2. {
  3.     uint8_t x = 0;
  4.     uint8_t lcd_id[13];
  5.    
  6.    HAL_Init();                         /* 初始化HAL库 */
  7.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  8.    delay_init(72);                     /* 初始化延时 */
  9.    usart_init(115200);                 /* 初始化串口 */
  10.    led_init();                         /* 初始化LED */
  11.    lcd_init();                         /* 初始化LCD */
  12.    
  13.    sprintf((char *)lcd_id, "LCD ID:%04X", lcddev.id);
  14.     while (1)
  15.     {
  16.          switch (x)
  17.          {
  18.              case 0:
  19.              {
  20.                  lcd_clear(WHITE);
  21.                  break;
  22.              }
  23.              case 1:
  24.              {
  25.                  lcd_clear(BLACK);
  26.                  break;
  27.              }
  28.              case 2:
  29.              {
  30.                  lcd_clear(BLUE);
  31.                  break;
  32.              }
  33.              case 3:
  34.              {
  35.                  lcd_clear(RED);
  36.                  break;
  37.              }
  38.              case 4:
  39.              {
  40.                  lcd_clear(MAGENTA);
  41.                  break;
  42.              }
  43.              case 5:
  44.              {
  45.                  lcd_clear(GREEN);
  46.                  break;
  47.              }
  48.              case 6:
  49.              {
  50.                  lcd_clear(CYAN);
  51.                  break;
  52.              }
  53.              case 7:
  54.              {
  55.                  lcd_clear(YELLOW);
  56.                  break;
  57.              }
  58.              case 8:
  59.              {
  60.                  lcd_clear(BRRED);
  61.                  break;
  62.              }
  63.              case 9:
  64.              {
  65.                  lcd_clear(GRAY);
  66.                  break;
  67.              }
  68.              case 10:
  69.              {
  70.                  lcd_clear(LGRAY);
  71.                  break;
  72.              }
  73.              case 11:
  74.              {
  75.                  lcd_clear(BROWN);
  76.                  break;
  77.              }
  78.          }
  79.          
  80.          lcd_show_string(10, 40, 240, 32, 32, "STM32", RED);
  81.          lcd_show_string(10, 80, 240, 24, 24, "TFTLCDTEST", RED);
  82.          lcd_show_string(10, 110, 240, 16, 16, "ATOM@ALIENTEK", RED);
  83.          lcd_show_string(10, 130, 240, 16, 16, (char *)lcd_id, RED);
  84.          
  85.          if (++x == 12)
  86.          {
  87.              x = 0;
  88.          }
  89.          
  90.          LED0_TOGGLE();
  91.          delay_ms(1000);
  92.     }
  93. }
复制代码
从上面的代码中可以看出,在初始化完LCD后,便在LCD上显示一些本实验的相关信息,随后便每间隔1000毫秒就更换一次LCD屏幕显示的背景色。

25.3 下载验证
在完成编译和烧录操作后,先将开发板断电,随后将TFTLCD模块通过LCD转接板与开发板进行连接,最后再给开发板供电(在插拔开发板上的接插件和模块时,要求必须断电操作,否则容易烧毁硬件)。程序运行后,可以看到LCD上显示了本实验的相关信息,同时LCD显示的背景色被间隔1000毫秒就切换一次。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 04:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表