|
8个IO接36个按键(没有用二极管)--键扫描程序 /* 备注: 这张图是由网友fsaok提供的. */ HotPower 发表于 2004-8-6 20:30 侃单片机 ←返回版面 举报该贴
#i nclude "REG52.h"//不知为何发帖不能用尖括弧????? #i nclude "intrins.h"//不知为何发帖不能用尖括弧?????
sbit Row0 = P1^0; sbit Row1 = P1^1; sbit Row2 = P1^2; sbit Row3 = P1^3; sbit Col0 = P1^4; sbit Col1 = P1^5; sbit Col2 = P1^6; sbit Col3 = P1^7;
unsigned char KeyScan(void);
void main(void) { KeyScan(); while(1); }
unsigned char KeyScan(void) { unsigned char key, temp; unsigned char code keytab[] = {//键码表 //键值,//点,键名 键号 0x81,//07,key1 00 0x41,//06,key2 01 0x21,//05,key3 02 0x11,//04,key4 03
0x82,//17,key5 04 0x42,//16,key6 05 0x22,//15,key7 06 0x12,//14,key8 07
0x84,//27,key9 08 0x44,//26,key10 09 0x24,//25,key11 0A 0x14,//24,key12 0B
0x88,//37,key13 0C 0x48,//36,key14 0D 0x28,//35,key15 0E 0x18,//34,key16 0F
0x03,//01,key17 10 0x06,//12,key18 11 0x0c,//23,key19 12 0x05,//02,key20 13 0x09,//03,key21 14 0x0d,//13,key22 15
0xc0,//67,key23 16 0x60,//56,key24 17 0x30,//45,key25 18 0xa0,//57,key26 19 0x50,//46,key27 1A 0x90,//47,key28 1B
/* 0x01,//G0,key29 1C 0x02,//G1,key30 1D 0x04,//G2,key31 1E 0x08,//G3,key32 1F 0x10,//G4,key33 20 0x20,//G5,key34 21 0x40,//G6,key35 22 0x80,//G7,key36 23 */ 0//退出 }; P1 = 0xff;//释放键盘 _nop_();//延时 key = P1;//测试独占键(与GND连接) key = ~key;//取反,变为正逻辑 if (key) {//有独占键压下,键码28~35,键key29..key36 temp = 35;//最后一个独占键key36 do { if (key >= 0x80) break;//有独占键压下,退出测试 key <<= 1;//测试下一独占键 temp --;//键号-1 } while(key);//未测完继续 if (key != 0x80) key = 0xff;//多个独占键压下,出错键码0xff else key = temp;//得到键码28~35,键号key29~key36. } else {//测试组合键,键码0~27 temp = 0x01;//实为从P1_1测起,到P1_7测完 do {//只需扫描7次!!! temp <<= 1;//继续扫描下一位 P1 = ~temp;//发送某位低电平 _nop_();//延时 key = P1;//接收键盘数据 key = ~key;//取反,变为正逻辑 } while((temp < 0x80) && (key == temp));//测到P1_6或有键压下结束 if (key == temp) key = 0xff;//无键压下,键码0xff else {//有组合键压下 temp = 0;//初始键号 while(keytab[temp] && (key != keytab[temp])) temp ++;//查键值表 if (temp >= 28) temp = 0xff;//查无此组合键,出错键码0xff else key = temp;//得到组合键码0~27,键key1~key28. } } return key;//返回键码0~35或出错码0xff }
|