4X4矩阵键盘扫描程序

来源:互联网 发布:大数据时代 哪年来的 编辑:程序博客网 时间:2024/05/01 21:12

4X4矩阵键盘扫描:

1. 4根行线的GIO均设为Output,根列线的GIO均设为Input;

2. 4根行线的GIO分别置为0111、1011、1101、1110,读逐一读取列线GIO的值,可确定是哪一个按键;


电路图如下:


注意:

1. 图中用作输入的GIO,一定要有一个上拉电阻。

2. 芯片中的每一个引脚是否用作了GPIO口来用,需配置芯片的寄存器,使引脚当作GPIO口来使用,才会有效。


测试代码如下:

[cpp] view plain copy
  1. #define KEY_GIO_ROW_1   37  
  2. #define KEY_GIO_ROW_2   33  
  3. #define KEY_GIO_ROW_3   32  
  4. #define KEY_GIO_ROW_4   35  
  5. #define KEY_GIO_COL_1   22  
  6. #define KEY_GIO_COL_2   23  
  7. #define KEY_GIO_COL_3   24  
  8. #define KEY_GIO_COL_4   36  
  9. int scanKey()  
  10. {  
  11.     int keyValue = 0;  
  12.     int col1Value=0,col2Value=0,col3Value=0,col4Value=0,row1Value=0,row2Value=0,row3Value=0,row4Value=0;  
  13.     static int press1=0,press2=0,press3=0,press4=0;  
  14.     static int press5=0,press6=0,press7=0,press8=0;  
  15.     static int press9=0,press10=0,press11=0,press12=0;  
  16.     static int press13=0,press14=0,press15=0,press16=0;  
  17.   
  18.     dm365SetGPIO(KEY_GIO_ROW_1, 0);  
  19.     dm365SetGPIO(KEY_GIO_ROW_2, 1);  
  20.     dm365SetGPIO(KEY_GIO_ROW_3, 1);  
  21.     dm365SetGPIO(KEY_GIO_ROW_4, 1);  
  22.     col1Value = dm365GetGPIO(KEY_GIO_COL_1);  
  23.     col2Value = dm365GetGPIO(KEY_GIO_COL_2);  
  24.     col3Value = dm365GetGPIO(KEY_GIO_COL_3);  
  25.     col4Value = dm365GetGPIO(KEY_GIO_COL_4);  
  26.     keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3);  
  27. //  printf("=1==keyValue = %x\n",keyValue);  
  28.     switch(keyValue)  
  29.     {  
  30.         case 0x0E:  
  31.             {  
  32.                 if(!press1)  
  33.                 {  
  34.                     press1 = 1;  
  35.                     printf("KEY 1\n");  
  36.                 }  
  37.             }  
  38.             break;  
  39.         case 0x0D:  
  40.             {  
  41.                 if(!press2)  
  42.                 {  
  43.                     press2 = 1;  
  44.                     printf("KEY 2\n");  
  45.                 }  
  46.             }  
  47.             break;  
  48.         case 0x0B:  
  49.             {  
  50.                 if(!press3)  
  51.                 {  
  52.                     press3 = 1;  
  53.                     printf("KEY 3\n");  
  54.                 }  
  55.             }  
  56.             break;  
  57.         case 0x07:  
  58.             {  
  59.                 if(!press4)  
  60.                 {  
  61.                     press4 = 1;  
  62.                     printf("KEY 4\n");  
  63.                 }  
  64.             }  
  65.             break;  
  66.         default:  
  67.             {  
  68.                 press1 = 0;  
  69.                 press2 = 0;  
  70.                 press3 = 0;  
  71.                 press4 = 0;  
  72.             }  
  73.             break;  
  74.     }  
  75.   
  76.     dm365SetGPIO(KEY_GIO_ROW_1, 1);  
  77.     dm365SetGPIO(KEY_GIO_ROW_2, 0);  
  78.     dm365SetGPIO(KEY_GIO_ROW_3, 1);  
  79.     dm365SetGPIO(KEY_GIO_ROW_4, 1);  
  80.     col1Value = dm365GetGPIO(KEY_GIO_COL_1);  
  81.     col2Value = dm365GetGPIO(KEY_GIO_COL_2);  
  82.     col3Value = dm365GetGPIO(KEY_GIO_COL_3);  
  83.     col4Value = dm365GetGPIO(KEY_GIO_COL_4);  
  84.     keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3);  
  85. //  printf("=2==keyValue = %x\n",keyValue);  
  86.     switch(keyValue)  
  87.     {  
  88.         case 0x0E:  
  89.             {  
  90.                 if(!press5)  
  91.                 {  
  92.                     press5 = 1;  
  93.                     printf("KEY 5\n");  
  94.                 }  
  95.             }  
  96.             break;  
  97.         case 0x0D:  
  98.             {  
  99.                 if(!press6)  
  100.                 {  
  101.                     press6 = 1;  
  102.                     printf("KEY 6\n");  
  103.                 }  
  104.             }  
  105.             break;  
  106.         case 0x0B:  
  107.             {  
  108.                 if(!press7)  
  109.                 {  
  110.                     press7 = 1;  
  111.                     printf("KEY 7\n");  
  112.                 }  
  113.             }  
  114.             break;  
  115.         case 0x07:  
  116.             {  
  117.                 if(!press8)  
  118.                 {  
  119.                     press8 = 1;  
  120.                     printf("KEY 8\n");  
  121.                 }  
  122.             }  
  123.             break;  
  124.         default:  
  125.             {  
  126.                 press5 = 0;  
  127.                 press6 = 0;  
  128.                 press7 = 0;  
  129.                 press8 = 0;  
  130.             }  
  131.             break;  
  132.     }  
  133.   
  134.     dm365SetGPIO(KEY_GIO_ROW_1, 1);  
  135.     dm365SetGPIO(KEY_GIO_ROW_2, 1);  
  136.     dm365SetGPIO(KEY_GIO_ROW_3, 0);  
  137.     dm365SetGPIO(KEY_GIO_ROW_4, 1);  
  138.     col1Value = dm365GetGPIO(KEY_GIO_COL_1);  
  139.     col2Value = dm365GetGPIO(KEY_GIO_COL_2);  
  140.     col3Value = dm365GetGPIO(KEY_GIO_COL_3);  
  141.     col4Value = dm365GetGPIO(KEY_GIO_COL_4);  
  142.     keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3);  
  143. //  printf("=3==keyValue = %x\n",keyValue);  
  144.     switch(keyValue)  
  145.     {  
  146.         case 0x0E:  
  147.             {  
  148.                 if(!press9)  
  149.                 {  
  150.                     press9 = 1;  
  151.                     printf("KEY 9\n");  
  152.                 }  
  153.             }  
  154.             break;  
  155.         case 0x0D:  
  156.             {  
  157.                 if(!press10)  
  158.                 {  
  159.                     press10 = 1;  
  160.                     printf("KEY 10\n");  
  161.                 }  
  162.             }  
  163.             break;  
  164.         case 0x0B:  
  165.             {  
  166.                 if(!press11)  
  167.                 {  
  168.                     press11 = 1;  
  169.                     printf("KEY 11\n");  
  170.                 }  
  171.             }  
  172.             break;  
  173.         case 0x07:  
  174.             {  
  175.                 if(!press12)  
  176.                 {  
  177.                     press12 = 1;  
  178.                     printf("KEY 12\n");  
  179.                 }  
  180.             }  
  181.             break;  
  182.         default:  
  183.             {  
  184.                 press9 = 0;  
  185.                 press10 = 0;  
  186.                 press11 = 0;  
  187.                 press12 = 0;  
  188.             }  
  189.             break;  
  190.     }  
  191.   
  192.     dm365SetGPIO(KEY_GIO_ROW_1, 1);  
  193.     dm365SetGPIO(KEY_GIO_ROW_2, 1);  
  194.     dm365SetGPIO(KEY_GIO_ROW_3, 1);  
  195.     dm365SetGPIO(KEY_GIO_ROW_4, 0);  
  196.     col1Value = dm365GetGPIO(KEY_GIO_COL_1);  
  197.     col2Value = dm365GetGPIO(KEY_GIO_COL_2);  
  198.     col3Value = dm365GetGPIO(KEY_GIO_COL_3);  
  199.     col4Value = dm365GetGPIO(KEY_GIO_COL_4);  
  200.     keyValue = col1Value | (col2Value << 1) | (col3Value << 2) | (col4Value << 3);  
  201. //  printf("=4==keyValue = %x\n",keyValue);  
  202.     switch(keyValue)  
  203.     {  
  204.         case 0x0E:  
  205.             {  
  206.                 if(!press13)  
  207.                 {  
  208.                     press13 = 1;  
  209.                     printf("KEY 13\n");  
  210.                 }  
  211.             }  
  212.             break;  
  213.         case 0x0D:  
  214.             {  
  215.                 if(!press14)  
  216.                 {  
  217.                     press14 = 1;  
  218.                     printf("KEY 14\n");  
  219.                 }  
  220.             }  
  221.             break;  
  222.         case 0x0B:  
  223.             {  
  224.                 if(!press15)  
  225.                 {  
  226.                     press15 = 1;  
  227.                     printf("KEY 15\n");  
  228.                 }  
  229.             }  
  230.             break;  
  231.         case 0x07:  
  232.             {  
  233.                 if(!press16)  
  234.                 {  
  235.                     press16 = 1;  
  236.                     printf("KEY 16\n");  
  237.                 }  
  238.             }  
  239.             break;  
  240.         default:  
  241.             {  
  242.                 press13 = 0;  
  243.                 press14 = 0;  
  244.                 press15 = 0;  
  245.                 press16 = 0;  
  246.             }  
  247.             break;  
  248.     }  
  249.   
  250.   
  251.     return keyValue;  
  252. }  
  253. void *KeyMngThread()  
  254. {  
  255.     int resetValue = 1;  
  256.     int resetCout = 0;  
  257.     int alarmInValue = 1;  
  258.     int alarmInCout = 0;  
  259.     while(1)  
  260.     {  
  261.         resetValue = dm365GetGPIO(GIO_RESET);  
  262.         if(0 == resetValue)  
  263.         {  
  264.             resetCout++;  
  265.         }  
  266.         else if(1 == resetValue)  
  267.         {  
  268.             resetCout = 0;  
  269.         }  
  270.         if(resetCout == 30)  
  271.         {  
  272.             resetCout = 0;  
  273.             system("rm -f /mnt/nand/sysenv.cfg");  
  274.             system("/bin/sync");  
  275. //          System("reboot");  
  276.             system("/tmp/shutdown -r now \n");  
  277.         }  
  278.         alarmInValue = dm365GetGPIO(GIO_ALARM_IN);  
  279.         if(0 == alarmInValue)  
  280.         {  
  281.             dm365SetGPIO(GIO_LED,0);    //control led off .  
  282.         }  
  283.         else if(1 == alarmInValue)  
  284.         {  
  285.             dm365SetGPIO(GIO_LED,1);    //control led on .  
  286.         }  
  287.   
  288.         scanKey();  
  289.   
  290.         usleep(100000);  
  291.     }  
  292.   
  293. }  

代码中dm365SetGPIO( )里将GPIO默认设置为Output,

dm365GetGPIO( )中将GPIO默认设置为Input,

通过字符设备驱动实现应用层操作底层GPIO。


转自:http://blog.csdn.net/liukang325/article/details/39959909

原创粉丝点击