51、52单片机使用矩阵键盘

为了学习矩阵键盘,先做个小小的实验目标 : 按下矩阵键盘后 ,数码管显示按下的是第几键。

我的矩阵键盘是4X4的,操作原理是先检测按下的键是哪行。再确定是哪列。这样就能识别是按的哪个键了。

首先看电路图,确定键盘是连CPU的哪个针。我的开发板上是连接的P1,具体是P10~P17,八个针对应逻辑的8位。

(此处省略,直接贴代码)

#include<reg52.h><br />void delay(int n);<br />void juzhen(void);<br />char duanxuan[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,<br />0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};<br />char keyveluetonumber[17]={0X0,0x77,0x7B,0X7D,0X7E,0XB7,0XBB,0XBD,0XBE,<br />0XD7,0XDB,0XDD,0XDE,0XE7,0XEB,0XED,0XEE};<br />int keyvelue=0;<br /><br />int main(){<br />int j=0;     <br />      P2=0XFF;<br />while(1){<br />      juzhen();<br />      P0=duanxuan[keyvelue];           <br />      }<br />}<br /><br /><br />void juzhen(void){<br />int a=0,i;<br />char tempkey;<br />P1=0xf0;<br />if(P1!=0Xf0){<br />delay(10);<br />if(P1!=0Xf0){<br />        tempkey=P1;<br />         P1=0X0f;<br />        tempkey|=P1;<br /><br />for(i=1;i<=16;i++){      /*下面switch的优化代码  */<br />            if(keyveluetonumber[i]==tempkey) {<br />             keyvelue=i ;<br />break;<br />            }   <br />        }<br />/* switch(tempkey){  //这个switch的对应关系更直观,但这么编程太2了,<br />                        所以用数组提前把下标和元素做好映射,直接查询即可。<br />                        不省时间,但省程序员的精力。<br />    <br />    case 0x77 :  keyvelue=1;break;<br />    case 0x7B :  keyvelue=2;break;<br />    case 0X7D :  keyvelue=3;break;<br />    case 0X7E :  keyvelue=4;break;<br />    case 0XB7 :  keyvelue=5;break;<br />    case 0XBB :  keyvelue=6;break;<br />    case 0XBD :  keyvelue=7;break;<br />    case 0XBE :  keyvelue=8;break;<br />    case 0XD7 :  keyvelue=9;break;<br />    case 0XDB :  keyvelue=10;break;<br />    case 0XDD :  keyvelue=11;break;<br />    case 0XDE :  keyvelue=12;break;<br />    case 0XE7 :  keyvelue=13;break;<br />    case 0XEB :  keyvelue=14;break;<br />    case 0XED :  keyvelue=15;break;<br />    case 0XEE :  keyvelue=16;break;<br />    }   <br /> */<br /><br />    }<br /><br />}<br /><br /><br />return ;<br />}<br />void delay(int n){ //简陋的延时函数<br />int i;<br />while(n--)<br />for(i=110;i>0;i--);<br />}<br /><br />