| |
S
Ø矩阵式键盘一般适用于按键数量较多的场合,它由行线和列线组成,按键位于行、列的交叉点上。
Ø如图所示,一个4×4的行、列结构可以构成一个有16个按键的键盘。
矩阵式键盘原理
Ø按键设置在行、列交叉点上,行、列分别连接到按键开关的两端。行线通过上拉电阻接到十5 V上。
Ø平时无按键动作时,行线处于高电平状态;而当有健按下时,行线电平状态将由通过此按键的列线电平决定:列线电平如果为低,行线电平为低;列线电平如果为高,则行线电平亦为高。这一点是识别矩阵式键盘是否被按下的关键所在。
矩阵式键盘原理
Ø矩阵键盘按键的识别方法分两步进行:
Ø①识别键盘哪一行的键被按下。让所有列线均为低电平,检查各行线电平是否为低。如果有行线为低,则说明该行有键被按下,否则说明无键被按下。
Ø②如果某行有键被按下,识别键盘哪一列的键被按下(亦称之为扫描法)。逐列置低电平,并置其余各列为高电平.检查各行线电平的变化。如果行电平变为低电平,则可确定此行此列交叉点处按键被按下。
S
ØS
ØPortA(GPA):32 个输入/输出端口
ØPortB(GPB):11 个输入/输出端口
ØPortC(GPC):16 个输入/输出端口
ØPortD(GPD):16 个输入/输出端口
ØPortE(GPE):16 个输入/输出端口
ØPortF(GPF):8 个输入/输出端口
ØPortG(GPG):16 个输入/输出端口
ØPortH(GPH):11 个输入/输出端口
Ø端口控制说明
Ø端口配置寄存器(GPACON――GPHCON)
大部分的引脚是复用的,所以必须对于每个引脚要求定义一个功能,端口配置寄存器定义了每个引脚的功能。
Ø端口数据寄存器(GPADAT――GPHDAT)
如果端口配置成输出端口,数据能够被写到端口数据寄存器的对应位,然后通过管脚输出。如果端口配置成输入端口,能从端口数据寄存器对应的位中读出管脚上的电平
Ø端口上拉寄存器(GPBUP――GPHUP)
端口上拉寄存器控制着每个端口组的上拉寄存器的使能或禁止,当对应位为0,这个引脚的上拉寄存器是允许的,当为1 时,上拉寄存器是禁止的。
MIZI提供的S
Ø使用一个32位的数来表示端口的使用情况。
Ø模式 |上拉 |端口 | 端口引脚
ØMODE | PULLUP | PORT | OFS
Ø不需要自己手动组合,通过宏定义以及SHIFT和MASK组合。见程序
Ø端口的表示
Ø#define PORTA_OFS 0
Ø#define PORTB_OFS 1
Ø#define PORTC_OFS 2
Ø#define PORTD_OFS 3
Ø#define PORTE_OFS 4
Ø#define PORTF_OFS 5
Ø#define PORTG_OFS 6
Ø#define PORTH_OFS 7
Ø端口引脚的表示
Ø#define GPIO_A0 MAKE_GPIO_NUM(PORTA_OFS, 0)
Ø#define GPIO_A1 MAKE_GPIO_NUM(PORTA_OFS, 1)
Ø#define GPIO_A2 MAKE_GPIO_NUM(PORTA_OFS, 2)
Ø#define GPIO_A3 MAKE_GPIO_NUM(PORTA_OFS, 3)
Ø。。。
Ø#define MAKE_GPIO_NUM(p, o) ((p << GPIO_PORT_SHIFTT) | (o << GPIO_OFS_SHIFT))
Øset_gpio_ctrl(x)
Ø功能:配置端口引脚的功能,设置IO口控制寄存器和上拉寄存器
Ø用法:set_gpio_ctrl(模式|上拉?|IO脚)
Ø模式|是否上拉|IO脚,在S
Ø
Øset_gpio_ctrl(GPIO_E11 | GPIO_PULLUP_DIS |GPIO_MODE_OUT);
MIZI提供的S
Øwrite_gpio_bit(x, v)
Ø功能:把端口 对应的端口数据寄存器x位设置为v
Øwrite_gpio_bit(GPIO_E11, 0);
Øread_gpio_bit(x)
Ø功能:把端口数据寄存器x位的状态 读入,函数返回值既是其状态
Øread_gpio_bit(GPIO_G11);
MIZI提供的S
Øwrite_gpio_reg(x, v)
Ø功能:把端口数据寄存器x 设置为v
Øread_gpio_reg(x)
Ø功能:读取端口数据寄存器x,函数返回值既是其数据
键盘的硬件实现
Ø4X4 矩阵键盘
Ø四个输入引脚:
Ø EINT0 -----( GPF0 )----INPUT
Ø EINT2 -----( GPF2 )----INPUT
Ø EINT11-----( GPG3 )----INPUT
Ø EINT19-----( GPG11 )----INPUT