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