摘要:直接控制GPIO口模拟8080时序,进行LCD芯片的基本驱动过程和代码。

1. 驱动过程

image-20250509015227560

1.1 连接IO口并初始化

这里均采用CubeMx自动化配置。

需要确定的接口有:

  1. 8080时序接口:CS, RS, RD, WR, D[15:0],全部都设置为GPIO 推挽输出
  2. 背光接口:BLK,也设置为GPIO 推挽输出

1.2 编写接口函数(LCD.h)

1.2.1 控制GPIO电平

GPIO电平变化:最底层的接口,直接控制上述GPIO口的电平变化。为了提高刷新率,可以直接调用GPIO的BSRR寄存器进行修改,这里就不进行对比试验了。

写入的入参是电平设置(0/1),LCD_DATA_OUT()控制16个数据引脚,因此入参是16位整型。

读取的出参的读取的16位数据。

image-20250511050250824

1.2.2 8080时序模拟

8080时序模拟:调用上述接口,实现对LCD芯片的读写功能,分为以下三个函数:写入指令,写入数据,读取数据。

入参出参略。

image-20250511051000285

1.2.3 功能(指令)函数

根据LCD IC 的6条基本指令编写的功能函数,分别是读ID,访问控制,行/列地址设置,写/读GRAM。调用时序模拟函数控制LCD。

image-20250511051254913

1.2.4 初始化函数

根据读出的ID确定选择什么初始化函数,这个要在芯片手册中找到。笔者这里用的是ILI9371芯片,直接照搬例程中的函数了(甚至直接写在了主函数中)。

1.3 使用

依次调用上述功能函数即可。这里使用了图像取模软件,一个像素用两个usigned char 表示,对lcd_wr_gram稍作修改即可。

image-20250511052001982

效果图:

pic2

2 注意事项

  1. LCD_DATA_OUT() 函数编写的时候要搞清数据的方向,D15是最高位,D0是最低位,在做与运算的时候要确认写入数据的比较位是否和引脚对应。

    (这里如果DATA 引脚的数组是从D0开始排序反而不容易出问题。)

    image-20250511052605882

    image-20250511052308633

3 正点原子例程的编程要点

3.1 控制GPIO电平

直接使用寄存器读取,提高刷新率

具体来说,BL/WR/RD/CS/RS 使用BSRR寄存器,高16位置0,低16位置1

(例程的DATAGPIO控制比较特殊,使用ODR和IDR寄存器,这里是因为正点MiniF103开发板,LCD的数据引脚D0D15正好对应PB0PB15,因此直接使用ODR和IDR)

image-20250511235837820

3.2 数据读取函数

  1. 在时序之前和之后需要GPIO初始化,分别将GPIO改为输入和改回输出,调用HAL_GPIO_Init,参数是GPIOPort和GPIO_InitTypeDef(包含Pin,Mode,Pull , Speed)
  2. 在RS,CS,RD设置好之后,延迟2ms等待读取数据稳定

image-20250511233429950

画点和读点函数

画点函数的步骤:设置XY坐标,然后全部设置为一个颜色

3.3 制作字库并显示

使用PCtoLCD2002软件制作字库。

image-20250512012512246

image-20250512012644526

3.4 代码移植的注意事项

如果要移植到不同的板子上,需要注意的问题就是GPIO电平的控制函数需要对应修改。



本站由 kisekino yama 使用 Stellar 1.29.1主题创建。

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0许可协议,转载请注明出处。