⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 8个io接36个按键.c

📁 收集了一些按键扫描程序,希望对大家在按键学习上有所帮助
💻 C
字号:
8个IO接36个按键(没有用二极管)--键扫描程序 
  
  
/* 
备注: 这张图是由网友fsaok提供的. 
*/ 
HotPower 发表于 2004-8-6 20:30 侃单片机 ←返回版面 举报该贴 

#include "REG52.h"//不知为何发帖不能用尖括弧????? 
#include "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 
} 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -