51单片机矩阵式键盘扫描思想

来源:互联网 发布:java内存溢出有几种 编辑:程序博客网 时间:2024/04/29 17:31
#include<reg52.h># define uchar unsigned char# define uint  unsigned intvoid delay(uchar a);void init();void keyscan();uchar H1,H2;uchar temp,hang,lie;uchar code table[4][3]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc0,0xff};  void main (){init();while(1){  keyscan();  P0=table[H1][H2];}}void delay(uchar a){uchar x,y;for(x=a;x>0;x--)for(y=110;y>0;y--);}void init(){H1=3;H2=0;}void keyscan(){P1=0x1f;temp=P1;    temp=temp&0x1f;if(temp!=0x1f){delay(5);temp=P1;temp=temp&0x1f;if(temp!=0x1f)     //hang检测{temp=P1;switch(temp){case 0x0f: hang=0;break;case 0x17: hang=1;break;case 0x1b: hang=2;break;case 0x1d: hang=3;break;default:break;}P1=0xff; //对P1口的初始化,如没有这一步则不能在列数检测时重新读入P1口信息P1=0xe1;//lie检测temp=P1;     temp=temp&0xe1;switch(temp){case 0xc1: lie=0;break;case 0xa1: lie=1;break;case 0x61: lie=2;break;default:break;}while(temp!=0xe1){ temp=P1; temp=temp&0xe1;}H1=hang;H2=lie;   }}}



最近在学习51单片机,看了郭天祥老师的《10天学会单片机》视频教程,其中对矩阵式键盘的扫描采用的是逐行扫描的思想。代码量大,对于51单片机而言,ROM资源是十分珍贵的,这样无疑是一种赘余。于是我萌发了编写一种更简单的扫描方法的想法,写出了上述代码。采用二维数组收集八段数码管所需显示数字的模,以矩阵形式排列数字,这样一来,一旦确定了按下键位的行与列,那么也就确定了按下键位所对应的数字。后来在网上看了其他老师的教学视频,发现我的这种思想与其他大多数人的思想不谋而合。可能是郭天祥老师的教程推出时间较早,所以并没有把这种对矩阵式键盘扫描的方法收录进去。我是西安电子科技大学的学生,在我们学校里郭天祥老师的《10天学会单片机》系列教程还是很火热的。我所接触的大部分同学在学习时都是采用这套教材。因此我发表这篇博客,目的在于向广大51单片机初学者,特别是使用郭天祥老师教材的同学,提出一种较为简便的扫描矩阵式键盘的思想。因为我也是一个单片机的初学者,因此如果我的代码如果存在不足,也希望读者指出。
以下是我学习了郭天祥老师在《10天学会单片机》视频后,采用郭老师的思想针对同一电路图编写的键盘扫描代码。



uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};void keyboard(){  uchar temp,num;num=10;                  P1=0xef;  temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xcf: num=1;break;case 0xaf: num=2;break;case 0x6f: num=3;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}  P1=0xf7;  temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xd7: num=4;break;case 0xb7: num=5;break;case 0x77: num=6;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}  P1=0xfb;temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xdb: num=7;break;case 0xbb: num=8;break;case 0x7b: num=9;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}P1=0xfd;temp=P1;temp=temp&0xe0;while(temp!=0xe0){delay(5);temp=P1;temp=temp&0xe0;while(temp!=0xe0){temp=P1;switch(temp){case 0xdd: num=10;//这里星号键和井号键我是使数码管不显示任何数break;case 0xbd: num=0;break;case 0x7d: num=10;break;default:break;}while(temp!=0xe0){temp=P1;temp=temp&0xe0;} }}}


以下是我编程时采用的电路图,所接键盘就是常见的手机键盘。




原创粉丝点击