人力资源段式液晶显示方法
MSP430F413单片机 段式LCD设计 中遇到的晶振、LCD驱动等问题
2011-08-11 17:40
这次设计所用到的微控制器为 德州仪器(TI)的16位单片机 MSP430F413。
单从价格上面来说,这个是单片机也算是TI里面的最便宜的 可以直接驱动段式96段 LCD 的单片机了,当时设计之初也是奔着价位而来的,
由于在工作中用到过MSP430单片机做过低功耗类的产品,所以对单片机的外围以及硬件结构还是略知一二的。
相对于stc单片机的开发工具来说 430的开发工具也只是个JTAG接口,但是这个接口的价格嘛也得60元左右,由于以前做过MSP430的项目,所以开发工具是现成的~ 好了,言归正传,这次所用的LCD是淘宝上买的,详细资料如图所示:
是个四位的 lcd, 以前确实没有接触过段式LCD ,数码管倒是接触的不少,所以自己由好奇心的趋势,自己就做了一块开发板,想试试LCD的感觉。
首先开发板打样回来之后,元器件焊好,随便写了个定时器的程序进去,发现程序在10秒钟之内是运行正常的(此时还没有安装LCD,只是个指示灯在跑),不过也有偶尔程序不运行的情况,后来自己就找原因;
1、mcu焊接不好,
2、复位电路焊接不好,
3、晶振焊接不好,
逐一排查,发现前两项是很正常的,虽然PQFP的封装还是焊接的不多,但是自己的焊功还是过的去的 ,于是就找晶振的问题。
但是如果是晶振自身的问题的话,可能就不起振或者起振频率不对,以至于系统根本就无法定时启动。
所以疑点越来越在晶振上面,后来发现晶振自身是没有问题的,主要是原因是因为晶振的管脚焊接位置 距离单片机的 XIN XOUT 管脚的距离着实有点远,大概20mm的样子,加上线走的比较细 0.26mm,所以晶振启动异常,或者有时候根本不起振。
问题处在第3了。
没有办法只好用刻刀将晶振的线从单片机管脚出来大概3mm的地方划断,剥去丝印层,露出黄铜线,将晶振管脚直接焊接在黄铜线上,然后用硅胶枪将晶振和单片机封好,就是下面的样子 (很丑但是很温柔)~
凑合着先用一下,等实验好了的话,如果有需要就重新打样了。 将晶振如此这般之后,总算定时器稳定的工作在理想状态了,接下里就是
经验和教训了,单片机的晶振在设计的时候一定要首先 定位,确定晶振和单片机管脚之间的有效距离,确保晶振的稳定可靠运行,这个小家伙是关键啊 ~
接下来就是LCD 了~
段式LCD的驱动方法基本上和数码管是不太一样的,数码管只要给电和选通就亮。
但是段式LCD的驱动是靠两部分组成的
一部分是 不间断的 电压脉冲,
这个电压脉冲还是被分为好几个电压等级了,如果你用的是 1/4 duty 1/3偏压的话,那么就要有四个电压等级。也就是 VCC --- 2/3VCC ---- 1/3VCC-----GND 这几个电压等级直接可以用电阻进行分压得到,然后直接和 413单片机的 R03 ---GND , R13----1/3
VCC ,, R23---2/3VCC R33---VCC 这样直接连接就可以了。这样电压等级就有了,具体在里面生成的电压等级脉冲,413是可以自己生成的,不用我们操心了。
com0--com3就这些个电压等级的输出管脚。直接连上LCD屏的COM0---COM3就可以了。
另一部分是 选通管脚
选通管脚也就是LCD上面的 S0----Sn ,我在做板子的时候是和单片机里面的S0---Sn,直接连的 ,有几个连几个,多余的单片机IO 口直接拉出来,做外置IO口用。
那么如何来写驱动程序呢 ,
首先要搞懂每个输出管脚何时输出和输出什么,这样才能得到我们想要的字形。
于是看了资料发现,MSP430F413中配有LCD段码寄存器,就是说你只要把这些你要显示的字形(当然如果你只想显示数字的话,只用存0-9这几个字码就可以了),段码寄存器的地址是从091H开始------到0A4H 每个地址里面可以放一个8位,每一位对应于液晶上面的一段,所以说一个地址对应于液晶上面就是一个字。(一个字的段码也是8位的)
这样的话,我们只要将要显示的一个数字的编码发到这个 单片机的断码寄存器里面,就可以直接显示了,是通过com口的脉冲波形同时将寄存器里面的段进行耦合,产生压差,LCD只有产生压差才能点亮。一直提供一个不变的高电平是要烧坏液晶的,这就是和数码管区别的地方。不过这些脉冲413单片机已经帮我们做好了。
总体的步骤就是 ,我们将LCD的段码先整理好,然后放在一边备用,等到你想显示某个数据的时候,只要将这个8位的段码直接写入单片机留给你的LCD寄存器写入端口数组就可以了。
在413里面也就是 LCDMEM[ ]; 【】中应该写的是要显示的位,这个位是数码管上面的 位置,比如你想显示液晶上面的第2位数,先不说要显示的内容是什么,这里的位选应该是 LCDMEM[1], 因为是从0开始的,所以第二位应该是 LCDMEM[1]. (从091H开始------到0A4H 每个地址都可以存一个8段)
然后说显示的内容:
显示的内容的段码很关键,这个要看 你所拥有的LCD参数手册,一般都是这样的一张
:
这个表给我们的信息就是, 第9和第10列 显示一个8字,第11和第12列显示一个8字.....一共可以显示4个8字。
至于1234列先不要去考虑,那些都是字体周围的那些个小三角符号~ 因为LCD段码的等级脉冲方式是从 COM0---COM3 , 所以我们将这些第9和第10列的段码也要按照这个方式编码。
假如我们想显示第一个8字上面的内容:
即: 第一次脉冲出来 COM0 COM1 COM2 COM3, 那么寄存器里面输出来的段选也应该按照 COM0 COM1 COM2 COM3所对应的段码输出,这样才行显示出你想要的结果,那么我们在第一轮的 COM0--COM3输出时 匹配寄存器的段选应该 DP0---C0---b0----a0,第二轮的com0---com3 输出时,匹配寄存器的段选应该是 d0---e0-----g0----f0 这样第一个 8字的显示才完全了,
至于这个 寄存器是怎样把这些段码读并且写 出去呢, com口在启动后总是从COM0—COM3 ,COM0—COM3 ,COM0—COM3 ,一直不停的这样脉冲着....
排序方法应该根据 com0---c0m3 的 连续输出方式排。 一个8字的段码排序从高到低排,因为我两轮com0--c0m3的输出所以得这样排
第二
轮
第一轮
com3----com2-----com1----cmo0 com3----com2-----com1--
--cmo0
f0---- -----g0------e0---------d0 a0--------b0---
-------c0-------dp0(小数点位)
然后可以理解为 寄存器里的一个8位段码保存的段就是这样的 f0---- -----g0------e0---------d0 -------- a0--------b0----------c0-------dp0(小数点位)
到此我们如果想显示一个数字 2,我们该如何保存段码呢 按照数码管的方法 应该是 显示 a,b,d,e,g 这五段。 那么对于寄存器里面的这8个段 不是按照 ABCDEFGH 来排的,怎么整呢,
不要紧,显示哪一段就把哪一段 置 “1”,不显示的就 置零。 那么2出来了,有高到低就是 0111 1100 这里的小数点暂时不显示。 其中的 f c dp0不显示,所以写0 就可以啦~
所以2的最终段码就是 7CH
以此类推,你可以把 0---9的 10个段码全部写出来,然后组成一个通用的数组
char tongyong[10] =
{
0xBE, // '0' a+b+c+d+e+f
0x06, // '1'
0x7C, // '2'
0x5E, // '3'
0xC6, // '4'
0xDA, // '5'
0xFA, // '6'
0x0E, // '7'
0xFE, // '8'
0xDE // '9'
};
到此为止 基本上的 原理是走通了,那么具体是怎么才能显示呢, 想显示还要先设置,就像定时器一样,要先设置好相关的寄存器,它才会按照你的思想来运行。
这些设置在各种例程里面都有,随便找一个修改一下就可以了。 重点说数据的传送,当所有东西都设置好之后,
你想显示一个 0,在LCD上面的第1个位置,一般我们都是从右到左的 看法。 也就是在最右边的位置显示一个 0出来,我们要做的只有两步:
1. 先清屏
LCDMEM[0] = 0; 这个就是在第0位 不显示任何东西,清屏~ 当然清屏是在要改变显示数据前清的,并不是每时每刻的在清屏~ 我用一秒钟的中断定时器,实现时钟状态下每分钟清屏一次,整机功耗只有42微安~ 一节600MAH的 锂电池应该能工作1年2个月左右,还是比较划算的~
2,写数据
LCDMEM[0] = tongyong[0]; 这个就是把tongyong【0】;数组中的的第一个段码0xBE,发给显示寄存器。并且显示的地址是LCD屏上的第0位, LCDMEM[ n], 这个n是几,就是在第几位显示。 当然我的屏幕只有4位,那就是最多只有3了。
好了到此为止全部完工。发两张我的显示效果图上来。
当时设计电路板的时候买了是两种不同的液晶屏,设计的时候电路设计成通用的 了所以可以安装两
种规格的液晶
第一次做LCD,也许有很多理解不对的地方,欢迎大家指正,我们好一起进步~~
下班已经40分钟了,该打卡回家了~~