标签:矩阵键盘扫描
4X4矩阵键盘扫描:
1. 4根行线的GIO均设为Output,根列线的GIO均设为Input;
2. 4根行线的GIO分别置为0111、1011、1101、1110,读逐一读取列线GIO的值,可确定是哪一个按键;
电路图如下:
注意:
1. 图中用作输入的GIO,一定要有一个上拉电阻。
2. 芯片中的每一个引脚是否用作了GPIO口来用,需配置芯片的寄存器,使引脚当作GPIO口来使用,才会有效。
测试代码如下:
#define KEY_GIO_ROW_1 37 #define KEY_GIO_ROW_2 33 #define KEY_GIO_ROW_3 32 #define KEY_GIO_ROW_4 35 #define KEY_GIO_COL_1 22 #define KEY_GIO_COL_2 23 #define KEY_GIO_COL_3 24 #define KEY_GIO_COL_4 36 int scanKey() { int keyValue = 0; int col1Value=0,col2Value=0,col3Value=0,col4Value=0,row1Value=0,row2Value=0,row3Value=0,row4Value=0; static int press1=0,press2=0,press3=0,press4=0; static int press5=0,press6=0,press7=0,press8=0; static int press9=0,press10=0,press11=0,press12=0; static int press13=0,press14=0,press15=0,press16=0; dm365SetGPIO(KEY_GIO_ROW_1, 0); dm365SetGPIO(KEY_GIO_ROW_2, 1); dm365SetGPIO(KEY_GIO_ROW_3, 1); dm365SetGPIO(KEY_GIO_ROW_4, 1); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=1==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press1) { press1 = 1; printf("KEY 1\n"); } } break; case 0x0D: { if(!press2) { press2 = 1; printf("KEY 2\n"); } } break; case 0x0B: { if(!press3) { press3 = 1; printf("KEY 3\n"); } } break; case 0x07: { if(!press4) { press4 = 1; printf("KEY 4\n"); } } break; default: { press1 = 0; press2 = 0; press3 = 0; press4 = 0; } break; } dm365SetGPIO(KEY_GIO_ROW_1, 1); dm365SetGPIO(KEY_GIO_ROW_2, 0); dm365SetGPIO(KEY_GIO_ROW_3, 1); dm365SetGPIO(KEY_GIO_ROW_4, 1); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=2==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press5) { press5 = 1; printf("KEY 5\n"); } } break; case 0x0D: { if(!press6) { press6 = 1; printf("KEY 6\n"); } } break; case 0x0B: { if(!press7) { press7 = 1; printf("KEY 7\n"); } } break; case 0x07: { if(!press8) { press8 = 1; printf("KEY 8\n"); } } break; default: { press5 = 0; press6 = 0; press7 = 0; press8 = 0; } break; } dm365SetGPIO(KEY_GIO_ROW_1, 1); dm365SetGPIO(KEY_GIO_ROW_2, 1); dm365SetGPIO(KEY_GIO_ROW_3, 0); dm365SetGPIO(KEY_GIO_ROW_4, 1); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=3==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press9) { press9 = 1; printf("KEY 9\n"); } } break; case 0x0D: { if(!press10) { press10 = 1; printf("KEY 10\n"); } } break; case 0x0B: { if(!press11) { press11 = 1; printf("KEY 11\n"); } } break; case 0x07: { if(!press12) { press12 = 1; printf("KEY 12\n"); } } break; default: { press9 = 0; press10 = 0; press11 = 0; press12 = 0; } break; } dm365SetGPIO(KEY_GIO_ROW_1, 1); dm365SetGPIO(KEY_GIO_ROW_2, 1); dm365SetGPIO(KEY_GIO_ROW_3, 1); dm365SetGPIO(KEY_GIO_ROW_4, 0); col1Value = dm365GetGPIO(KEY_GIO_COL_1); col2Value = dm365GetGPIO(KEY_GIO_COL_2); col3Value = dm365GetGPIO(KEY_GIO_COL_3); col4Value = dm365GetGPIO(KEY_GIO_COL_4); keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3); // printf("=4==keyValue = %x\n",keyValue); switch(keyValue) { case 0x0E: { if(!press13) { press13 = 1; printf("KEY 13\n"); } } break; case 0x0D: { if(!press14) { press14 = 1; printf("KEY 14\n"); } } break; case 0x0B: { if(!press15) { press15 = 1; printf("KEY 15\n"); } } break; case 0x07: { if(!press16) { press16 = 1; printf("KEY 16\n"); } } break; default: { press13 = 0; press14 = 0; press15 = 0; press16 = 0; } break; } return keyValue; } void *KeyMngThread() { int resetValue = 1; int resetCout = 0; int alarmInValue = 1; int alarmInCout = 0; while(1) { resetValue = dm365GetGPIO(GIO_RESET); if(0 == resetValue) { resetCout++; } else if(1 == resetValue) { resetCout = 0; } if(resetCout == 30) { resetCout = 0; system("rm -f /mnt/nand/sysenv.cfg"); system("/bin/sync"); // System("reboot"); system("/tmp/shutdown -r now \n"); } alarmInValue = dm365GetGPIO(GIO_ALARM_IN); if(0 == alarmInValue) { dm365SetGPIO(GIO_LED,0); //control led off . } else if(1 == alarmInValue) { dm365SetGPIO(GIO_LED,1); //control led on . } scanKey(); usleep(100000); } }
dm365GetGPIO( )中将GPIO默认设置为Input,
通过字符设备驱动实现应用层操作底层GPIO。
标签:矩阵键盘扫描
原文地址:http://blog.csdn.net/liukang325/article/details/39959909