最近在搞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、端口配置成输出

不同单片机不同