查看: 337|回复: 0

[评测分享] 【Avnet | NXP FRDM-MCXN947试用活动】驱动TFT彩屏

[复制链接]
  • TA的每日心情
    奋斗
    6 小时前
  • 签到天数: 2330 天

    连续签到: 412 天

    [LV.Master]伴坛终老

    发表于 2024-12-4 00:02:53 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 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触控屏.png
       由上电路原理图可知,该外设底板集成的LCD屏是具备触摸功能的,此次就单单显示部分功能进行驱动。
         再来看FRDM-MCXN947开发板的原理图部分,两者信号脚确认好后,才能使用杜邦线进行正确连接。
    FlexIO_LCD.png
    两块板子信号脚的连接布设如下:
    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
      硬件连接图:
    界面1.jpg

    三、代码实现
        本次工程还是在上期点灯例程上进行完善吧,首先在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开发板中,显示效果如下:
    刷图.jpg
    界面2.jpg

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

    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-12-23 21:30 , Processed in 0.112652 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.