最近在搞LCD,刚好用到1622/1621驱动芯片,网上看了很多,但是实际中还是有很多问题,比如不够说得有点模棱两可,或者比较专用,而且遇到的一些坑也没有详细记录,所以写个笔记记录一下。
一、硬件部分
1、含LCD驱动的单片机
LCD可以直接用单片机或者ic来驱动,但是首先要看的是单片机是否有LCD驱动这个模块,如果没有的话是不能直接把端口连在LCD上,通过端口拉高和拉低来操作LCD,因为LCD的引脚拉高或拉低不是立刻的,而是一个上升和下降的过程。比如复旦微的一款FM33LG048就支持LCD驱动。
编辑
2、不含LCD驱动的单片机
还有单片机没有这一个模块,这个时候就需要对每个引脚进行处理或者使用驱动ic,每个引脚单独处理这方面未涉及,所以选的是驱动ic的方式。
3、驱动ic选型
找厂商定制LCD或者是从外面买的现成的LCD,在硬件层面,有几个参数需要注意,一个是供电电压还有一个是偏压和占空比。
这里也是容易忽略的地方
。
1)两种LCD对比
下面是两种LCD 1、LCD1

编辑
2、LCD2

编辑
常见的LCD驱动有1622和1621,先对比一下相关的手册:
2)两种驱动芯片对比
1)1621

编辑
2)1622

编辑
3)驱动芯片选型
根据上述LCD的偏置和占空比,可以迅速进行选型:
- LCD1 选择 1621
- LCD2 选择 1622
注意:
选型错误可能导致亮度过低和可视角偏移。例如,正常情况下可视角范围为 -45° 到 45°,但使用错误的芯片可能会变为 0° 到 90°,这时需要将LCD抬高或倾斜才能清晰查看。
4、驱动ic外设电路
这里以1621为例,下图为推荐电路
编辑
这里只需考虑两个方面:首先,除了将CS、RD和WR三根线连接到单片机外,还需要关注VLCD的上拉电阻VR,这与对比度有关。当VR为0V时,对比度达到最大;增大电阻会导致对比度降低。 如果对比度最大,即使不驱动,LCD屏幕上可能会显示所有内容;而对比度过低时,即使驱动LCD,屏幕也可能没有任何显示。 因此,VR部分需要进行调节。例如,在单片机未运行程序的情况下,给整板上电,先将VR短接,观察显示效果(某些LCD在VR短接时,即使对比度最大,也可能不会全显示)。如果屏幕全显示,则可以使用变阻箱逐渐增大VR,直到屏幕的显示刚好消失为止。下图为电路示例。
编辑
二、软件部分
1、前期准备:端口处理函数
// 设置指定位置的位为1
#define setb(p, x) (p |= (1 << (x)))
// 清除指定位置的位(设置为0)
#define clrb(p, x) (p &= ~(1 << (x)))
// 获取指定位置的位值(返回1或0)
#define getb(p, x) (p & (1 << (x)))
// 切换指定位置的位(0变1,1变0)
#define toggleb(p, x) ((p) ^= (1 << (x)))2、端口配置成输出
不同单片机不同