矩阵式键盘程序设计(1)定义字型码表和10ms延时程序设计。4X4矩阵键盘的16个键分别对应0~9、A~F十六个字符,由于数码管显示使用共阴极LED数码管,所以字型码采用共阴极字型码。定义字型码表和软件去抖的10ms延时程序如下:#includeAT89X52.H/*定义0~9,A~F十六个字符的字型码表*/unsignedchartable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};/*10ms延时程序*/voiddelay10ms(void){unsignedchari,j;for(i=20;i0;i--)for(j=248;j0;j--);}(2)矩阵式键盘主程序设计。4X4矩阵键盘的各行接P0口的P0.0~P0.3,矩阵键盘的各列接P0口的P0.4~P0.7,P1口的P1.0~P1.7接数码管的各段。矩阵式键盘主程序如下:voidmain(){chark=0;unsignedchartmp,key;P1=0x00;P0=0x0f;//P0口低四位做输入口,先输出全1tmp=P0;while(1){while(tmp==0x0f)//循环判断是否有键按下{P0=0x0f;//所有列输出低电平tmp=P0;//读行信号}delay10ms();//延时10ms去抖P0=0x0f;//所有列输出低电平tmp=P0;//再次读键盘状态if(tmp==0x0f)continue;//如果无键按下则认为是按键抖动,重新扫描键盘key=scan_key();//有键按下,调用键盘扫描程序,并把键值送keywhile(k!=-1){delay10ms();k=scan_key();}P1=table[key];//查表或字型编码送P1口,数码管显示闭合按键的编码}(3)矩阵式键盘扫描程序设计unsignedcharscan_key(void)//键盘扫描子程序{unsignedcharn,scan,col,rol,tmp;bitflag=0;//设有键按下标志位scan=0xef;P0=0x0f;//P0口低四位做输入口,先输出全1for(n=0;n4;n++)//循环扫描4列,从0列开始{P0=scan;//逐列送出低电平tmp=~P0;//读行值,并取反tmp=tmp&0x0f;col=n;//保存列号到colflag=1;/*判断哪一行有键按下,并保存行号到rol*/if(tmp==0x01){rol=0;break;}//第0行有键按下elseif(tmp==0x02){rol=1;break;}//第1行有键按下elseif(tmp==0x04){rol=2;break;}//第2行有键按下elseif(tmp==0x08){rol=3;break;}//第3行有键按下elseflag=0;scan=(scan1)+1;}if(flag==0)return-1;elsereturn(rol*4+col);}