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 />