周立功教授新书《面向AMetal框架与接口的编程(上)》,对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。
第七章为面向通用接口的编程,本文内容为7.7 数码管与矩阵键盘联合使用、7.8 ZLG72128——数码管与键盘管理、7.9 温控器。
7.7 数码管与矩阵键盘联合使用
数码管的位选引脚为PIO0_17 和PIO0_23,而矩阵键盘的列线引脚同样为PIO0_17 和PIO0_23,当数码管和矩阵键盘同时使用时,数码管的位选引脚和矩阵键盘的列线引脚是复用的,这是常见的硬件电路设计,可以达到节省引脚的目的。
AMetal 提供了数码管和矩阵键盘联合使用的驱动,其本质上就是数码管驱动和矩阵键盘驱动的简单整合,避免了在多个实例信息中提供一些相同的信息,如数码管实例信息中的位选引脚在和矩阵键盘实例信息中的列线引脚是完全一样的。
由于存在两种数码管驱动:GPIO 输出段码,对应MiniPort-View 单独使用;HC595 输出段码,对应MiniPort-View + MiniPort-595。当与矩阵键盘联合使用时,也存在对应的两种情况:GPIO 输出段码的数码管和矩阵键盘联合使用,对应MiniPort-View + MiniPort-Key;HC595 输出段码的数码管和矩阵键盘联合使用,对应MiniPort-View + MiniPort-595 +MiniPort-Key。
>>> 7.7.1 数码管、键盘与I/O 驱动
当MiniPort-View 和MiniPort-Key 两块配板联合使用时,对应的驱动初始化函数原型(am_miniport_view_key.h)为:
p_dev 为指向am_miniport_view_key_dev_t 类型实例的指针;
p_info 为指向am_miniport_view_key_info_t 类型实例信息的指针。
1. 实例
am_miniport_view_key_dev_t 类型(am_miniport_view_key.h)实例的定义如下:
其中,miniport_view_key 为用户自定义的实例,其地址作为p_dev 的实参传递。
2. 实例信息
描述与数码管、矩阵键盘相关的实例信息的类型am_miniport_view_key_info_t 的定义(am_miniport_view_key.h)如下:
其中,scan_info 是am_digitron_scan_gpio_info_t 类型的数码管实例信息(GPIO 输出段码),其对应的定义仅与数码管相关信息有关,详见程序清单7.49,可以不作任何改动。
key_info 是am_key_matrix_base_info_t 类型的矩阵键盘的基础信息,在矩阵键盘的实例信息中有定义,详见程序清单7.35。
在前面矩阵键盘实例信息的定义中,除am_key_matrix_base_info_t 类型的基础信息外,还包含p_pins_row 指定的行线引脚信息和p_pins_col 指定的列线引脚信息,但当数码管和矩阵键盘同时使用时,由于矩阵键盘的列线引脚与数码管的位选引脚是相同的,因此,无需再额外指定矩阵键盘的列线引脚,仅需使用p_pins_row 指定行线引脚即可,结合前面定义的数码管实例信息和矩阵键盘信息,可以定义MiniPort-View+MiniPort-Key 设备对应的实例信息如下:
基于实例、实例信息,即可完成数码管实例的初始化:
它将同时完成数码管和按键的初始化,当完成初始化后,可使用通用数码管接口和通用按键接口操作数码管和按键。基于模块化编程思想,将初始化相关的实例和实例信息等的定义存放到数码管的配置文件中,详见程序清单7.55 和程序清单7.56。
程序清单7.55 数码管、按键联合使用实例初始化函数实现(am_hwconf_miniport_view_key.c)
程序清单7.56 数码管、按键联合使用实例初始化函数声明(am_hwconf_miniport_view_key.h)
后续只需使用无参数的实例初始化函数,即可执行以下语句完成MiniPort-View +MiniPort-Key 实例的初始化:
当完成初始化后,可使用通用数码管接口和通用按键接口操作数码管和按键。
>>> 7.7.2 数码管、键盘与HC595 驱动
当MiniPort-View、MiniPort-Key 和MiniPort-595 三块配板联合使用时,对应的驱动初始化函数原型(am_miniport_view_key_595.h)为:
p_dev 为指向am_miniport_view_key_595_dev_t 类型实例的指针;
p_info 为指向am_miniport_view_key_595_info_t 类型实例信息的指针。
1. 实例
am_miniport_view_key_595_dev_t 类型(am_miniport_view_key_595.h)实例定义如下:
其中,miniport_view_key_595 为用户自定义的实例,其地址作为p_dev 的实参传递。
2. 实例信息
描述与数码管和矩阵键盘相关的实例信息的类型am_miniport_view_key_595_info_t 的定义(am_miniport_view_key_595.h)如下:
唯一的不同,仅仅是数码管信息scan_info 成员的类型由am_digitron_scan_gpio_info_t变为了am_digitron_scan_hc595_gpio_info_t,其余的信息保存不变。因为它们硬件上的区别仅仅是一个使用GPIO 输出段码,一个使用595 输出段码,因此实例信息也仅仅是数码管信息存在一点差异。
结合前面定义的数码管和矩阵键盘实例信息,定义MiniPort-View + MiniPort-Key +MiniPort-595 设备对应的实例信息如下:
3. HC595 句柄handle
若使用Miniport-595 输出码段,则应通过MiniPort-595 的实例初始化函数获得HC595的句柄。即:
HC595 句柄即可直接作为handle 的实参传递。
基于实例、实例信息和HC595 句柄,即可完成MiniPort-View + MiniPort-Key +MiniPort-595 设备实例的初始化。比如:
当完成初始化后,即可使用通用数码管和按键接口操作数码管和按键。基于模块化编程思想,将初始化相关的实例和实例信息等的定义存放到数码管的配置文件中,将相关内容新增到am_hwconf_miniport_view_key.c 文件中。与此同时,将实例初始化函数的声明新增到am_hwconf_miniport_view_key.h 文件中,详见程序清单7.57 和程序清单7.58。
程序清单7.57 实例初始化函数实现(am_hwconf_miniport_view_key.c)
程序清单7.58 am_hwconf_miniport_view_key.h 文件更新
后续只需使用无参数的实例初始化函数,即可执行以下语句完成MiniPort-View +MiniPort-Key + MiniPort-595 设备实例的初始化:
当完成初始化后,即可使用通用数码管和按键接口操作数码管和按键。
通过Miniport 系列配板在各种组合方式下的驱动介绍可知,MiniPort 系列配板可以非常灵活地搭配使用。对于用户来说,对于不同的搭配方式,只需要使用对应的实例初始化函数即可,无需关心底层细节,使用数码管和按键通用接口编程的应用程序可以始终保持不变。为了便于查询,表7.9 列出了MiniPort-View、MiniPort-Key 和MiniPort-595 配板在各种组合方式下应该使用的实例初始化函数。
表7.9 各种组合方式下应该使用的实例初始化函数
表7.9 中展示了共计5 种使用方式,每种方式对应一行,若配板相应的单元格内容为“●”,则表示在该种方式下会使用该配板,若仅选择了一个配板,则表示该方式仅单独使用该配板。
7.8 ZLG72128——数码管与键盘管理
>>> 7.8.1 ZLG72128 简介
当矩阵键盘和数码管扩大到一定数目时,将非常占用系统的I/O 资源,同时还需要配套软件执行按键的和数码管扫描,对CPU 资源的耗费也不可忽视。在实际应用中,可能不会用到全部的32 个按键或12 个数码管,可以根据实际情况裁剪。ZLG 设计了相应的MiniPort-ZLG72128 配板,可以直接与AM824-Core 连接使用,作为示例MiniPort-ZLG72128配板仅使用了2 个数码管和4 个按键(2 行2 列),当将MiniProt-ZLG72128 与AM824-Core连接时,其等效电路详见图7.2。
图7.2 MiniPort-ZLG72128 电路图
数码管仅使用了两个,按键使用了第0 行和第3 行(功能按键),每行两列共计4 个按键,ZLG72128 与LPC824 的引脚连接详见表7.10。
表7.10 ZLG72128 与LPC824 的引脚连接
>>> 7.8.2 ZLG72128 驱动
使用ZLG72128 时,虽然底层的驱动方式(I2C 总线接口)与之前使用GPIO 驱动按键和数码管的方式是完全不同的,但由于AMetal 已经提供了ZLG72128 的驱动,对于用户来讲,可以忽略底层的差异性,直接使用通用键盘接口和通用数码管接口编写应用程序。
ZLG 设计了相应的MiniPort-ZLG72128 配板,可以直接与AM824-Core 连接使用,在使用通用接口使用数码管和按键前,需要使用初始化函数完成设备实例的初始化操作。其函数(am_zlg72128_std.h)的原型为:
该函数用于将ZLG72128 初始化为标准的数码管和按键功能,初始化完成后,即可使用通用的按键和数码管接口操作数码管和按键。p_dev 为指向am_zlg72128_std_dev_t 类型实例的指针,p_info 为指向am_zlg72128_std_devinfo_t 类型实例信息的指针,i2c_handle 为与ZLG72128 通信的I2C 实例句柄。
(1)实例
定义am_zlg72128_std_dev_t 类型(am_zlg72128_std.h)实例如下:
其中,g_miniport_zlg72128 为用户自定义的实例,其地址作为p_dev 的实参传递。
(2)实例信息
实例信息主要描述了与ZLG72128、键盘和数码管等相关的信息,如按键对应的按键编码、数码管显示器的ID 等信息。其类型am_zlg72128_std_devinfo_t(am_zlg72128_std.h)的定义如下:
base_info 是ZLG72128 的基础信息,其类型(am_zlg72128.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。
key_use_row_flags 标志指定使用了哪些行,ZLG72128 最多可以支持4 行按键,分别对应COM8~COM11。该值由表7.11 所示的宏值组成,使用多行时应将多个宏值相“或”。对于MiniPort-ZLG72128,其使用了第0 行和第3 行,因此key_use_row_flags 的值为:
AM_ZLG72128_STD_KEY_ROW_0| AM_ZLG72128_STD_KEY_ROW_3
表7.11 行使用宏标志
key_use_col_flags 标志指定使用了哪些列,ZLG72128 最多可以支持8 列按键,分别对应COM0 ~ COM7。该值由表7.12 所示的宏值组成,使用多列时应将多个宏值相“或”。对于MiniPort-ZLG72128,其使用了第0 列和第1 列,因此key_use_col_flags 的值为:
AM_ZLG72128_STD_KEY_COL_0 | AM_ZLG72128_STD_KEY_COL_1
表7.12 列使用宏标志
p_key_codes 指向存放矩阵键盘各按键对应编码的数组,其编码数目与实际使用的按键数目一致,MiniPort-ZLG72128 共计2×2 个按键。
在配置MiniPort-key 时,将MiniPort-key 对应的按键编码设置为KEY0 ~ KEY3。如果MiniPort-ZLG72128 与MiniPort-Key不同时使用,则将MiniPort-ZLG72128 对应的按键编码也设置为KEY0~KEY3,使用MiniPort-ZLG72128 替换MiniPort-Key 配板,但应用程序无需作任何改变。num_digitron 指定了数码管的个数,MiniPort-ZLG72128 仅使用了2 个数码管,因此num_digitron 的值为2。基于以上信息,实例信息可以定义如下:
(3)I2C 句柄i2c_handle
若使用LPC824 的I2C1 与ZLG72128 通信,则I2C 句柄可以通过LPC82x 的I2C1 实例初始化函数am_lpc82x_i2c1_inst_init()获得。即:
获得的I2C 句柄即可直接作为i2c_handle 的实参传递。
基于实例、实例信息和I2C 句柄,可以完成MiniPort-ZLG72128 的初始化。比如:
当完成初始化后,即可使用通用的数码管接口和通用的按键处理接口。由于标准按键处理接口中,并没有将按键按照普通按键和功能按键进行区分,因此ZLG72128 对应的第3 行功能按键也会当作一般按键处理,其按键按下和释放均会触发执行相应的按键处理函数。此外,由于ZLG72128 不会上报普通按键的释放事件,因此当普通按键释放时,不会触发相应的按键处理函数。为了便于配置矩阵键盘(修改实例信息)。基于模块化编程思想,将初始化相关的实例、实例信息等的定义存放到相应的配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.59 和程序清单7.60。
程序清单7.59 独立键盘实例初始化函数实现(am_hwconf_miniport_zlg72128.c)
程序清单7.60 独立键盘实例初始化函数声明(am_hwconf_miniport_zlg72128.h)
后续只需要使用无参数的实例初始化函数即可完成MiniPort-ZLG72128 实例的初始化,即执行如下语句:
由于在配置信息中,将按键编码和数码管ID 号设置与MiniPort-Key 和Miport-View 一样,因此可以直接使用MiniPort-ZLG72128 替换MiniPort-Key 和MiniPort-View,应用程序无需作任何修改。比如,可以使用之前编写的按键应用程序和数码管应用程序测试按键和数码管,详见程序清单7.61。
程序清单7.61 运行按键和数码管应用程序的主程序
由此可见,应用程序无需作任何修改。
7.9 温控器
此前,使用自定义的数码管、LED、温度等接口实现了一个简易的温控器,现在将对其进行升级,全部使用通用接口实现。修改较为容易,基本逻辑保持不变,仅仅将其中的非通用接口修改为使用通用接口实现,详见程序清单7.62。
程序清单7.62 使用通用接口实现温控器代码
由于使用通用接口时,数码管、按键均会自动扫描,无需每隔一定的时间定时扫描一次,因此主程序中没有再执行数码管和按键扫描的语句。
上一篇:用一部普通FM收音机,制作“窃听器”无线话筒
下一篇:机器学习的含义、术语、以及重要性的解析
推荐阅读最新更新时间:2024-05-07 17:51