数码管与矩阵键盘联合应用设计

发布者:心怀感恩最新更新时间:2018-01-21 来源: 互联网关键字:数码管  矩阵键盘  周立功 手机看文章 扫描二维码
随时随地手机看文章

周立功教授新书《面向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

51单片机基础之数码管(一)
原理: 数码管有8个LED灯,分别是abcdefgh,有共阴和共阳,给高低电平,对应的LED就会亮,然后显示想显示的数字。 代码: #include reg52.h #define SMG P0 //宏定义数码管 void main(void) { SMG=0x06; //相当于P0=0000 0110,显示数字一,这里要去了解一下数码管发光原理,说白了就是八个LED灯 while(1) { } } 运行结果: 数码管显示数字一
[单片机]
51单片机基础之<font color='red'>数码管</font>(一)
51单片机定时器程序超简单实现数码管24小时时钟显示
用74hc573实现数码管24小时时钟显示,对于74hc573芯片如果不了解可以看看文件里面的手册,不多说先上代码 /*以下程序是根据74hc573芯片的锁存器 **原理来写的 **若有不懂的地方可以看看文件夹的芯片 **手册或者百度*/ #include reg52.h typedef unsigned char u8; typedef unsigned int u16; //串口定义没什么好说的 sbit LSA = P2^2; sbit LSB = P2^3; sbit LSC = P2^4; u8 code mabiao ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
[单片机]
51单片机定时器程序超简单实现<font color='red'>数码管</font>24小时时钟显示
基于51单片机及ADC0808的数字电压表数码管汇编语言设计
前言 大家好,上一条博客写了关于基于51单片机以及ADC0808的数字电压表,但是采用的C语言,本章讲一下采用汇编语言来实现电压的测量,同样采用数码管显示。 硬件设计 该设计采用的MCU同样是51单片机,ADC也是采用的TI的ADC0808,显示部分采用4位数码管,最终的测试电压范围为0~5V,这次的精度提高到约为0.01V,仿真图如下: 右下方是模拟的输入电压 部分汇编代码如下: (代码详细备注,方便阅读) LED_0 EQU 30H ;百分位 LED_1 EQU 31H ;十分位 LED_2 EQU 32H ;个位 LED_3 EQU 33H ;
[单片机]
基于51单片机及ADC0808的数字电压表<font color='red'>数码管</font>汇编语言设计
数码管显示51单片机DS18B20温度测量源程序及仿真
这是一款数码管显示51单片机DS18B20温度测量源程序及仿真资料,特别适合单片机初学者学习参考,这款数码管显示51单片机DS18B20温度测量源程序使用模块化编程,方便移置,单片机使用AT89C51单片机,数码使用四位共阴数码管,这样简化了硬件电路,降低了硬件的制作难度。这款数码管显示51单片机DS18B20温度测量源程序是在Keil4环境下编译通过,并在Proteus7.8仿真软件下仿真通过。温度测量范围是:-55-125度。由于源程序直接贴出来会丢后些重要内容,所以特别将这款数码管显示51单片机DS18B20温度测量源程序及仿真资料打包后放在百度网盘上,需要的爱好者可以自己去下载。更多单片机源程序与仿真请到电子乐屋。 数
[单片机]
<font color='red'>数码管</font>显示51单片机DS18B20温度测量源程序及仿真
8051单片机实战分析(以STC89C52RC为例) | 05 - 静态数码管驱动
1 数码管介绍 数码管是给我们展示数据或者信息的电子器件,它是最原始以及成本比较低。以下是数码管的实物图: 1.1 数码管的段选与位选 以下是数码管的每一段所对应的位置: 从图可以看出来,数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的。注意 dp 这个段,它是表示一个小数点!我们看一下数码管内部结构的示意图: 数码管分为共阳和共阴两种: 共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。 同理共阳数码管就是阳极接在一起。 看到这里我们就不难猜出,所谓的
[单片机]
8051单片机实战分析(以STC89C52RC为例) | 05 - 静态<font color='red'>数码管</font>驱动
基于STM32F407最小系统板三种矩阵键盘实现方法
这里采用的八个端口为PA0-PA7。 此处先给出矩阵键盘的原理图: 一、八个端口采用开漏输出,配置上拉电阻,实现同51一样的双向IO口功能。 //按键初始化函数 void KEY_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_P
[单片机]
基于STM32F407最小系统板三种<font color='red'>矩阵键盘</font>实现方法
单片机控制数码管闪烁
数码管闪烁,利用一个布尔变量控制各数码管的显示值,为真(True)是赋对应的数值,为假(False)时熄灭,还是利用一定的时间间隔,在人眼的视觉暂留时间段内,快速的切换熄灭和点亮,可用下面的代码测试。 #include reg52.h sbit LATCH1=P2^2;//段锁存 sbit LATCH2=P2^3;//位锁存 unsigned char code DuanMa ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值01234567 unsigned char code WeiMa ={0xfe,0xfd,0xfb,0xf7,0xef,0
[单片机]
基于51单片机ADC0808自动数字电压表仿真数码管显示
硬件设计 该设计是基于51单片机,ADC采用TI公司的ADC0808,自动数字电压测量表,显示器采用4位数码管,测量范围为0.5~10V,精度约为0.02。 仿真图如下: 程序源码: #include reg52.h unsigned char code dispbitcode ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char dispbuf ; unsigned int i; unsigned int j; unsigned int getdata; unsigned int temp; unsigned int temp1;
[单片机]
基于51单片机ADC0808自动数字电压表仿真<font color='red'>数码管</font>显示
小广播
最新网络通信文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved