单片机系统中按键数量较多时,为减少I/O口占用,常把按钮排列成矩阵形式。矩阵式键盘中每条水平线和垂直线在交叉处不直接连通,而是通过一个按钮相连——一个端口(如P1口)即可组成4×4=16个按钮,比直接接法多出一倍,且线数越多优势越明显(再多一条线能组成20键,直接法则仅多1键)。因此键数较多时采用矩阵法合理。
矩阵结构比直接法复杂,识别也较复杂。上图中列线经电阻接正电源,行线接单片机的I/O口作输出,列线接的I/O口作输入。无键按下时所有输出端为高电平;行线输出低电平、一旦有键按下输入线即被拉低,通过读入输入线状态即可得知有键按下。
按钮识别——行扫描法(最常用的逐行/列扫描查询法):
①判断有无键按下:将全部行线Y0~Y3置低电平,检测列线状态,只要有一列电平为低则有键按下(闭合键位于低电平线与4根行线交叉的4个按钮中);所有列线均高则无键按下。
②确定闭合键位置:确认有键后,依次将某行线置低(其他行为高),再逐列检测列线电平,某列为低则该列线与该低行线交叉处即闭合键。
③去除键抖动:检测到键按下后延时再作下一步判断,并须去除键释放时的抖动以保证一次闭合仅处理一次。
示例:8031的P1口作键盘I/O,列线P1.0~P1.3接4个上拉电阻到+5V作输入,行线P1.4~P1.7作输出。检测时P1.4~P1.7输出全“0”、读P1.0~P1.3,若全“1”则无键闭合否则有;扫描时按四种组合依次使一行输出0(P1.4、P1.5、P1.6、P1.7依次为0),读取列线判断闭合键的行列值,再用计算法或查表法转换为键值。
文中给出完整键盘扫描汇编程序(SCAN:置P1=0FH检测是否有键、延时去抖、逐行扫描NEXT2、计算键值KCODE、等待键释放NEXT6等),详见附图。

