在网上找了好多,却没发现自己想要的,不是太麻烦就是不合用,于是自己写了一个,其中参考了好多其他的程序,就不列出了。
键盘扫描只用了一个循环,但是键值处理并不是很好,用了一个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为8或4或2或1) */
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);
}