手里有几片3.3V的256*96点阵液晶屏,是准备用于诸如STM32之类的开发板用的显示部件。主要是为了调试程序的时候方便查看调试信息以及中间处理结果。这块液晶屏采用SPI接口模式,分辨率为256*96像素,使用16*16点阵显示汉字的话,一屏可以显示16列*6行汉字。由于液晶屏没带字库,需要自己建立。只需要把程序中用到的汉字的点阵数据保存到文件中。
程序中用到的时候,通过检索匹配的汉字,找到点阵数据,按照一定的格式发送给液晶屏,显示出来即可。需要特别说明的是,点阵数据一定要以匹配液晶内部要求的方式,否则屏幕上现实的不是汉字,而是杂乱的点。这块液晶屏使用以下几个口线驱动:
SCK ---- 传送数据、指令用的时钟脉冲。上升沿数据有效。
SDA ---- 串行传递的数据,高位在前,低位在后的模式传送。
CS ---- 片选信号,当需要传递数据、指令给液晶屏时,要设置为“1”
RESET ---- 复位信号,“0”有效,要保证200毫秒以上才有效。否则液晶屏不会正常工作。
RS ---- 用来设置发送给液晶屏的数据是指令还是数据。RS=0时,表示是指令; RS=1时,表示为数据。
剩下的是VDD(3.3V),GND,以及背景LED灯电源LED+。
液晶的显示缓冲区与屏幕的映射见下图:
实际上,纵向上每8个像素行为一页。
数据传送时序特性:
上电复位时序:
我这里为了快速处理,使用PE6-PE3,以软件模拟的方式驱动液晶。之前用51单片机驱动液晶已经成功,所以相信这块开发板也肯定没有问题。
简单地把51下的程序修改一下,加入到工程中。原以为绝对不会有问题,结果打脸了,竟然没有任何显示。第一个感觉,肯定是时序出问题了。51单片机的时候,系统主频是27MHz,而极海的开发板的主频是120MHz。是不是脉冲宽度太小,不符合液晶屏的时序要求?光看程序看不出问题了,只好上示波器查看、对比了。简单修改下程序,在主循环处理中加入SCK、SDA、CS、RESET、RS的输出脉冲操作。
先看看51单片机下,SCK的时钟宽度,确认为1微秒不到。转到极海开发板上,咦,只有两个GPIO口有脉冲信号,其他三个没有脉冲信号。难道是没执行GPIO的初始化处理?或者GPIO被其他程序用了?马上检查程序,发现关联的GPIO口初始化处理确实没有被执行。由于开发板上已经使用PE6和PE5给LED2和LED3用了,使用的工程模板为LED翻转显示的那个,工程中已经对PE6和PE5初始化了,所以这两个GPIO有脉冲输出。其他三个没有初始化,所以就没有输出。接下来除了把GPIO的初始化处理加上,同时调整数据,使微秒和毫秒的延时更准确一些。这些修改完成后,编译程序、下载代码,复位开发板,哈哈哈,液晶上已经正常显示出数据了。
经过这次的测试,发现示波器的重要性了。由于不同开发板工作的主频不一致,在开发时,为了匹配外部设备的通讯时序,必须配合外部设备,调整参数,以获得正确的通信时序。这个时候,如果没有示波器、逻辑分析仪,是真办法的。另外一点是,遇到问题别着急,把问题揉开掰碎成一个一个小问题,逐步检查,确认问题点在哪里。就像这次,当液晶不显示的时候,按照以下步骤检查:
1、液晶有没有问题?回到51开发板上确认。
2、程序处理逻辑、通讯指令、数据是否有问题。
3、各个IO接口能否产生信号。这个即使没有示波器,也可以通过万用表、LED检查。
4、信号的时序是否正常、脉冲宽度是否正常。这个需要配合程序,以及使用示波器、逻辑分析仪之类的设备来配合了。
跌跌撞撞地,终于用软件把GPIO模拟为SPI的方式驱动液晶屏成功了。下一步试试用SPI及串口方式驱动看看。
---------------------
作者:suncat0504
链接:https://bbs.21ic.com/icview-3219226-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。