摘要:直接控制GPIO口模拟8080时序,进行LCD芯片的基本驱动过程和代码。
1. 驱动过程
1.1 连接IO口并初始化
这里均采用CubeMx自动化配置。
需要确定的接口有:
- 8080时序接口:CS, RS, RD, WR, D[15:0],全部都设置为GPIO 推挽输出
- 背光接口:BLK,也设置为GPIO 推挽输出
1.2 编写接口函数(LCD.h)
1.2.1 控制GPIO电平
GPIO电平变化:最底层的接口,直接控制上述GPIO口的电平变化。为了提高刷新率,可以直接调用GPIO的BSRR寄存器进行修改,这里就不进行对比试验了。
写入的入参是电平设置(0/1),LCD_DATA_OUT()控制16个数据引脚,因此入参是16位整型。
读取的出参的读取的16位数据。
1.2.2 8080时序模拟
8080时序模拟:调用上述接口,实现对LCD芯片的读写功能,分为以下三个函数:写入指令,写入数据,读取数据。
入参出参略。
1.2.3 功能(指令)函数
根据LCD IC 的6条基本指令编写的功能函数,分别是读ID,访问控制,行/列地址设置,写/读GRAM。调用时序模拟函数控制LCD。
1.2.4 初始化函数
根据读出的ID确定选择什么初始化函数,这个要在芯片手册中找到。笔者这里用的是ILI9371芯片,直接照搬例程中的函数了(甚至直接写在了主函数中)。
1.3 使用
依次调用上述功能函数即可。这里使用了图像取模软件,一个像素用两个usigned char 表示,对lcd_wr_gram稍作修改即可。
效果图:
2 注意事项
LCD_DATA_OUT() 函数编写的时候要搞清数据的方向,D15是最高位,D0是最低位,在做与运算的时候要确认写入数据的比较位是否和引脚对应。
(这里如果DATA 引脚的数组是从D0开始排序反而不容易出问题。)
3 正点原子例程的编程要点
3.1 控制GPIO电平
直接使用寄存器读取,提高刷新率
具体来说,BL/WR/RD/CS/RS 使用BSRR寄存器,高16位置0,低16位置1
(例程的DATAGPIO控制比较特殊,使用ODR和IDR寄存器,这里是因为正点MiniF103开发板,LCD的数据引脚D0D15正好对应PB0PB15,因此直接使用ODR和IDR)
3.2 数据读取函数
- 在时序之前和之后需要GPIO初始化,分别将GPIO改为输入和改回输出,调用HAL_GPIO_Init,参数是GPIOPort和GPIO_InitTypeDef(包含Pin,Mode,Pull , Speed)
- 在RS,CS,RD设置好之后,延迟2ms等待读取数据稳定
画点和读点函数
画点函数的步骤:设置XY坐标,然后全部设置为一个颜色
3.3 制作字库并显示
使用PCtoLCD2002软件制作字库。
3.4 代码移植的注意事项
如果要移植到不同的板子上,需要注意的问题就是GPIO电平的控制函数需要对应修改。