4X4矩阵键盘扫描程序
2014-10-10 16:24
399 查看
4X4矩阵键盘扫描:
1. 4根行线的GIO均设为Output,根列线的GIO均设为Input;
2. 4根行线的GIO分别置为0111、1011、1101、1110,读逐一读取列线GIO的值,可确定是哪一个按键;
电路图如下:
注意:
1. 图中用作输入的GIO,一定要有一个上拉电阻。
2. 芯片中的每一个引脚是否用作了GPIO口来用,需配置芯片的寄存器,使引脚当作GPIO口来使用,才会有效。
测试代码如下:
代码中dm365SetGPIO( )里将GPIO默认设置为Output,
dm365GetGPIO( )中将GPIO默认设置为Input,
通过字符设备驱动实现应用层操作底层GPIO。
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); } }
代码中dm365SetGPIO( )里将GPIO默认设置为Output,
dm365GetGPIO( )中将GPIO默认设置为Input,
通过字符设备驱动实现应用层操作底层GPIO。
相关文章推荐
- 4X4矩阵键盘扫描程序
- 4x4矩阵键盘 扫描程序
- linux下4x4矩阵 键盘驱动,用了定时器控制扫描程序来抗抖。
- 4X4矩阵键盘扫描程序
- Win10 IoT C#开发 6 - 4x4矩阵键盘扫描
- [嵌入式开发模块]4X4矩阵键盘扫描 基于MC9S12XEP100
- AVR单片机(ATMEGA16)矩阵键盘扫描程序
- C51矩阵键盘扫描程序
- 矩阵键盘扫描程序实例
- 51单片机矩阵扫描键盘程序(源代码)
- 矩阵键盘扫描程序
- Win10 IoT C#开发 6 - 4x4矩阵键盘扫描
- 4X4键盘扫描演示程序
- 树莓派的矩阵键盘扫描程序,python开发
- 51单片机的4x4矩阵键盘扫描例程(C51)
- 数码管显示矩阵键盘扫描程序
- 一段简单的汇编程序,显示键盘按健的扫描码和ASCII码
- 键盘扫描程序 FPGA
- 键盘扫描程序及体会
- 51单片机扫描键盘程序