51的4*4键盘中断扫描程序

在网上找了好多,却没发现自己想要的,不是太麻烦就是不合用,于是自己写了一个,其中参考了好多其他的程序,就不列出了。

键盘扫描只用了一个循环,但是键值处理并不是很好,用了一个switch,感觉比较麻烦,但是想不出别的办法了……

键盘接法:

程序:

#include <REGX52.H>

#define LED_BIT P0
#define LED_COM P1
#define KEYBOARD P2

void display(unsigned char x);
unsigned char scan();
unsigned char skey(unsigned char orign);
void delayms(unsigned int t);
void Int1();
void Ini();

unsigned char answer;
unsigned char code LedTable[]={    //
显示键值转换,其实可以直接放到键值转换的函数里
        0xC0,/*0*/
        0xF9,/*1*/
        0xA4,/*2*/
        0xB0,/*3*/
        0x99,/*4*/
        0x92,/*5*/
        0x82,/*6*/
        0xF8,/*7*/
        0x80,/*8*/
        0x90,/*9*/
        0x88,/*A*/
        0x83,/*b*/
        0xC6,/*C*/
        0xA1,/*d*/
        0x86,/*E*/
        0x8E,/*F*/
   0x00,/*??%*/
};

void main()        //主函数
{
Ini();
while(1);
}

 

/***************************************************************************/

void display(unsigned char x)   //显示函数,没有位扫描,只显示一位
{
LED_BIT=LedTable[x];
}

 

/***************************************************************************/

void delayms(unsigned int t) //延时函数
{
unsigned char i;
for(;t>1;t--)
{
   for(i=0;i<123;i++);
}
}

 

/**************************************************************************/

unsigned char scan()    //键盘扫描
{
unsigned char i,ANS;
delayms(10); /*
消抖*/
for(i=1;i<=4;i++)
{
   KEYBOARD=0xf0|(0xef/*11101111*/>>i);/*
i=2,端口变为了111111011*/
   ANS=(KEYBOARD&0xf0);
   if(ANS!=0xf0)/*
当某键被按下时,会有高四位的某位被拉低,11011011&11110000=11010000*/
   {
    ANS=~KEYBOARD;/*(ANS
8421) */
    while((KEYBOARD&0xf0)!=0XF0);/*
等待按键被松开*/
    delayms(10); /*
消抖*/
    return(ANS);
   }
  }
}

 

/*********************************************************************/

unsigned char skey(unsigned char orign)   //键值转换
{
switch(orign)
 
{
   case 0x11:return 9;
   case 0x12:return 8;
   case 0x14:return 7;
   case 0x18:return 10;
   case 0x21:return 6;
   case 0x22:return 5;
   case 0x24:return 4;
   case 0x28:return 11;
   case 0x41:return 3;
   case 0x42:return 2;
   case 0x44:return 1;
   case 0x48:return 12;
   case 0x81:return 13;
   case 0x82:return 0;
   case 0x84:return 14;
   case 0x88:return 15;
   default:return 16 ;
}
}

 

/**********************************************************************/

void Int1() interrupt 2    //中断函数
{
EX1=0;
answer=skey(scan());
KEYBOARD=0x0f;
display(answer);
EX1=1;

}

 

/********************************************************************/

void Ini ()    //初始化
{
///*
中断扫描
KEYBOARD=0x0f;
LED_COM=0X01;
EA=1;
EX1=1;
IT1=1;
   display(answer);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值