简介 HT66Fx0 内建有 R-Type LCD 功能,提供 1/2 bias、4 个 COM 的驱动能力,本文以 HT66F40 为母体,说明共用 I/O Pin 来驱动 LCD、LED、KEY 的使用方法。 工作原理 我们知道在微观上电子器件都是基于分时扫描的原理来驱动各个功能模块的,那么只要我 们分时来驱动 LCD、LED、扫描按键,就可以实现分时共用 I/O 的目的。 根据标准 1/2 bias、1/4 duty COM 的驱动波形,考虑下面的分时时序: 在 T0~T7 时间片来驱动 LCD,在 T8 时间片扫描按键,在 T9 时间片驱动 LED。 首先来看 LCD,根据 LCD 的驱动原理可知,LCD 像素点上只能加上 AC 电压,LCD 显示 器的对比度由 COM 脚上的电压值减去 SEG 脚上的电压值决定,这个电压差的大小也决定 了 LCD 像素点的打开与关闭。LCD 型 MCU 已经由内建的 LCD 驱动电路自动产生 LCD 驱 动信号,因此只要 I/O 口能仿真输出该驱动信号,就能完成 LCD 的驱动。
由于 LCD 工作的最佳频率通常在 25Hz~250Hz,当 HT66F40 系统频率为 IRC 4MHz 且 Time Base 输入频率等于 fSYS/4 时 Time Base 中设置溢出时间为 2.048ms,以此为时基,1/4 Duty 时的帧周期为 2.048 ms * 10 = 20.48 ms,即 1000/ 20.48 =48.12Hz。 符合要求。 当然,也可以设置 Time Base 为其它的溢出时间,可根据具体应用设置,都能符合要求。但 需要注意,系统频率不适宜为 FL,因系统频率太慢,无法让扫瞄达到视觉暂留的时间,从 而导致 LCD 出现闪烁现象。另外,当 Time Base 设置为其它溢出时间时,扫描频率会更快, 可以增强 LED 的亮度。 HT66F40 内部提供了 4 COM 的输出,通过设置 SCOMC 寄存器即可使 PC0、PC1、PC6 和 PC7 输出 VDD/2 电位,外部不需要再连接分压电阻器件,内部电路和设置方式如下:
SCOM 电路 输出控制 另外,不同的 LCD 面板需要的驱动电流可能不尽相同,为更好驱动不同的 LCD 面板,MCU 内部还提供有四种规格的驱动电流,用户可通过软件设置 ISEL1、ISEL0 (SCOMC.6/5) 位来选择合适的 LCD 驱动电流,具体设置如下: ISEL1、ISEL0 = 00: 25μA 01: 50μA 10: 100μA 11: 200μA 注意上述电流参数的条件是 VDD=5V,具体数据请参考 DataSheet。
因此在一个 COM 周期内,只要每隔 2.048ms 分时设置 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;……;第八次 Time Base 溢出时设置 COM3 输出 VSS,其它 COM 输出 VDD/2;第九次中断时扫描按键,第十次中 断时设置 LED 输出。 因为点亮 LCD 像素点需要 COM 与 SEG 有大于饱和电压的电压差,也就是 COM 与SEG 有 +VDD 或者-VDD 的电压差,所以要点亮某个像素点只要将对应的 SEG 输出与 COM 相反 的电压即可,比如,当 COM0=VDD,只要 SEG=VSS 就可点亮对应像素点,当 COM0=VSS, 只要 SEG=VDD 就可点亮对应像素点。 另外我们由应用范例 HA0168S 知道,LCD 的驱动还可以采用一种相对更直接的方法,这种 情况下我们就可以采用如下的分时步骤:
(1)第一次溢出时设置 COM0 输出 High,其它 COM 输出 VDD/2,再根据要显示的数据设置 各个 SEG 的输出。 (2)第二次溢出时设置 COM1 输出 High,其它 COM 输出 VDD/2,再根据要显示的数据设置 各个 SEG 的输出。 (3)第三次溢出时、第四次中断时按照上面的方法依次设置 COM2、COM3 的输出 High 并 设置要显示的数据。 (4)第五次溢出时设置 COM0 输出 Low,其它 COM 输出 VDD/2,再根据要显示的数据 设置各个 SEG 的输出。 (5)第六次溢出、第七次溢出、第八次溢出参考步骤(4)的方法依次设置 COM1、COM2、COM3 输出 Low 并设置要显示的数据。 (6)第九次溢出时扫描按键。 (7) 第十次溢出时点亮 LED。
这种方式下的时序如下: 用户可以根据上面的时序自行修改
应用电路
电路说明 可以通过减小 LED 上的限流电阻或者 S/W 增大扫描频率来控制 LED 的亮度,但限流电阻 不能小于 120Ω,否则会影响到按键的灵敏度,建议以 S/W 增大扫描频率来控制 LED 亮度 为佳。 为尽量减少同时有多个 key 按下时对 LCD 显示的影响,按键上串接的电阻不能小于 2.2kΩ, 但不能超过 4kΩ,否则将会降低按键的灵敏度。
程序说明 本范例程序采用 4 * 8 段式 LCD,循环显示 000~999 的数字,间隔约 0.512 秒,有按键时 LCD 最右一个字符显示按键的序列号,同时也通过点亮 LED 来显示按键的序列号。程序中 display_num0、display_num1、display_num2 用于存放要显示的数字,display_num3 存放按 下按键的序列号。用户可以根据实际使用情况取舍 COM 和增减 SEG,比如 LCD 可以是 1/3 duty,那么只需要保留三个 COM 即可,SEG 同样可以参照范例程序扩展。 根据上述说明,分 8 次依次设置 COM0~COM3 的输出,SEG 是输出 VDD 还是输出 VSS 需要根据要显示的数字判断,使用第一种驱动方式时 I/O 详细电位设置请参考下表:
结论
本范例驱动 4 * 8 LCD 显示正常、按键扫描正常、LED 点亮正常,用户只需要稍加改造即 可套用到所选用的 1/2 bias 规格的 LCD 上。
|