如何根据时序图编程——驱动OCM12864

 最近接手的项目需要驱动显示屏,学会了如何根据数据手册上的时序图来编写对应的驱动。

时序图分析

  第一张图为OCM显示屏的写操作时序,第二张图为时序图中的参数表:

时序图

时序参数表

  E是使能信号,R/W是读写选择信号,CS是片选信号,RS是数据/命令切换信号,用于决定写入的是数据还是命令,DB0-DB7是数据位。

  看时序图需要从左向右看,根据电平的变化顺序来编写程序,同时根据参数表中规定的参数的极限值来控制时间,一般是通过加入延时来达到时间要求。

  以此时序图为例,E信号首先发生跳变,由高置低,需要保持Pwel的时间,即最少保持450ns。如果是写入指令,则需要将RS置低。图中CS和RS发生交叉,说明信号可高可低,根据需要设置而不是按照图示进行跳变。由于是写操作,将R/W信号置低(置高置低根据手册上的说明)。观察参数表,这两个信号保持的时间最少为140ns。随后,E信号由低至高跳变,保持时间最少为450ns,且整个E信号的时间周期不少于1000ns。接着,写入数据,图中DB0-DB7的信号图表示信号有高有低,数据建立需要最少200ns的时间。最后,再将E信号拉低。

编写驱动

  以上分析就是这个时序图完整的过程,先根据此分析编写一个驱动,如下所示:

1
2
3
4
5
6
7
8
LCM_E_L; //E置低
LCM_RS_L; //RS置低
LCM_WR_L; //R/W置低
LCM_E_H; //E置高
GPIO_OutputValue(3,value,1); //以下三行写入指令
value=~value;
GPIO_OutputValue(3,value,0);
LCM_E_L; //E置低

  由此得到的驱动程序为根据时序图直接编写得到的。为了检查各信号是否满足参数表的要求,下载到对应的板子上,用示波器测量信号持续时间。由于其他程序的运行耗时影响,此时间需要通过测量得到,而不建议通过计算得到。

  本项目使用的板子除E信号的保持时间未达到要求,其余都满足要求,因而加入延时。修改的驱动程序如下:

1
2
3
4
5
6
7
8
9
10
LCM_E_L; //E置低
LCM_RS_L; //RS置低
LCM_WR_L; //R/W置低
LCM_E_H; //E置高
LcdDelay(1); //加入延时
GPIO_OutputValue(3,value,1); //以下三行写入指令
value=~value;
GPIO_OutputValue(3,value,0);
LcdDelay(1);
LCM_E_L; //E置低

  在此驱动程序之前,还得首先完成管脚的初始化。按顺序一般是复用管脚的功能选择、管脚方向设置、管脚电平初始化。
完成管脚配置后还必须加入一段延时来使得器件完成相关配置,之后再加载驱动。

结果

  由此得到的驱动程序可以正常驱动显示屏,至于显示屏的亮度清晰度需要通过调整外围电路的电阻电容值,可以考虑在实验板上用可调电阻,取得合适的值后换成定值电阻。

|