工做原理
方式一
根据 LCD 的驱动原理可知,LCD 像素点上只能加上 AC 电压,LCD 显示器的对比度由 COM脚上的电压值减去 SEG 脚上的电压值决定,当这个电压差大于 LCD 的饱和电压就能打开像素点,小于 LCD 阈值电压就能关闭像素点,LCD 型 MCU 已经由内建的 LCD 驱动电路自动产生 LCD 驱动信号,所以只要 I/O 口能仿真输出该驱动信号,就能完成 LCD 的驱动。 因为LCD工做的最佳帖频率一般在25Hz~250Hz,通常设置刷新频率在 60Hz左右便可
如今考虑如何模拟出 COM 的波形
1/2 Bias 下 COM0~COM3 的 LCD 驱动波形以下:
能够看出 4个COM 的输出,经过配置 IO口为高阻便可使其输出 VDD/2 电位,配置 IO为推挽输出便可输出高低电平。
所以在一个 COM 周期内,只要每隔一段时间设置 COM0~COM3 输出对应的电压便可获得 COM0~COM3 的波形。具体来讲就是第一次 Time Base 中断时设置 COM0 输出VDD,其它 COM 输出 VDD/2;第二次 Time Base 中断时设置 COM0 输出 VSS,COM1~COM3输出 VDD/2,第三次 Time Base 中断时设置 COM1 输出 VDD,其它 COM 输出 VDD/2;第四次 Time Base 中断时设置 COM1 输出 VSS,其它 COM 输出 VDD/2;……;第八次中断时设置 COM3 输出 VSS,其它 COM 输出 VDD/2。
由于点亮 LCD 像素点须要 COM 与 SEG 有大于饱和电压的电压差,也就是 COM 与 SEG 有+VDD 或者-VDD 的电压差,因此要点亮某个像素点,只要将对应的 SEG 输出与 COM 相反的电压便可。好比,当 COM0=VDD,只要 SEG=VSS 就可点亮对应像素点,当 COM0=VSS,只要 SEG=VDD 就可点亮对应像素点。考虑到 LCD 像素点点亮时先加+VDD 再加-VDD 可延长 LCD 的使用寿命,所以这里同一像素点也采用两次点亮的方式。
方式二
由上面所述咱们知道,只要 COM、SEG 的电压差为+VDD 或者-VDD 就能够点亮对应的 LCD笔段即像素点,所以,咱们也能够不用模拟 COM 的 Timing 便可完成 LCD 的正常驱动。具体实现步骤以下:
? 第一次中断时设置 COM0 输出 High,其它 COM 输出 VDD/2,再根据要显示的数据设置各个 SEG 的输出
? 第二次中断时设置 COM1 输出 High,其它 COM 输出 VDD/2,再根据要显示的数据设置各个 SEG 的输出
? 第三次中断时设置 COM2 输出 High,其它 COM 输出 VDD/2,再根据要显示的数据设置各个 SEG 的输出
? 第四次中断时设置 COM3 输出 High,其它 COM 输出 VDD/2,再次根据要显示的数据设置各个 SEG 的输出
? 第五次中断时设置 COM0 输出 Low,其它 COM 输出 VDD/2,再根据要显示的数据设置各个 SEG 的输出
? 第六次中断、第七次中断、第八次中断参考上面的方法依次设置 COM一、COM二、COM3输出 Low 并设置要显示的数据
? 循环进行以上的 8 次循环设置便可完成 LCD 的驱动 这种方式下 COM0~COM3 的 Timing 以下:
对比以上两种方法能够发现,COM 口的扫描频率也就是帖频率并无改变,然而从占用的资源上来讲,第二种方式比第一种方式会占用更少的 ROM 空间。
应用电路
能够根据实际使用状况取舍 COM 和增减 SEG,好比 LCD 能够是 1/2 Duty,那么只须要保留两个 COM 便可,SEG 一样能够参照范例程序扩展。
根据上述说明,分 8 次依次设置 COM0~COM3 的输出,SEG 是输出 VDD 仍是输出 VSS 须要根据要显示的数字判断,使用第一种驱动方式时 I/O 详细电位设置请参考下表:
<ignore_js_op>
这里也能够采用扫描的方式
结论
本范例驱动 4×8 LCD 显示正常,用户只须要稍加改造便可套用到所选用的 1/2 Bias 规格的LCD 上。
我使用的是第一种扫描方式,大体流程图以下,其中有些地方对的不怎么齐
post
代码中 COM4_SEG_SET_NOT(); 是 COM4_SEG_SET(); IO对应段取反所得 COM_L(4); 拉低 COM4口 其余相似 |
这里说明一点,我是先将 IO口电平输出再配置功能的,由于在实际操做过程当中会发现从高阻态转换至强推模式时会有 零点几微秒的脉冲干扰,具体宽度根据单片机速度来决定。
大概是由于单片机在从强推模式转换至高阻态时 IO配置虽被改变,但输出寄存器中的数据还会继续保持,因此才会有脉冲干扰的吧,先将 IO口输出电平改变再将 IO口状态从高阻切换至强推时就不会有脉冲干扰了
<ignore_js_op>
这是先配置 IO输出状态再修改输出电平的,后来想了下,寄存器中应该是保存了最后一次 IO输出的电平,因此从高阻态切换至强推后直接将输出相应的电平,等到再次配置 IO口输出的电平时这是才会改变,因此才会在开始的时候有一个低脉冲动画