回答

收藏

【Avnet | NXP FRDM-MCXN947试用活动】驱动TFT彩屏

NXP NXP 1917 人阅读 | 0 人回复 | 2024-12-04

本帖最后由 yinwuqing 于 2024-12-4 00:22 编辑

一、简介
本次采用SPI方式驱动ST7735S TFT-LCD屏。ST7735S是用于262K彩色图形型TFT-LCD的单芯片控制器/驱动器。由396条组成源极线和162个栅极线驱动电路。该芯片能够直接连接到外部微处理器,并接受串行外围接口(SPI)、8位/9位/16位/18位并行接口。显示数据可以存储在132 x 162 x 18位的片上显示数据RAM中。它可以执行显示数据RAM读/写操作,无需外部操作时钟,可最大限度地降低功耗。此外,由于驱动液晶所需的集成电源电路具有较少组件的显示系统。


二、硬件连线
     该屏为1.8寸,宽高:128 x 160,本人采用的是基于硬禾学堂提供的外设底板,该部分电路原理图如下:

   由上电路原理图可知,该外设底板集成的LCD屏是具备触摸功能的,此次就单单显示部分功能进行驱动。
     再来看FRDM-MCXN947开发板的原理图部分,两者信号脚确认好后,才能使用杜邦线进行正确连接。

两块板子信号脚的连接布设如下:
ST7735STFT-LCD屏 FRDM-MCXN947开发板
VCCP3V3
GND GND
SCLK P4_1(SCL)
MOSIP4_0(SDA)
DC(Data/Command)P0_7
CS(Chip Select) P0_12
BLK(Backlight) P4_5
RES P4_7
  硬件连接图:


三、代码实现
    本次工程还是在上期点灯例程上进行完善吧,首先在pin_mux.c文件中加入io的初始化代码。
  1. void BOARD_InitPins(void)
  2. {
  3.   /* Enables the clock for PORT0 controller: Enables clock */
  4.   CLOCK_EnableClock(kCLOCK_Port0);
  5.   /* Enables the clock for PORT1 controller: Enables clock */
  6.   CLOCK_EnableClock(kCLOCK_Port1);
  7.   CLOCK_EnableClock(kCLOCK_Port4);

  8.   gpio_pin_config_t LCD_GPIO_config0 = {
  9.       .pinDirection = kGPIO_DigitalOutput,
  10.       .outputLogic = 0U,
  11.   };
  12.   gpio_pin_config_t LCD_GPIO_config1 = {
  13.       .pinDirection = kGPIO_DigitalOutput,
  14.       .outputLogic = 1U,
  15.   };
  16.         
  17.   GPIO_PinInit(GPIO0, 7U, &LCD_GPIO_config0);
  18.   GPIO_PinInit(GPIO0, 12U, &LCD_GPIO_config0);
  19.   GPIO_PinInit(GPIO4, 0U, &LCD_GPIO_config0);
  20.   GPIO_PinInit(GPIO4, 1U, &LCD_GPIO_config0);
  21.   GPIO_PinInit(GPIO4, 5U, &LCD_GPIO_config0);
  22.   GPIO_PinInit(GPIO4, 7U, &LCD_GPIO_config0);
  23.         
  24.   PORT_SetPinMux(PORT0, 7U, kPORT_MuxAlt0);
  25.   PORT_SetPinMux(PORT0, 12U,kPORT_MuxAlt0);
  26.   PORT_SetPinMux(PORT4, 0U, kPORT_MuxAlt0);
  27.   PORT_SetPinMux(PORT4, 1U, kPORT_MuxAlt0);
  28.   PORT_SetPinMux(PORT4, 5U, kPORT_MuxAlt0);
  29.   PORT_SetPinMux(PORT4, 7U, kPORT_MuxAlt0);

  30.   const port_pin_config_t port0_7_config= {/* Internal pull-up/down resistor is disabled */
  31.                                                       kPORT_PullDisable,
  32.                                                       /* Low internal pull resistor value is selected. */
  33.                                                       kPORT_LowPullResistor,
  34.                                                       /* Fast slew rate is configured */
  35.                                                       kPORT_FastSlewRate,
  36.                                                       /* Passive input filter is disabled */
  37.                                                       kPORT_PassiveFilterDisable,
  38.                                                       /* Open drain output is disabled */
  39.                                                       kPORT_OpenDrainDisable,
  40.                                                       /* Low drive strength is configured */
  41.                                                       kPORT_LowDriveStrength,
  42.                                                       /* Pin is configured as PIO0_10 */
  43.                                                       kPORT_MuxAlt0,
  44.                                                       /* Digital input enabled */
  45.                                                       kPORT_InputBufferEnable,
  46.                                                       /* Digital input is not inverted */
  47.                                                       kPORT_InputNormal,
  48.                                                       /* Pin Control Register fields [15:0] are not locked */
  49.                                                       kPORT_UnlockRegister};

  50. const port_pin_config_t port0_10_pinB12_config = {/* Internal pull-up/down resistor is disabled */
  51.                                                       kPORT_PullDisable,
  52.                                                       /* Low internal pull resistor value is selected. */
  53.                                                       kPORT_LowPullResistor,
  54.                                                       /* Fast slew rate is configured */
  55.                                                       kPORT_FastSlewRate,
  56.                                                       /* Passive input filter is disabled */
  57.                                                       kPORT_PassiveFilterDisable,
  58.                                                       /* Open drain output is disabled */
  59.                                                       kPORT_OpenDrainDisable,
  60.                                                       /* Low drive strength is configured */
  61.                                                       kPORT_LowDriveStrength,
  62.                                                       /* Pin is configured as PIO0_10 */
  63.                                                       kPORT_MuxAlt0,
  64.                                                       /* Digital input enabled */
  65.                                                       kPORT_InputBufferEnable,
  66.                                                       /* Digital input is not inverted */
  67.                                                       kPORT_InputNormal,
  68.                                                       /* Pin Control Register fields [15:0] are not locked */
  69.                                                       kPORT_UnlockRegister};
  70.     /* PORT0_10 (pin B12) is configured as PIO0_10 */
  71.     PORT_SetPinConfig(PORT0, 10U, &port0_10_pinB12_config);
  72.                                                                                                                                                                                                                         
  73.    const port_pin_config_t port0_27_pinE10_config = {/* Internal pull-up/down resistor is disabled */
  74.                                                       kPORT_PullDisable,
  75.                                                       /* Low internal pull resistor value is selected. */
  76.                                                       kPORT_LowPullResistor,
  77.                                                       /* Fast slew rate is configured */
  78.                                                       kPORT_FastSlewRate,
  79.                                                       /* Passive input filter is disabled */
  80.                                                       kPORT_PassiveFilterDisable,
  81.                                                       /* Open drain output is disabled */
  82.                                                       kPORT_OpenDrainDisable,
  83.                                                       /* Low drive strength is configured */
  84.                                                       kPORT_LowDriveStrength,
  85.                                                       /* Pin is configured as PIO0_27 */
  86.                                                       kPORT_MuxAlt0,
  87.                                                       /* Digital input enabled */
  88.                                                       kPORT_InputBufferEnable,
  89.                                                       /* Digital input is not inverted */
  90.                                                       kPORT_InputNormal,
  91.                                                       /* Pin Control Register fields [15:0] are not locked */
  92.                                                       kPORT_UnlockRegister};
  93.     /* PORT0_27 (pin E10) is configured as PIO0_27 */
  94.     PORT_SetPinConfig(PORT0, 27U, &port0_27_pinE10_config);

  95.   const port_pin_config_t port1_2_pinC04_config = {/* Internal pull-up/down resistor is disabled */
  96.                                                       kPORT_PullDisable,
  97.                                                       /* Low internal pull resistor value is selected. */
  98.                                                       kPORT_LowPullResistor,
  99.                                                       /* Fast slew rate is configured */
  100.                                                       kPORT_FastSlewRate,
  101.                                                       /* Passive input filter is disabled */
  102.                                                       kPORT_PassiveFilterDisable,
  103.                                                       /* Open drain output is disabled */
  104.                                                       kPORT_OpenDrainDisable,
  105.                                                       /* Low drive strength is configured */
  106.                                                       kPORT_LowDriveStrength,
  107.                                                       /* Pin is configured as PIO1_2 */
  108.                                                       kPORT_MuxAlt0,
  109.                                                       /* Digital input enabled */
  110.                                                       kPORT_InputBufferEnable,
  111.                                                       /* Digital input is not inverted */
  112.                                                       kPORT_InputNormal,
  113.                                                       /* Pin Control Register fields [15:0] are not locked */
  114.                                                       kPORT_UnlockRegister};
  115.     /* PORT1_2 (pin C04) is configured as PIO1_2 */
  116.     PORT_SetPinConfig(PORT1, 2U, &port1_2_pinC04_config);                                                                                                                                                                                                                        

  117. const port_pin_config_t port0_2_pinB16_config = {/* Internal pull-up/down resistor is disabled */
  118.                                                      kPORT_PullDisable,
  119.                                                      /* Low internal pull resistor value is selected. */
  120.                                                      kPORT_LowPullResistor,
  121.                                                      /* Fast slew rate is configured */
  122.                                                      kPORT_FastSlewRate,
  123.                                                      /* Passive input filter is disabled */
  124.                                                      kPORT_PassiveFilterDisable,
  125.                                                      /* Open drain output is disabled */
  126.                                                      kPORT_OpenDrainDisable,
  127.                                                      /* High drive strength is configured */
  128.                                                      kPORT_HighDriveStrength,
  129.                                                      /* Pin is configured as SWO */
  130.                                                      kPORT_MuxAlt1,
  131.                                                      /* Digital input enabled */
  132.                                                      kPORT_InputBufferEnable,
  133.                                                      /* Digital input is not inverted */
  134.                                                      kPORT_InputNormal,
  135.                                                      /* Pin Control Register fields [15:0] are not locked */
  136.                                                      kPORT_UnlockRegister};
  137.     /* PORT0_2 (pin B16) is configured as SWO */
  138.     PORT_SetPinConfig(PORT0, 2U, &port0_2_pinB16_config);                                                                     
  139.     PORT_SetPinConfig(PORT0, 7U, &port0_7_config);
  140.     PORT_SetPinConfig(PORT0, 12U,&port0_7_config);
  141.     PORT_SetPinConfig(PORT4, 0U, &port0_7_config);
  142.     PORT_SetPinConfig(PORT4, 1U, &port0_7_config);
  143.     PORT_SetPinConfig(PORT4, 5U, &port0_7_config);
  144.     PORT_SetPinConfig(PORT4, 7U, &port0_7_config);
  145. }
复制代码
lcd_init.c
  1. #include "lcd_init.h"
  2. #include "board.h"
  3. #include "peripherals.h"

  4. /******************************************************************************
  5.       函数说明:LCD串行数据写入函数
  6.       入口数据:dat  要写入的串行数据
  7.       返回值:  无
  8. ******************************************************************************/
  9. void LCD_Writ_Bus(u8 dat)
  10. {        
  11.         u8 i;
  12.         LCD_CS_Clr();
  13.         for(i=0;i<8;i++)
  14.         {                          
  15.                 LCD_SCLK_Clr();
  16.                 if(dat&0x80)
  17.                 {
  18.                    LCD_MOSI_Set();
  19.                 }
  20.                 else
  21.                 {
  22.                    LCD_MOSI_Clr();
  23.                 }
  24.                 LCD_SCLK_Set();
  25.                 dat<<=1;
  26.         }        
  27.   LCD_CS_Set();        
  28. }

  29. /******************************************************************************
  30.       函数说明:LCD写入数据
  31.       入口数据:dat 写入的数据
  32.       返回值:  无
  33. ******************************************************************************/
  34. void LCD_WR_DATA8(u8 dat)
  35. {
  36.         LCD_Writ_Bus(dat);
  37. }

  38. /******************************************************************************
  39.       函数说明:LCD写入数据
  40.       入口数据:dat 写入的数据
  41.       返回值:  无
  42. ******************************************************************************/
  43. void LCD_WR_DATA(u16 dat)
  44. {
  45.         LCD_Writ_Bus(dat>>8);
  46.         LCD_Writ_Bus(dat);
  47. }

  48. /******************************************************************************
  49.       函数说明:LCD写入命令
  50.       入口数据:dat 写入的命令
  51.       返回值:  无
  52. ******************************************************************************/
  53. void LCD_WR_REG(u8 dat)
  54. {
  55.         LCD_DC_Clr();//写命令
  56.         LCD_Writ_Bus(dat);
  57.         LCD_DC_Set();//写数据
  58. }

  59. /******************************************************************************
  60.       函数说明:设置起始和结束地址
  61.       入口数据:x1,x2 设置列的起始和结束地址
  62.                 y1,y2 设置行的起始和结束地址
  63.       返回值:  无
  64. ******************************************************************************/
  65. void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
  66. {
  67.         if(USE_HORIZONTAL==0)
  68.         {
  69.                 LCD_WR_REG(0x2a);//列地址设置
  70.                 LCD_WR_DATA(x1+2);
  71.                 LCD_WR_DATA(x2+2);
  72.                 LCD_WR_REG(0x2b);//行地址设置
  73.                 LCD_WR_DATA(y1+1);
  74.                 LCD_WR_DATA(y2+1);
  75.                 LCD_WR_REG(0x2c);//储存器写
  76.         }
  77.         else if(USE_HORIZONTAL==1)
  78.         {
  79.                 LCD_WR_REG(0x2a);//列地址设置
  80.                 LCD_WR_DATA(x1+2);
  81.                 LCD_WR_DATA(x2+2);
  82.                 LCD_WR_REG(0x2b);//行地址设置
  83.                 LCD_WR_DATA(y1+1);
  84.                 LCD_WR_DATA(y2+1);
  85.                 LCD_WR_REG(0x2c);//储存器写
  86.         }
  87.         else if(USE_HORIZONTAL==2)
  88.         {
  89.                 LCD_WR_REG(0x2a);//列地址设置
  90.                 LCD_WR_DATA(x1+1);
  91.                 LCD_WR_DATA(x2+1);
  92.                 LCD_WR_REG(0x2b);//行地址设置
  93.                 LCD_WR_DATA(y1+2);
  94.                 LCD_WR_DATA(y2+2);
  95.                 LCD_WR_REG(0x2c);//储存器写
  96.         }
  97.         else
  98.         {
  99.                 LCD_WR_REG(0x2a);//列地址设置
  100.                 LCD_WR_DATA(x1+1);
  101.                 LCD_WR_DATA(x2+1);
  102.                 LCD_WR_REG(0x2b);//行地址设置
  103.                 LCD_WR_DATA(y1+2);
  104.                 LCD_WR_DATA(y2+2);
  105.                 LCD_WR_REG(0x2c);//储存器写
  106.         }
  107. }

  108. void LCD_Init(void)
  109. {
  110.         
  111.         LCD_RES_Clr();//复位
  112.         SysTick_DelayTicks(1000);
  113.         LCD_RES_Set();
  114.         SysTick_DelayTicks(1000);
  115.         
  116.         LCD_BLK_Set();//打开背光
  117.         SysTick_DelayTicks(120000);
  118.         
  119.         //************* Start Initial Sequence **********//
  120.         LCD_WR_REG(0x11); //Sleep out
  121.         SysTick_DelayTicks(120000);              //Delay 120ms
  122.         //------------------------------------ST7735S Frame Rate-----------------------------------------//
  123.         LCD_WR_REG(0xB1);
  124.         LCD_WR_DATA8(0x05);
  125.         LCD_WR_DATA8(0x3C);
  126.         LCD_WR_DATA8(0x3C);
  127.         LCD_WR_REG(0xB2);
  128.         LCD_WR_DATA8(0x05);
  129.         LCD_WR_DATA8(0x3C);
  130.         LCD_WR_DATA8(0x3C);
  131.         LCD_WR_REG(0xB3);
  132.         LCD_WR_DATA8(0x05);
  133.         LCD_WR_DATA8(0x3C);
  134.         LCD_WR_DATA8(0x3C);
  135.         LCD_WR_DATA8(0x05);
  136.         LCD_WR_DATA8(0x3C);
  137.         LCD_WR_DATA8(0x3C);
  138.         //------------------------------------End ST7735S Frame Rate---------------------------------//
  139.         LCD_WR_REG(0xB4); //Dot inversion
  140.         LCD_WR_DATA8(0x03);
  141.         //------------------------------------ST7735S Power Sequence---------------------------------//
  142.         LCD_WR_REG(0xC0);
  143.         LCD_WR_DATA8(0x28);
  144.         LCD_WR_DATA8(0x08);
  145.         LCD_WR_DATA8(0x04);
  146.         LCD_WR_REG(0xC1);
  147.         LCD_WR_DATA8(0XC0);
  148.         LCD_WR_REG(0xC2);
  149.         LCD_WR_DATA8(0x0D);
  150.         LCD_WR_DATA8(0x00);
  151.         LCD_WR_REG(0xC3);
  152.         LCD_WR_DATA8(0x8D);
  153.         LCD_WR_DATA8(0x2A);
  154.         LCD_WR_REG(0xC4);
  155.         LCD_WR_DATA8(0x8D);
  156.         LCD_WR_DATA8(0xEE);
  157.         //---------------------------------End ST7735S Power Sequence-------------------------------------//
  158.         LCD_WR_REG(0xC5); //VCOM
  159.         LCD_WR_DATA8(0x1A);
  160.         LCD_WR_REG(0x36); //MX, MY, RGB mode
  161.         if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
  162.         else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
  163.         else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
  164.         else LCD_WR_DATA8(0xA0);
  165.         //------------------------------------ST7735S Gamma Sequence---------------------------------//
  166.         LCD_WR_REG(0xE0);
  167.         LCD_WR_DATA8(0x04);
  168.         LCD_WR_DATA8(0x22);
  169.         LCD_WR_DATA8(0x07);
  170.         LCD_WR_DATA8(0x0A);
  171.         LCD_WR_DATA8(0x2E);
  172.         LCD_WR_DATA8(0x30);
  173.         LCD_WR_DATA8(0x25);
  174.         LCD_WR_DATA8(0x2A);
  175.         LCD_WR_DATA8(0x28);
  176.         LCD_WR_DATA8(0x26);
  177.         LCD_WR_DATA8(0x2E);
  178.         LCD_WR_DATA8(0x3A);
  179.         LCD_WR_DATA8(0x00);
  180.         LCD_WR_DATA8(0x01);
  181.         LCD_WR_DATA8(0x03);
  182.         LCD_WR_DATA8(0x13);
  183.         LCD_WR_REG(0xE1);
  184.         LCD_WR_DATA8(0x04);
  185.         LCD_WR_DATA8(0x16);
  186.         LCD_WR_DATA8(0x06);
  187.         LCD_WR_DATA8(0x0D);
  188.         LCD_WR_DATA8(0x2D);
  189.         LCD_WR_DATA8(0x26);
  190.         LCD_WR_DATA8(0x23);
  191.         LCD_WR_DATA8(0x27);
  192.         LCD_WR_DATA8(0x27);
  193.         LCD_WR_DATA8(0x25);
  194.         LCD_WR_DATA8(0x2D);
  195.         LCD_WR_DATA8(0x3B);
  196.         LCD_WR_DATA8(0x00);
  197.         LCD_WR_DATA8(0x01);
  198.         LCD_WR_DATA8(0x04);
  199.         LCD_WR_DATA8(0x13);
  200.         //------------------------------------End ST7735S Gamma Sequence-----------------------------//
  201.         LCD_WR_REG(0x3A); //65k mode
  202.         LCD_WR_DATA8(0x05);
  203.         LCD_WR_REG(0x29); //Display on
  204. }
复制代码
lcd_init.h
  1. #ifndef __LCD_INIT_H
  2. #define __LCD_INIT_H

  3. #include "board.h"
  4. #include "pin_mux.h"
  5. #include "lcd.h"

  6. #define USE_HORIZONTAL 1  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏

  7. typedef uint32_t u32;
  8. typedef uint16_t u16;
  9. typedef uint8_t u8;

  10. #if USE_HORIZONTAL==0||USE_HORIZONTAL==1
  11. #define LCD_W 128
  12. #define LCD_H 160
  13. #else
  14. #define LCD_W 160
  15. #define LCD_H 128
  16. #endif

  17. #define BOARD_LCD_SCLK_GPIO GPIO4
  18. #define BOARD_LCD_GPIO_SCLK_PIN (1U)

  19. #define BOARD_LCD_CS_GPIO GPIO0
  20. #define BOARD_LCD_GPIO_CS_PIN   (12U)

  21. #define BOARD_LCD_MOSI_GPIO GPIO4
  22. #define BOARD_LCD_GPIO_MOSI_PIN (0U)

  23. #define BOARD_LCD_DC_GPIO GPIO0
  24. #define BOARD_LCD_GPIO_DC_PIN   (7U)

  25. #define BOARD_LCD_RES_GPIO GPIO4
  26. #define BOARD_LCD_GPIO_RES_PIN  (7U)

  27. #define BOARD_LCD_BLK_GPIO GPIO4
  28. #define BOARD_LCD_GPIO_BLK_PIN  (5U)

  29. //-----------------LCD端口定义----------------

  30. #define LCD_SCLK_Clr() GPIO_PinWrite(BOARD_LCD_SCLK_GPIO,BOARD_LCD_GPIO_SCLK_PIN,0)//SCL SCLK
  31. #define LCD_SCLK_Set() GPIO_PinWrite(BOARD_LCD_SCLK_GPIO,BOARD_LCD_GPIO_SCLK_PIN,1)

  32. #define LCD_CS_Clr()   GPIO_PinWrite(BOARD_LCD_CS_GPIO,BOARD_LCD_GPIO_CS_PIN,0)//CS
  33. #define LCD_CS_Set()   GPIO_PinWrite(BOARD_LCD_CS_GPIO,BOARD_LCD_GPIO_CS_PIN,1)

  34. #define LCD_MOSI_Clr() GPIO_PinWrite(BOARD_LCD_MOSI_GPIO,BOARD_LCD_GPIO_MOSI_PIN,0)//SDA MOSI
  35. #define LCD_MOSI_Set() GPIO_PinWrite(BOARD_LCD_MOSI_GPIO,BOARD_LCD_GPIO_MOSI_PIN,1)

  36. #define LCD_DC_Clr()   GPIO_PinWrite(BOARD_LCD_DC_GPIO,BOARD_LCD_GPIO_DC_PIN,0)//DC
  37. #define LCD_DC_Set()   GPIO_PinWrite(BOARD_LCD_DC_GPIO,BOARD_LCD_GPIO_DC_PIN,1)

  38. #define LCD_RES_Clr()  GPIO_PinWrite(BOARD_LCD_RES_GPIO,BOARD_LCD_GPIO_RES_PIN,0)//RES
  39. #define LCD_RES_Set()  GPIO_PinWrite(BOARD_LCD_RES_GPIO,BOARD_LCD_GPIO_RES_PIN,1)

  40. #define LCD_BLK_Clr()  GPIO_PinWrite(BOARD_LCD_BLK_GPIO,BOARD_LCD_GPIO_BLK_PIN,0)//BLK
  41. #define LCD_BLK_Set()  GPIO_PinWrite(BOARD_LCD_BLK_GPIO,BOARD_LCD_GPIO_BLK_PIN,1)


  42. void LCD_GPIO_Init(void);//初始化GPIO
  43. void LCD_Writ_Bus(u8 dat);//模拟SPI时序
  44. void LCD_WR_DATA8(u8 dat);//写入一个字节
  45. void LCD_WR_DATA(u16 dat);//写入两个字节
  46. void LCD_WR_REG(u8 dat);//写入一个指令
  47. void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);//设置坐标函数
  48. void LCD_Init(void);//LCD初始化
  49. #endif
复制代码
其它显示字符的接口函数如下:
  1. /******************************************************************************
  2.       函数说明:显示汉字串
  3.       入口数据:x,y显示坐标
  4.                 *s 要显示的汉字串
  5.                 fc 字的颜色
  6.                 bc 字的背景色
  7.                 sizey 字号 可选 16 24 32
  8.                 mode:  0非叠加模式  1叠加模式
  9.       返回值:  无
  10. ******************************************************************************/
  11. void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  12. {
  13.         while(*s!=0)
  14.         {
  15.                 if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
  16.                 else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
  17.                 else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
  18.                 else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
  19.                 else return;
  20.                 s+=1;
  21.                 x+=((128/sizey)+(128%sizey));
  22.         }
  23. }

  24. /******************************************************************************
  25.       函数说明:显示单个12x12汉字
  26.       入口数据:x,y显示坐标
  27.                 *s 要显示的汉字
  28.                 fc 字的颜色
  29.                 bc 字的背景色
  30.                 sizey 字号
  31.                 mode:  0非叠加模式  1叠加模式
  32.       返回值:  无
  33. ******************************************************************************/
  34. void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  35. {
  36.         u8 i,j,m=0;
  37.         u16 k;
  38.         u16 HZnum;//汉字数目
  39.         u16 TypefaceNum;//一个字符所占字节大小
  40.         u16 x0=x;
  41.         TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  42.                                  
  43.         HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);        //统计汉字数目
  44.         for(k=0;k<HZnum;k++)
  45.         {
  46.                 if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1)))
  47.                 {         
  48.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  49.                         for(i=0;i<TypefaceNum;i++)
  50.                         {
  51.                                 for(j=0;j<8;j++)
  52.                                 {        
  53.                                         if(!mode)//非叠加方式
  54.                                         {
  55.                                                 if(tfont12[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  56.                                                 else LCD_WR_DATA(bc);
  57.                                                 m++;
  58.                                                 if(m%sizey==0)
  59.                                                 {
  60.                                                         m=0;
  61.                                                         break;
  62.                                                 }
  63.                                         }
  64.                                         else//叠加方式
  65.                                         {
  66.                                                 if(tfont12[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  67.                                                 x++;
  68.                                                 if((x-x0)==sizey)
  69.                                                 {
  70.                                                         x=x0;
  71.                                                         y++;
  72.                                                         break;
  73.                                                 }
  74.                                         }
  75.                                 }
  76.                         }
  77.                 }                                          
  78.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  79.         }
  80. }

  81. /******************************************************************************
  82.       函数说明:显示单个16x16汉字
  83.       入口数据:x,y显示坐标
  84.                 *s 要显示的汉字
  85.                 fc 字的颜色
  86.                 bc 字的背景色
  87.                 sizey 字号
  88.                 mode:  0非叠加模式  1叠加模式
  89.       返回值:  无
  90. ******************************************************************************/
  91. void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  92. {
  93.         u8 i,j,m=0;
  94.         u16 k;
  95.         u16 HZnum;//汉字数目
  96.         u16 TypefaceNum;//一个字符所占字节大小
  97.         u16 x0=x;
  98.   TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  99.         HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);        //统计汉字数目
  100.         for(k=0;k<HZnum;k++)
  101.         {
  102.                 if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
  103.                 {         
  104.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  105.                         for(i=0;i<TypefaceNum;i++)
  106.                         {
  107.                                 for(j=0;j<8;j++)
  108.                                 {        
  109.                                         if(!mode)//非叠加方式
  110.                                         {
  111.                                                 if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  112.                                                 else LCD_WR_DATA(bc);
  113.                                                 m++;
  114.                                                 if(m%sizey==0)
  115.                                                 {
  116.                                                         m=0;
  117.                                                         break;
  118.                                                 }
  119.                                         }
  120.                                         else//叠加方式
  121.                                         {
  122.                                                 if(tfont16[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  123.                                                 x++;
  124.                                                 if((x-x0)==sizey)
  125.                                                 {
  126.                                                         x=x0;
  127.                                                         y++;
  128.                                                         break;
  129.                                                 }
  130.                                         }
  131.                                 }
  132.                         }
  133.                 }                                          
  134.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  135.         }
  136. }

  137. /******************************************************************************
  138.       函数说明:显示单个24x24汉字
  139.       入口数据:x,y显示坐标
  140.                 *s 要显示的汉字
  141.                 fc 字的颜色
  142.                 bc 字的背景色
  143.                 sizey 字号
  144.                 mode:  0非叠加模式  1叠加模式
  145.       返回值:  无
  146. ******************************************************************************/
  147. void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  148. {
  149.         u8 i,j,m=0;
  150.         u16 k;
  151.         u16 HZnum;//汉字数目
  152.         u16 TypefaceNum;//一个字符所占字节大小
  153.         u16 x0=x;
  154.         TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  155.         HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);        //统计汉字数目
  156.         for(k=0;k<HZnum;k++)
  157.         {
  158.                 if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
  159.                 {         
  160.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  161.                         for(i=0;i<TypefaceNum;i++)
  162.                         {
  163.                                 for(j=0;j<8;j++)
  164.                                 {        
  165.                                         if(!mode)//非叠加方式
  166.                                         {
  167.                                                 if(tfont24[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  168.                                                 else LCD_WR_DATA(bc);
  169.                                                 m++;
  170.                                                 if(m%sizey==0)
  171.                                                 {
  172.                                                         m=0;
  173.                                                         break;
  174.                                                 }
  175.                                         }
  176.                                         else//叠加方式
  177.                                         {
  178.                                                 if(tfont24[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  179.                                                 x++;
  180.                                                 if((x-x0)==sizey)
  181.                                                 {
  182.                                                         x=x0;
  183.                                                         y++;
  184.                                                         break;
  185.                                                 }
  186.                                         }
  187.                                 }
  188.                         }
  189.                 }                                          
  190.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  191.         }
  192. }

  193. /******************************************************************************
  194.       函数说明:显示单个32x32汉字
  195.       入口数据:x,y显示坐标
  196.                 *s 要显示的汉字
  197.                 fc 字的颜色
  198.                 bc 字的背景色
  199.                 sizey 字号
  200.                 mode:  0非叠加模式  1叠加模式
  201.       返回值:  无
  202. ******************************************************************************/
  203. void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
  204. {
  205.         u8 i,j,m=0;
  206.         u16 k;
  207.         u16 HZnum;//汉字数目
  208.         u16 TypefaceNum;//一个字符所占字节大小
  209.         u16 x0=x;
  210.         TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
  211.         HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);        //统计汉字数目
  212.         for(k=0;k<HZnum;k++)
  213.         {
  214.                 if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
  215.                 {         
  216.                         LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
  217.                         for(i=0;i<TypefaceNum;i++)
  218.                         {
  219.                                 for(j=0;j<8;j++)
  220.                                 {        
  221.                                         if(!mode)//非叠加方式
  222.                                         {
  223.                                                 if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
  224.                                                 else LCD_WR_DATA(bc);
  225.                                                 m++;
  226.                                                 if(m%sizey==0)
  227.                                                 {
  228.                                                         m=0;
  229.                                                         break;
  230.                                                 }
  231.                                         }
  232.                                         else//叠加方式
  233.                                         {
  234.                                                 if(tfont32[k].Msk[i]&(0x01<<j))        LCD_DrawPoint(x,y,fc);//画一个点
  235.                                                 x++;
  236.                                                 if((x-x0)==sizey)
  237.                                                 {
  238.                                                         x=x0;
  239.                                                         y++;
  240.                                                         break;
  241.                                                 }
  242.                                         }
  243.                                 }
  244.                         }
  245.                 }                                          
  246.                 continue;  //查找到对应点阵字库立即退出,防止多个汉字重复取模带来影响
  247.         }
  248. }

  249. /******************************************************************************
  250.       函数说明:显示单个字符
  251.       入口数据:x,y显示坐标
  252.                 num 要显示的字符
  253.                 fc 字的颜色
  254.                 bc 字的背景色
  255.                 sizey 字号
  256.                 mode:  0非叠加模式  1叠加模式
  257.       返回值:  无
  258. ******************************************************************************/
  259. void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
  260. {
  261.         u8 temp,sizex,t,m=0;
  262.         u16 i,TypefaceNum;//一个字符所占字节大小
  263.         u16 x0=x;
  264.         sizex=sizey/2;
  265.         TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
  266.         num=num-' ';    //得到偏移后的值
  267.         LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  //设置光标位置
  268.         for(i=0;i<TypefaceNum;i++)
  269.         {
  270.                 if(sizey==12)temp=ascii_1206[num][i];                       //调用6x12字体
  271.                 else if(sizey==16)temp=ascii_1608[num][i];                 //调用8x16字体
  272.                 else if(sizey==24)temp=ascii_2412[num][i];                 //调用12x24字体
  273.                 else if(sizey==32)temp=ascii_3216[num][i];                 //调用16x32字体
  274.                 else return;
  275.                 for(t=0;t<8;t++)
  276.                 {
  277.                         if(!mode)//非叠加模式
  278.                         {
  279.                                 if(temp&(0x01<<t))LCD_WR_DATA(fc);
  280.                                 else LCD_WR_DATA(bc);
  281.                                 m++;
  282.                                 if(m%sizex==0)
  283.                                 {
  284.                                         m=0;
  285.                                         break;
  286.                                 }
  287.                         }
  288.                         else//叠加模式
  289.                         {
  290.                                 if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);//画一个点
  291.                                 x++;
  292.                                 if((x-x0)==sizex)
  293.                                 {
  294.                                         x=x0;
  295.                                         y++;
  296.                                         break;
  297.                                 }
  298.                         }
  299.                 }
  300.         }                     
  301. }

  302. /******************************************************************************
  303.       函数说明:显示字符串
  304.       入口数据:x,y显示坐标
  305.                 *p 要显示的字符串
  306.                 fc 字的颜色
  307.                 bc 字的背景色
  308.                 sizey 字号
  309.                 mode:  0非叠加模式  1叠加模式
  310.       返回值:  无
  311. ******************************************************************************/
  312. void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
  313. {         
  314.         while(*p!='\0')
  315.         {      
  316.                 LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
  317.                 x+=sizey/2;
  318.                 p++;
  319.         }  
  320. }
复制代码
main.c
  1. #include "pin_mux.h"
  2. #include "peripherals.h"
  3. #include "board.h"
  4. #include "pic.h"
  5. #include "lcd_init.h"
  6. /*******************************************************************************
  7. * Definitions
  8. ******************************************************************************/

  9. typedef struct
  10. {
  11.         unsigned char Index[2];
  12.         unsigned char Msk[32];
  13. }typFNT_GB16;
  14. /*******************************************************************************
  15. * Prototypes
  16. ******************************************************************************/
  17. extern const typFNT_GB16 tfont16[];
  18. /*******************************************************************************
  19. * Variables
  20. ******************************************************************************/
  21. volatile uint32_t g_systickCounter;
  22. /*******************************************************************************
  23. * Code
  24. ******************************************************************************/

  25. void SysTick_Handler(void)
  26. {
  27.     if (g_systickCounter != 0U)
  28.     {
  29.         g_systickCounter--;
  30.     }
  31. }

  32. void SysTick_DelayTicks(uint32_t n)
  33. {
  34.     g_systickCounter = n;
  35.     while (g_systickCounter != 0U)
  36.     {
  37.     }
  38. }

  39. void Display_title(void)
  40. {
  41.         LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  42.         LCD_ShowIntNum(8,10,2024,4,RED,BLACK,16);
  43.         LCD_ShowChinese(40,10,&tfont16[0],RED,BLACK,16,0);
  44.         LCD_ShowChinese(56,10,&tfont16[1],RED,BLACK,16,0);
  45.         LCD_ShowChinese(72,10,&tfont16[2],RED,BLACK,16,0);
  46.         LCD_ShowChinese(88,10,&tfont16[3],RED,BLACK,16,0);
  47.         LCD_ShowChinese(104,10,&tfont16[4],RED,BLACK,16,0);
  48.         LCD_ShowChinese(8,30,&tfont16[5],RED,BLACK,16,0);
  49.         LCD_ShowChinese(24,30,&tfont16[6],RED,BLACK,16,0);
  50.         LCD_ShowString(40,30,"MCX",RED,BLACK,16,0);
  51.         LCD_ShowString(64,30," ",BLACK,BLACK,16,0);
  52.         LCD_ShowString(72,30,"N",RED,BLACK,16,0);
  53.         LCD_ShowString(80,30," ",BLACK,BLACK,16,0);
  54.         LCD_ShowChinese(88,30,&tfont16[7],RED,BLACK,16,0);
  55.         LCD_ShowChinese(104,30,&tfont16[8],RED,BLACK,16,0);
  56.         
  57.         LCD_ShowChinese(8,50,&tfont16[9],RED,BLACK,16,0);
  58.         LCD_ShowChinese(24,50,&tfont16[10],RED,BLACK,16,0);
  59.         LCD_ShowChinese(40,50,&tfont16[11],RED,BLACK,16,0);
  60.         LCD_ShowChinese(56,50,&tfont16[12],RED,BLACK,16,0);
  61.         LCD_ShowChinese(72,50,&tfont16[13],RED,BLACK,16,0);
  62.         LCD_ShowChinese(88,50,&tfont16[5],RED,BLACK,16,0);
  63.         LCD_ShowChinese(104,50,&tfont16[14],RED,BLACK,16,0);
  64.         LCD_ShowChinese(8,70,&tfont16[15],RED,BLACK,16,0);
  65.         LCD_ShowChinese(24,70,&tfont16[16],RED,BLACK,16,0);
  66.         LCD_ShowString(56,70,"2024-12-02",BLUE,BROWN,12,0);
  67.        for(uint8_t num=0; num<3; num++)
  68.         {
  69.                 LCD_ShowPicture(0,87,128,160,gImage_21);
  70.                 LCD_ShowPicture(0,87,128,160,gImage_22);
  71.                 LCD_ShowPicture(0,87,128,160,gImage_23);
  72.                 LCD_ShowPicture(0,87,128,160,gImage_24);
  73.                 LCD_ShowPicture(0,87,128,160,gImage_25);
  74.         }
  75. }

  76. int main(void)
  77. {
  78.     /* Board pin init */
  79.     CLOCK_EnableClock(kCLOCK_Gpio0);
  80.     CLOCK_EnableClock(kCLOCK_Gpio1);
  81.     CLOCK_EnableClock(kCLOCK_Gpio4);
  82.     BOARD_InitPins();
  83.     LED_RED_INIT(LOGIC_LED_OFF);
  84.     LED_BLUE_INIT(LOGIC_LED_OFF);
  85.     LED_GREEN_INIT(LOGIC_LED_OFF);
  86.         
  87.     /* Set systick reload value to generate 1us interrupt */
  88.     if (SysTick_Config(SystemCoreClock / 1000000U))
  89.     {
  90.         while (1)
  91.         {
  92.         }
  93.     }
  94.                
  95.         LCD_Init();
  96.         SysTick_DelayTicks(200U);
  97.         LCD_Fill(0,0,LCD_W,LCD_H,YELLOW);
  98.         SysTick_DelayTicks(200);
  99.         LCD_Fill(0,0,LCD_W,LCD_H,WHITE);
  100.         while (1)
  101.         {
  102.               LCD_ShowPicture(4,0,128,160,gImage_1);
  103.               Display_title();
  104.         }
  105. }
复制代码

四、下载运行

        编译通过后,将程序下载到FRDM-MCXN947开发板中,显示效果如下:



NXP FRDM-MCXN947驱动TFT-LCD屏
https://www.bilibili.com/video/BV1bTzSYfEyh/
[media=x,500,375][/media]
http://【NXP FRDM-MCXN947驱动TFT-LCD屏】 https://www.bilibili.com/video/BV1bTzSYfEyh/?share_source=copy_web&vd_source=e6778606bed9c8e5e7d4db72f6889b7f

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条