/***4Ã4ç©éµæé®ææ¶ââç«æ´å¤©å ä½å-20110921***/
/***æºç¨åºé»è®¤ç¡¬ä»¶ç¯å¢:52åçæº,12MHzæ¶æ¯,P1å£ 4Ã4ç©éµé®ç,详ç»å¸å±å¦ä¸***/
/* é»è®¤ç©éµå¸å±,æé®æ«ææ¹å¼1使ç¨
P0 P1 P2 P3
â â â â
P4ââ¼âââ¼âââ¼ââ⤠S1 S2 S3 S4
â â â â
P5ââ¼âââ¼âââ¼ââ⤠S5 S6 S7 S8
â â â â
P6ââ¼âââ¼âââ¼ââ⤠S9 S10 S11 S12
â â â â
P7ââ´âââ´âââ´âââ S13 S14 S15 S16
*/
#include"reg52.h" //å
å«52头æ件
#define TRUE 1 //å®ä¹å¸å°é'1':ç
#define FALSE 0 //å®ä¹å¸å°é'0':å
#define uchar unsigned char //å®ä¹ æ 符å·å符åæ°æ® ç®ç§°
#define uint unsigned int //å®ä¹ æ 符å·æ´åæ°æ® ç®ç§°
#define KeyPort P1
#define Key1Value 1
#define Key2Value 2
//uchar code KeyCodeList[16]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xeb,0xe7,0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77};//æé®ä»£ç å表,æé®æ«ææ¹å¼2使ç¨,å¯æéè¦éæä¿®æ¹é¡ºåº
uchar KeyScan() //æé®æ«æå½æ°(æ¹å¼1,éé
åæºç¨åºç©éµå¸å±,è¿åå¼0表示æ æé®,1-16为对åºæé®),缺ç¹:æ æ³æ«æç»åé®(åæ¶æ2个æé®ä»¥ä¸)
{
uchar temp_h,temp_l,scan_value,i;
KeyPort=0xf0; //设置ä½4ä½ä¸º0(æ«æ线),åå¤è¯»åé«4ä½(è¿å线)ç¶æ
if(KeyPort==0xf0) return 0; //è¥é«4ä½ç¶æä¸å,表示æ æé®,è¿åæ æé® é®å¼0
temp_h=~KeyPort>>4; //è¥é«4ä½ç¶ææ¹å,表示ææé®,读åé«4ä½,并å°ç»æ转ææ£é»è¾(æé®å¯¹åº è¡çº¿ 为 1 )åå¨temp_hä½ä½ä¸
KeyPort=0x0f; //设置é«4ä½ä¸º0(æ«æ线),åå¤è¯»åä½4ä½(è¿å线)ç¶æ
temp_l=~(KeyPort|0xf0); //读åä½4ä½,并å°ç»æ转ææ£é»è¾(æé®å¯¹åº å线 为 1 )åå¨temp_lä½ä½ä¸
while(i<4) //å° æé®è¡çº¿å· 转ææ°å¼
{
if((temp_h>>i)==0x01) break; //读åæé®è¡çº¿å·
i++;
}
if(i==4) return 0; //è¥è¯»ååºé,è¿åæ æé®
temp_h=i; //å° æé®è¡çº¿æ°å¼ ç»æåäº temp_h
i=0;
while(i<4) //å° æé®åçº¿å· è½¬ææ°å¼
{
if((temp_l>>i)==0x01) break; //读åæé®å线å·
i++;
}
if(i==4) return 0; //è¥è¯»ååºé,è¿åæ æé®
temp_l=i; //å° æé®åçº¿å· ç»æåäº temp_l
scan_value=(temp_h<<2)+temp_l+1; //å并è¡å线æ°å¼,并转ææé®å¼,æ¯æ¡è¡çº¿é®å¼å·®ä¸º 4(temp_h<<2),æé®å¼ä»1å¼å§(+1,0为æ æé® é®å¼)
return scan_value; //è¿å æé®å¼
}
/*
uchar KeyScan() //æé®æ«æå½æ°(æ¹å¼2,éé
å æé®ä»£ç å表 æ°ç» è¿è¡ é®å¼ æ¥è¯¢,è¿åå¼0表示æ æé®,1-16为代ç 表顺åºå¯¹åºæé®),缺ç¹:æ æ³æ«æç»åé®
{
uchar temp,i;
KeyPort=0xf0; //设置ä½4ä½ä¸º0(æ«æ线),åå¤è¯»åé«4ä½(è¿å线)ç¶æ
if(KeyPort==0xf0) return 0; //è¥é«4ä½ç¶æä¸å,表示æ æé®,è¿åæ æé® é®å¼0
temp=KeyPort|0x0f; //è¥é«4ä½ç¶ææ¹å,表示ææé®,读åé«4ä½,并å°ç»æåäº temp çé«4ä½
KeyPort=0x0f; //设置é«4ä½ä¸º0(æ«æ线),åå¤è¯»åä½4ä½(è¿å线)ç¶æ
temp&=(KeyPort|0xf0); //读åä½4ä½,并å°ç»æåäº temp çä½4ä½
while(i<16) //å°æé®è¡å线代ç 转æ¢æé®å¼
{
if(temp==KeyCodeList[i]) break; //å° è¡å线 代ç ä¸ æé®ä»£ç 表 è¿è¡å¯¹æ¯,è¥ä¸è´åç»æ对æ¯
i++; //è¿è¡ä¸ä¸ä¸ªå¯¹æ¯
}
if(i==16) return 0; //è¥æ¥è¯¢åºé,æ è¡å线代ç ä¸å¨ æé®ä»£ç 表ä¸,è¿åæ æé® é®å¼0
return i+1; //è¿åæé®å¼1~16(æé®ä»£ç å表ä¸å
ç´ ä¸æ +1,0为æ æé® é®å¼)
}
*/
void KeyResp() //æé®ååºå½æ°
{
static uchar KeyValue; //å®ä¹éæåé-æé®å¼,
static bit KeyDownFlag,KeyReadyFlag; //å®ä¹éææ å¿ä½-æé®æä¸æ å¿,æé®åå¤(ååº)æ å¿
uchar key_value=KeyScan(); //è°ç¨æ«æå½æ°,并å°ç»æ临æ¶åæ¾äºkey_value ä¸
if(key_value) //è¥æ«æç»æ为ç(å³ææé®)
{
KeyValue=key_value; //ä¿åæ«æç»æ
KeyDownFlag=TRUE; //æé®æä¸æ å¿ ç½®ä½
KeyReadyFlag=TRUE; //æé®åå¤(ååº)æ å¿ ç½®ä½
}
else KeyDownFlag=FALSE; //è¥æ«æç»æ为å(å³æ æé®),åæ¸
空æé®æä¸æ å¿
if(KeyReadyFlag && !KeyDownFlag) //è¥ æé®å·²åå¤(ååº),ä¸æ æé®æä¸,(å¯ç¥ä¸º æä¸ååæ¾ææ
åµ)
{
switch(KeyValue) //æ¥æ¾ æé®å¼ 对åºç æé®å¤ç
{
case Key1Value:break; //æé®1å¤ç
case Key2Value:break; //æé®2å¤ç
//case Key3Value:break;//......... //æé®Nå¤ç
default:break; //æ 对åºæé®,æå
¶å®æé®å¼å¤ç
}
KeyValue=0; //æ¸
é¤æé®å¼
KeyReadyFlag=FALSE; //æ¸
空 æé®åå¤(ååº)æ å¿
}
}
void main() //主å½æ°
{
while(1) //循ç¯ç³»ç»
{
KeyResp(); //è°ç¨ æé®ååºå½æ°
}
}
温馨提示:答案为网友推荐,仅供参考