所有产品

全面剖析数码管与矩阵键盘联合使用法则

  数码管的位选引脚为PIO0_17 和PIO0_23,而矩阵键盘的列线,当数码管和矩阵键盘同时使用时,数码管的位选引脚和矩阵键盘的列线引脚是复用的,这是常见的硬件电路设计,可以达到节省引脚的目的。

  AMetal 提供了数码管和矩阵键盘联合使用的驱动,其本质上就是数码管驱动和矩阵键盘驱动的简单整合,避免了在多个实例信息中提供一些相同的信息,如数码管实例信息中的位选引脚在和矩阵键盘实例信息中的列线引脚是完全一样的。

  其中,scan_info 是am_digitron_scan_gpio_info_t 类型的数码管实例信息(GPIO 输出段码),其对应的定义仅与数码管相关信息有关,详见程序清单7.49,可以不作任何改动。

  在前面矩阵键盘实例信息的定义中,除am_key_matrix_base_info_t 类型的基础信息外,还包含p_pins_row 指定的行线引脚信息和p_pins_col 指定的列线引脚信息,但当数码管和矩阵键盘同时使用时,由于矩阵键盘的列线引脚与数码管的位选引脚是相同的,因此,无需再额外指定矩阵键盘的列线引脚,仅需使用p_pins_row 指定行线引脚即可,结合前面定义的数码管实例信息和矩阵键盘信息,可以定义MiniPort-View+MiniPort-Key 设备对应的实例信息如下:

  它将同时完成数码管和按键的初始化,当完成初始化后,可使用通用数码管接口和通用按键接口操作数码管和按键。基于模块化编程思想,将初始化相关的实例和实例信息等的定义存放到数码管的配置文件中,详见程序清单7.55 和程序清单7.56。

  后续只需使用无参数的实例初始化函数,即可执行以下语句完成MiniPort-View +MiniPort-Key 实例的初始化:

  唯一的不同,仅仅是数码管信息scan_info 成员的类型由am_digitron_scan_gpio_info_t变为了am_digitron_scan_hc595_gpio_info_t,其余的信息保存不变。因为它们硬件上的区别仅仅是一个使用GPIO 输出段码,一个使用595 输出段码,因此实例信息也仅仅是数码管信息存在一点差异。

  当完成初始化后,即可使用通用数码管和按键接口操作数码管和按键。基于模块化编程思想,将初始化相关的实例和实例信息等的定义存放到数码管的配置文件中,将相关内容新增到am_hwconf_miniport_view_key.c 文件中。与此同时,将实例初始化函数的声明新增到am_hwconf_miniport_view_key.h 文件中,详见程序清单7.57 和程序清单7.58。

  通过Miniport 系列配板在各种组合方式下的驱动介绍可知,MiniPort 系列配板可以非常灵活地搭配使用。对于用户来说,对于不同的搭配方式,只需要使用对应的实例初始化函数即可,无需关心底层细节,使用数码管和按键通用接口编程的应用程序可以始终保持不变。为了便于查询,表7.9 列出了MiniPort-View、MiniPort-Key 和MiniPort-595 配板在各种组合方式下应该使用的实例初始化函数。

  表7.9 中展示了共计5 种使用方式,每种方式对应一行,若配板相应的单元格内容为“●”,则表示在该种方式下会使用该配板,若仅选择了一个配板,则表示该方式仅单独使用该配板。

  当矩阵键盘和数码管扩大到一定数目时,将非常占用系统的I/O 资源,同时还需要配套软件执行按键的和数码管扫描,对CPU 资源的耗费也不可忽视。在实际应用中,可能不会用到全部的32 个按键或12 个数码管,可以根据实际情况裁剪。ZLG 设计了相应的MiniPort-ZLG72128 配板,可以直接与AM824-Core 连接使用,作为示例MiniPort-ZLG72128配板仅使用了2 个数码管和4 个按键(2 行2 列),当将MiniProt-ZLG72128 与AM824-Core连接时,其等效电路详见图7.2。

  数码管仅使用了两个,按键使用了第0 行和第3 行(功能按键),每行两列共计4 个按键,ZLG72128 与LPC824 的引脚连接详见表7.10。

  使用ZLG72128 时,虽然底层的驱动方式(I2C总线接口)与之前使用GPIO 驱动按键和数码管的方式是完全不同的,但由于AMetal 已经提供了ZLG72128 的驱动,对于用户来讲,可以忽略底层的差异性,直接使用通用键盘接口和通用数码管接口编写应用程序。

  ZLG 设计了相应的MiniPort-ZLG72128 配板,可以直接与AM824-Core 连接使用,在使用通用接口使用数码管和按键前,需要使用初始化函数完成设备实例的初始化操作。其函数(am_zlg72128_std.h)的原型为:

  实例信息主要描述了与ZLG72128、键盘和数码管等相关的信息,如按键对应的按键编码、数码管显示器的ID 等信息。其类型am_zlg72128_std_devinfo_t(am_zlg72128_std.h)的定义如下:

  其主要指定了与ZLG72128 相关联的引脚信息,其中,rst_pin 为复位引脚,若复位引脚未使用(固定为RC 上电复位电路,无需主控参与控制),则该值可设置为-1。use_int_pin表示是否使用ZLG72128 的中断输出引脚(KEY_INT),若该值为AM_TRUE,表明使用了中断引脚,此时int_pin 指定与主控制器(如LPC824)连接的引脚号,按键的键值将在引脚中断中获取;若该值为AM_FALSE,表明不使用中断引脚,此时interval_ms 指定查询键值的时间间隔,使用查询方式时,可以节省一个管脚资源,但也会额外耗费一定的CPU 资源。当使用AM824-Core 与MiniPort-ZLG72128 连接时,其相应的引脚连接详见表7.10,基于此,各成员可以分别赋值为:PIO0_6,AM_TRUE、PIO0_1、0。id_info 是仅包含显示器ID 号的标准数码管设备的信息,其类型定义(am_digitron_dev.h)如下:

  在前面的驱动配置中,将MiniPort-View 对应的ID 号设置为0,在这里,如果MiniPort-ZLG72128 不会与MiniPort-View 同时使用,可以将ID 也设置为0,如此一来,使用MiniPort-ZLG72128 可以直接替换MiniPort-View 配板作为新的显示器,但应用程序无需作任何改变,同样可以继续使用ID 为0 的显示器。blink_on_time 和blink_off_time 分别指定了数码管闪烁时,数码管点亮的时间和熄灭的时间,以此可以达到调节闪烁效果的作用。通常情况下,数码管以1Hz 频率闪烁,点亮和熄灭的时间分别设置为500ms。

  p_key_codes 指向存放矩阵键盘各按键对应编码的数组,其编码数目与实际使用的按键数目一致,MiniPort-ZLG72128 共计2×2 个按键。

  基于实例、实例信息和I2C句柄,可以完成MiniPort-ZLG72128 的初始化。比如:

  当完成初始化后,即可使用通用的数码管接口和通用的按键处理接口。由于标准按键处理接口中,并没有将按键按照普通按键和功能按键进行区分,因此ZLG72128 对应的第3 行功能按键也会当作一般按键处理,其按键按下和释放均会触发执行相应的按键处理函数。此外,由于ZLG72128 不会上报普通按键的释放事件,因此当普通按键释放时,不会触发相应的按键处理函数。为了便于配置矩阵键盘(修改实例信息)。基于模块化编程思想,将初始化相关的实例、实例信息等的定义存放到相应的配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.59 和程序清单7.60。

  后续只需要使用无参数的实例初始化函数即可完成MiniPort-ZLG72128 实例的初始化,即执行如下语句:

  由于在配置信息中,将按键编码和数码管ID 号设置与MiniPort-Key 和Miport-View 一样,因此可以直接使用MiniPort-ZLG72128 替换MiniPort-Key 和MiniPort-View,应用程序无需作任何修改。比如,可以使用之前编写的按键应用程序和数码管应用程序测试按键和数码管,详见程序清单7.61。

  此前,使用自定义的数码管、LED、温度等接口实现了一个简易的温控器,现在将对其进行升级,全部使用通用接口实现。修改较为容易,基本逻辑保持不变,仅仅将其中的非通用接口修改为使用通用接口实现,详见程序清单7.62。

  由于使用通用接口时,数码管、按键均会自动扫描,无需每隔一定的时间定时扫描一次,因此主程序中没有再执行数码管和按键扫描的语句。