扫描法:以4*4 矩阵按键为例,将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是: 依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低, 则该列线与置为低电平的行线交叉处的按键就是闭合的按键。#include "reg52.h" #define uchar unsigned char #define uint unsigned int void Delay_1ms(uint i); uchar keyScan(void); void Main(void) { uchar keyValue; //存放键值,第一行的第一个为1第二行第一个为5,依次排列while(1) { P1 = 0xf0; if(P1 != 0xf0) //判断是否有键按下{ Delay_1ms(20); //消除键抖动if(P1 != 0xf0) //在此判断是否有键按下{ keyValue = keyScan(); //逐行扫描,判断是哪个按键按下} } //此处用于对不同键值做出不同反应} } uchar keyScan(void) { uchar temp,i,j,lineSelect[4]={0xef, 0xdf, 0xbf, 0x7f}; //数组用于线选for(j=0;j<4;j++) //循环四次用于四个行线依次拉低{ P1=lineSelect[j]; //每根行线依次拉低temp=1; for(i=0;i<4;i++) //循环四次用于判断哪列有键按下{ if(!(P1&temp)) //判断此列是否有键按下return (i+j*4); //返回键值,行 *4+ 列,行和列的交叉处temp<<=1; //将目标移为下一列} } } void Delay_1ms(uint i) //延时函数{ uchar x,j; for(j=0;j