在线时间290 小时
UID416136
注册时间2022-10-3
NXP金币4420
TA的每日心情 | 擦汗 2025-2-21 12:40 |
---|
签到天数: 16 天 连续签到: 1 天 [LV.4]偶尔看看III
金牌会员
 
- 积分
- 3721
- 最后登录
- 2025-8-16
|
本帖最后由 oxlm 于 2025-3-25 23:16 编辑
接线定义
接线表
MCXA156(microbus接口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并默认输出低电平即可。
驱动代码修改
公共修改
头文件更改
原先代码中的bsp.h替换成board.h,主要是两个目的:
1. 确保中景园定义的在nxp代码中能找到
2. 确保nxp定义的管脚编号相关的宏能被中景园的驱动代码找到
变量类型替换
中景园定义的类型基本上为u8,u16,u32,这些定义在nxp的代码中几乎看不见,因此直接全局将u8替换成uint8_t,u16替换成uint16_t,u32替换成uint32_t,以防编译报错。
lcdinit.h
所有的涉及到gpio电平控制的管脚都替换成nxp标准接口- #define LCD_SCLK_Clr() GPIO_PinWrite(BOARD_INITPINS_SCK_GPIO, BOARD_INITPINS_SCK_PIN, 0) // SCL=SCLK
- #define LCD_SCLK_Set() GPIO_PinWrite(BOARD_INITPINS_SCK_GPIO, BOARD_INITPINS_SCK_PIN, 1)
- #define LCD_MOSI_Clr() GPIO_PinWrite(BOARD_INITPINS_SDO_GPIO, BOARD_INITPINS_SDO_PIN, 0) // SDA=MOSI
- #define LCD_MOSI_Set() GPIO_PinWrite(BOARD_INITPINS_SDO_GPIO, BOARD_INITPINS_SDO_PIN, 1)
- #define LCD_RES_Clr() GPIO_PinWrite(BOARD_INITPINS_RST_GPIO, BOARD_INITPINS_RST_PIN, 0) // RES
- #define LCD_RES_Set() GPIO_PinWrite(BOARD_INITPINS_RST_GPIO, BOARD_INITPINS_RST_PIN, 1)
- #define LCD_DC_Clr() GPIO_PinWrite(BOARD_INITPINS_DC_GPIO, BOARD_INITPINS_DC_PIN, 0) // DC
- #define LCD_DC_Set() GPIO_PinWrite(BOARD_INITPINS_DC_GPIO, BOARD_INITPINS_DC_PIN, 1)
- #define LCD_CS_Clr() GPIO_PinWrite(BOARD_INITPINS_CS_GPIO, BOARD_INITPINS_CS_PIN, 0) // CS
- #define LCD_CS_Set() GPIO_PinWrite(BOARD_INITPINS_CS_GPIO, BOARD_INITPINS_CS_PIN, 1)
- #define LCD_BLK_Clr() GPIO_PinWrite(BOARD_INITPINS_AN_GPIO, BOARD_INITPINS_AN_PIN, 0) // BLK
- #define LCD_BLK_Set() GPIO_PinWrite(BOARD_INITPINS_AN_GPIO, BOARD_INITPINS_AN_PIN, 1)
复制代码
验证代码编写
- #include <stdio.h>
- #include <string.h>
- #include "HARDWARE/LCD/lcd.h"
- #include "HARDWARE/LCD/lcd_init.h"
- #include "HARDWARE/LCD/pic.h"
- #include "app.h"
- #include "board.h"
- #include "fsl_debug_console.h"
- #include "time.h"
- /*!
- * @brief Main function
- */
- int main(void) {
- uint8_t i, j;
- float t = 0;
- BOARD_InitHardware();
-
- LCD_Init();
- LCD_Fill(0, 0, LCD_W, LCD_H, BLACK);
- while (1) {
- LCD_DrawLine(i, 0, i, 239, BLACK);
- i += 1;
- if (i > (LCD_W - 1)) {
- i %= LCD_W;
- }
- LCD_DrawLine(i, 0, i, 1, BLUE);
- LCD_DrawLine(i, 2, i, LCD_W - 3, WHITE);
- LCD_DrawLine(i, LCD_W - 2, i, LCD_W - 1, BLUE);
- LCD_DrawLine(0, j, 239, j, BLACK);
- j += 1;
- if (j > (LCD_H - 1)) {
- j %= LCD_H;
- }
- LCD_DrawLine(0, j, 1, j, BLUE);
- LCD_DrawLine(2, j, LCD_H - 3, j, WHITE);
- LCD_DrawLine(LCD_H - 2, j, LCD_H - 1, j, BLUE);
- delay_ms(30);
- }
- }
复制代码
实现效果
最终显示上,会有两条正交的直线缓慢移动,仔细观察,会发现只有在屏直径最高点的位置才能看到两端的蓝色亮点。
总结
确实如群里所说,异形屏的显示写法和方形屏并没有什么差别。而之所以是这种情况,个人理解为,实际上软件操作接口还是一样的,而硬件上,仅仅是将不存在的那部分区域的显示电路去掉了,虽然我们可以操作驱动芯片对应的buffer,但实际上,这部分buffer并不会对应的更新到屏上去,因为没有接上buffer对应的像素点。画成框图便是:
这个图不是严格准确,因为实际数据的的存储是一维的,也就是说,真正的内存和像素点之间的对应关系不是图示的关系,而是一段连续的存储区,按照宽度去分行并接到像素点上。对于异形屏来说,我们使用存储区域还是矩形区,只是实际显示出来的区域为矩形区的一小部分。
这个结论使用矩形区的示意图就更加清晰了,
对于矩形屏,使用的显示区域和实际显示的区域几乎是一致的,只有少部分屏会留边框上的一部分像素点不显示(用于某些特殊场景,比如防烧屏之类的功能)。而在异型屏中,区别仅仅是,实际不使用的区域更多了罢了。
|
|