×
单片机 > 单片机程序设计 > 详情

C51矩阵键盘的检测(两种方法)

发布时间:2020-06-19 发布时间:
|

要求:扫描矩阵键盘,并将对应按键的值显示在LED上

方法一(传统检测):

#include

#define uint unsigned int

#define uchar unsigned char

sbit dula=P2^6;

sbit wela=P2^7;

//sbit key1=P3^4;

uchar code table[]={   //共阳极LED数码管显示数字0~F

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e

};

uchar num,temp,num1;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

uchar keyscan();

void display(uchar aa);

void main()

{

while(1)

{

display(keyscan());

}

}

void display(uchar aa)

{

/*先送数,后选通,延时以后,将所有端口都不选通,这样,拖影就消失了*/

dula=1;

P0=table[aa-1];

dula=0;

wela=1;

P0=0x01;

wela=0;

delay(5);

wela=1;

P0=0x00;

wela=0;

}

uchar keyscan()

{

P3=0xfe;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:num=1;

break;

case 0xde:num=2;

break;

case 0xbe:num=3;

break;

case 0x7e:num=4;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:num=5;

break;

case 0xdd:num=6;

break;

case 0xbd:num=7;

break;

case 0x7d:num=8;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:num=9;

break;

case 0xdb:num=10;

break;

case 0xbb:num=11;

break;

case 0x7b:num=12;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

delay(5);

temp=P3;

temp=temp&0xf0;

while(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:num=13;

break;

case 0xd7:num=14;

break;

case 0xb7:num=15;

break;

case 0x77:num=16;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

}

}

return num;

}

方法二(技巧检测):

#include  

#include  

sbit dula=P2^6;

sbit wela=P2^7;

#define uint unsigned int 

#define uchar unsigned char

//uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09}; 

uchar code table[]={   //共阳极LED数码管显示数字0~F

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e

};

uchar Key_Value;

void Delay_1ms(uint x) 

 uchar i, j; 

 for(i = 0; i 

void Getkey()  

{

uchar i, j, temp,num,Key_Temp1, Key_Temp2, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7}; 

    for(j = 0; j 

P3 = Buffer[j];      

_nop_(); 

_nop_(); 

    temp = 0x10;           

    for(i = 0; i 

{  

      if(!(P3 & temp)) 

  {      

         num=i + j * 4; //返回取得的按键值    

      }

      temp <<= 1;            //换左边一位  

     } 

    } 

    P3 = 0xff; 

    Key_Temp1 = num;      //读入按键

    if(Key_Temp1 

{      

Delay_1ms(5);            //延时消抖 

    Key_Temp2 =num;   //再读一次  

        if (Key_Temp1 == Key_Temp2)//两次相等  

        Key_Value = Key_Temp1; //就确认下来  

    } 

}

void Display(uchar k) 

{

dula=1;

P0=table[k];

dula=0;

wela=1;

P0=0x01;

wela=0;

Delay_1ms(5);

wela=1;

P0=0x00;

wela=0;

}

void Main(void) 

   while(1) 

   {

    Getkey();

    Display(Key_Value);         //显示键值

  } 

}


关键字:C51  矩阵键盘  检测 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会