查看: 751|回复: 1

[分享] 使用MCXA156点圆形屏及对点圆形屏的理解

[复制链接]
  • TA的每日心情
    擦汗
    2025-2-21 12:40
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    11

    主题

    1682

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3721
    最后登录
    2025-8-16
    发表于 2025-3-25 23:08:01 | 显示全部楼层 |阅读模式
    本帖最后由 oxlm 于 2025-3-25 23:16 编辑

    接线定义
    1.png

    接线表
    MCXA156microbus接口SPI侧)

    功能
    GND
    GND

    RES
    RST
    复位脚
    SDO
    SDA
    SPI数据脚
    SCK
    SCL
    SPI时钟脚
    CS
    CS
    SPI通信使能脚
    SDI
    DC
    数据/命令切换脚
    3V3
    VCC
    供电
    AN
    BLK
    背光脚
    代码编写
      中景园的驱动代码基本上是在st芯片上写好的,看了下他的实现框架,默认使用的是GPIO模拟SPI进行驱屏,因此移植的重心就是移植驱动文件,之后将管脚配置成GPIO并修改驱动底层代码,最后编写上层验证代码验证,便能快速点屏确认效果了。
    屏驱动代码移植
      拷贝中景园任意工程目录下的HARDWARE/LCD目录下的文件至工程代码路径中,并添加至工程中。
    配置MCXA156管脚
        MCXA156的管脚配置就简单多了,直接启动MCUXpresso配置工具,使能GPIO并默认输出低电平即可。
    1.png

    驱动代码修改
    公共修改
    头文件更改
      原先代码中的bsp.h替换成board.h,主要是两个目的:
        1. 确保中景园定义的在nxp代码中能找到
        2. 确保nxp定义的管脚编号相关的宏能被中景园的驱动代码找到
    变量类型替换
      中景园定义的类型基本上为u8u16u32,这些定义在nxp的代码中几乎看不见,因此直接全局将u8替换成uint8_t,u16替换成uint16_t,u32替换成uint32_t,以防编译报错。
    lcdinit.h
      所有的涉及到gpio电平控制的管脚都替换成nxp标准接口
    1. #define LCD_SCLK_Clr() GPIO_PinWrite(BOARD_INITPINS_SCK_GPIO, BOARD_INITPINS_SCK_PIN, 0)  // SCL=SCLK
    2. #define LCD_SCLK_Set() GPIO_PinWrite(BOARD_INITPINS_SCK_GPIO, BOARD_INITPINS_SCK_PIN, 1)

    3. #define LCD_MOSI_Clr() GPIO_PinWrite(BOARD_INITPINS_SDO_GPIO, BOARD_INITPINS_SDO_PIN, 0)  // SDA=MOSI
    4. #define LCD_MOSI_Set() GPIO_PinWrite(BOARD_INITPINS_SDO_GPIO, BOARD_INITPINS_SDO_PIN, 1)

    5. #define LCD_RES_Clr() GPIO_PinWrite(BOARD_INITPINS_RST_GPIO, BOARD_INITPINS_RST_PIN, 0)  // RES
    6. #define LCD_RES_Set() GPIO_PinWrite(BOARD_INITPINS_RST_GPIO, BOARD_INITPINS_RST_PIN, 1)

    7. #define LCD_DC_Clr() GPIO_PinWrite(BOARD_INITPINS_DC_GPIO, BOARD_INITPINS_DC_PIN, 0)  // DC
    8. #define LCD_DC_Set() GPIO_PinWrite(BOARD_INITPINS_DC_GPIO, BOARD_INITPINS_DC_PIN, 1)

    9. #define LCD_CS_Clr() GPIO_PinWrite(BOARD_INITPINS_CS_GPIO, BOARD_INITPINS_CS_PIN, 0)  // CS
    10. #define LCD_CS_Set() GPIO_PinWrite(BOARD_INITPINS_CS_GPIO, BOARD_INITPINS_CS_PIN, 1)

    11. #define LCD_BLK_Clr() GPIO_PinWrite(BOARD_INITPINS_AN_GPIO, BOARD_INITPINS_AN_PIN, 0)  // BLK
    12. #define LCD_BLK_Set() GPIO_PinWrite(BOARD_INITPINS_AN_GPIO, BOARD_INITPINS_AN_PIN, 1)
    复制代码

    验证代码编写
    1. #include <stdio.h>
    2. #include <string.h>

    3. #include "HARDWARE/LCD/lcd.h"
    4. #include "HARDWARE/LCD/lcd_init.h"
    5. #include "HARDWARE/LCD/pic.h"
    6. #include "app.h"
    7. #include "board.h"
    8. #include "fsl_debug_console.h"
    9. #include "time.h"

    10. /*!
    11. * @brief Main function
    12. */
    13. int main(void) {
    14.   uint8_t i, j;
    15.   float t = 0;

    16.   BOARD_InitHardware();
    17.   
    18.   LCD_Init();
    19.   LCD_Fill(0, 0, LCD_W, LCD_H, BLACK);

    20.   while (1) {
    21.     LCD_DrawLine(i, 0, i, 239, BLACK);
    22.     i += 1;
    23.     if (i > (LCD_W - 1)) {
    24.       i %= LCD_W;
    25.     }
    26.     LCD_DrawLine(i, 0, i, 1, BLUE);
    27.     LCD_DrawLine(i, 2, i, LCD_W - 3, WHITE);
    28.     LCD_DrawLine(i, LCD_W - 2, i, LCD_W - 1, BLUE);

    29.     LCD_DrawLine(0, j, 239, j, BLACK);
    30.     j += 1;
    31.     if (j > (LCD_H - 1)) {
    32.       j %= LCD_H;
    33.     }
    34.     LCD_DrawLine(0, j, 1, j, BLUE);
    35.     LCD_DrawLine(2, j, LCD_H - 3, j, WHITE);
    36.     LCD_DrawLine(LCD_H - 2, j, LCD_H - 1, j, BLUE);

    37.     delay_ms(30);
    38.   }
    39. }
    复制代码

    实现效果
      最终显示上,会有两条正交的直线缓慢移动,仔细观察,会发现只有在屏直径最高点的位置才能看到两端的蓝色亮点。
    1.png


    总结
      确实如群里所说,异形屏的显示写法和方形屏并没有什么差别。而之所以是这种情况,个人理解为,实际上软件操作接口还是一样的,而硬件上,仅仅是将不存在的那部分区域的显示电路去掉了,虽然我们可以操作驱动芯片对应的buffer,但实际上,这部分buffer并不会对应的更新到屏上去,因为没有接上buffer对应的像素点。画成框图便是:
    1.png

      这个图不是严格准确,因为实际数据的的存储是一维的,也就是说,真正的内存和像素点之间的对应关系不是图示的关系,而是一段连续的存储区,按照宽度去分行并接到像素点上。对于异形屏来说,我们使用存储区域还是矩形区,只是实际显示出来的区域为矩形区的一小部分。
    这个结论使用矩形区的示意图就更加清晰了,
    1.png

      对于矩形屏,使用的显示区域和实际显示的区域几乎是一致的,只有少部分屏会留边框上的一部分像素点不显示(用于某些特殊场景,比如防烧屏之类的功能)。而在异型屏中,区别仅仅是,实际不使用的区域更多了罢了。



    zjy_1_28_lcd.zip

    1.22 MB, 下载次数: 1, 下载积分: 威望 1

    验证代码

    ~~~~~~~~~~~~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:20
  • 签到天数: 216 天

    连续签到: 25 天

    [LV.7]常住居民III

    47

    主题

    6780

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    11249
    最后登录
    2025-8-16
    发表于 2025-3-26 08:35:55 | 显示全部楼层
    学习了。











    NXP4.png NXP3.png
    NXP2.png NXP1.png
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-17 01:40 , Processed in 0.088094 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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