[MSP-EXP432P401R] MSP432P401R的4x4矩阵按键

  [复制链接]

4

主题

16

帖子

868

积分

单晶硅锭

Rank: 3Rank: 3

积分
868
楼主
查看: 3655回复: 1 发表于 2021-4-17 23:48:58   只看该作者
本帖最后由 shenweizuibang 于 2021-4-17 23:57 编辑

第1题:基本的按键操作(如独立按键/4x4矩阵按键等),能完成基本的按键操作。
1.完整硬件的照片
2.引脚连接图等电路图
3.工程源代码(建议直接上传整个工程)
4.如果键盘使用了驱动芯片,则要上传驱动芯片的手册等资料

***********************************************************************************
1.硬件
MSP432P401R LaunchPad + 4x4矩阵按键

4x4矩阵按键
正面             反面

2.硬件连接
矩阵按键第一行R1接开发板P6.6,第二行R2接P6.7,第三行R3接P2.3,第四行R4接P5.1,
第一列C1接P5.6,第二列C2接P2.4,第三列C3接P2.6, 第四列C4接P2.7。


正面       反面


3.程序功能
功能描述:初始状态,LED1,LED2都灭,
按下按键S1,开启LED模式1, LED1红灯常亮,
按下按键S2,开启LED模式2, LED2红灯常亮,
按下按键S3,开启LED模式3, LED2绿灯常亮,
按下按键S4,开启LED模式4, LED2蓝灯常亮,
按下按键S5,开启LED模式5, LED2白灯常亮,
按下按键S6,开启LED模式6, LED1红灯慢速闪烁,
按下按键S7,开启LED模式7, LED2红灯慢速闪烁,
按下按键S8,开启LED模式8, LED2绿灯慢速闪烁,
按下按键S9,开启LED模式9, LED2蓝灯慢速闪烁,
按下按键S10,开启LED模式10, LED2白灯慢速闪烁,
按下按键S11,开启LED模式11, LED1红灯快速闪烁,
按下按键S12,开启LED模式12, LED2红灯快速闪烁,
按下按键S13,开启LED模式13, LED2绿灯快速闪烁,
按下按键S14,开启LED模式14, LED2蓝灯快速闪烁,
按下按键S15,开启LED模式15, LED2白灯快速闪烁,
按下按键S16,开启LED模式16, LED1红灯和LED2白灯快速闪烁。

程序可用框架:中断处理程序,列扫描方式,模式选择。
程序里有详细注释。

LED1红灯亮
LED2红灯亮


LED2绿灯亮

LED2蓝灯亮

LED2白灯亮

4.程序代码
  1. #include <ti/devices/msp432p4xx/driverlib/driverlib.h>
  2. #include <stdint.h>
  3. #include <stdbool.h>

  4. #define DELAYL 100000       //长延时,LED闪烁频率慢
  5. #define DELAYS 10000        //短延时,LED闪烁频率快

  6. uint32_t KeyS=0;            //LED模式选择参数,第几个按键按下对应第几个LED模式

  7. int main(void)
  8. {
  9.     volatile uint32_t ii;   //设置变量ii, 作为延时循环次数,ii越大,闪烁频率越慢

  10.     /* 关闭看门狗 */
  11.     MAP_WDT_A_holdTimer();

  12.     /* 配置LED1,LED2为输出*/
  13.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P1, GPIO_PIN0);
  14.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN0);
  15.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN1);
  16.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN2);

  17.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P5, GPIO_PIN6);     //第1列C1
  18.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN4);     //第2列C2
  19.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN6);     //第3列C3
  20.     MAP_GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN7);     //第4列C4

  21.     /* 所有列输出低电平*/
  22.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
  23.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
  24.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
  25.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);

  26.     /* 配置第1行R1--P6.6为上拉电阻输入并使能中断  */
  27.     MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P6, GPIO_PIN6);
  28.     MAP_GPIO_clearInterruptFlag(GPIO_PORT_P6, GPIO_PIN6);
  29.     MAP_GPIO_enableInterrupt(GPIO_PORT_P6, GPIO_PIN6);
  30.     //MAP_Interrupt_enableInterrupt(INT_PORT6);

  31.     /* 配置第2行R2--P6.7为上拉电阻输入并使能中断  */
  32.     MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P6, GPIO_PIN7);
  33.     MAP_GPIO_clearInterruptFlag(GPIO_PORT_P6, GPIO_PIN7);
  34.     MAP_GPIO_enableInterrupt(GPIO_PORT_P6, GPIO_PIN7);
  35.     MAP_Interrupt_enableInterrupt(INT_PORT6);

  36.     /* 配置第3行R3--P2.3为上拉电阻输入并使能中断  */
  37.     MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P2, GPIO_PIN3);
  38.     MAP_GPIO_clearInterruptFlag(GPIO_PORT_P2, GPIO_PIN3);
  39.     MAP_GPIO_enableInterrupt(GPIO_PORT_P2, GPIO_PIN3);
  40.     MAP_Interrupt_enableInterrupt(INT_PORT2);

  41.     /* 配置第4行R4--P5.1为上拉电阻输入并使能中断  */
  42.     MAP_GPIO_setAsInputPinWithPullUpResistor(GPIO_PORT_P5, GPIO_PIN1);
  43.     MAP_GPIO_clearInterruptFlag(GPIO_PORT_P5, GPIO_PIN1);
  44.     MAP_GPIO_enableInterrupt(GPIO_PORT_P5, GPIO_PIN1);
  45.     MAP_Interrupt_enableInterrupt(INT_PORT5);

  46.     /* Enabling SRAM Bank Retention */
  47.     MAP_SysCtl_enableSRAMBankRetention(SYSCTL_SRAM_BANK1);
  48.    
  49.     /* 使能全局中断 */
  50.     MAP_Interrupt_enableMaster();   

  51.     /* 进入LED模式选择循环 */
  52.     while (1)
  53.     {

  54.         /* 模式1, LED1红灯常亮*/
  55.         if(KeyS == 1)
  56.         {

  57.             MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P1, GPIO_PIN0);
  58.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  59.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  60.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);

  61.         }

  62.         /* 模式2, LED2红灯常亮*/
  63.         else if(KeyS == 2)
  64.         {

  65.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  66.             MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0);
  67.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  68.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);

  69.         }

  70.         /* 模式3, LED2绿灯常亮*/
  71.         else if(KeyS == 3)
  72.         {

  73.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  74.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  75.             MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);
  76.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);

  77.         }

  78.         /* 模式4, LED2蓝灯常亮*/
  79.         else if(KeyS == 4)
  80.         {

  81.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  82.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  83.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  84.             MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN2);

  85.         }

  86.         /* 模式5, LED2白灯常亮*/
  87.         else if(KeyS == 5)
  88.         {

  89.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  90.             MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN0);
  91.             MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN1);
  92.             MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN2);

  93.         }

  94.         /* 模式6, LED1红灯慢速闪烁*/
  95.         else if(KeyS == 6)
  96.         {

  97.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
  98.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  99.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  100.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);
  101.             for( ii=0 ; ii < DELAYL ; ii++ )
  102.             {
  103.             }

  104.         }

  105.         /* 模式7, LED2红灯慢速闪烁*/
  106.         else if(KeyS == 7)
  107.         {

  108.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  109.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN0);
  110.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  111.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);
  112.             for( ii=0 ; ii < DELAYL ; ii++ )
  113.             {
  114.             }

  115.         }

  116.         /* 模式8, LED2绿灯慢速闪烁*/
  117.         else if(KeyS == 8)
  118.         {

  119.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  120.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  121.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
  122.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);
  123.             for( ii=0 ; ii < DELAYL ; ii++ )
  124.             {
  125.             }

  126.         }

  127.         /* 模式9, LED2蓝灯慢速闪烁*/
  128.         else if(KeyS == 9)
  129.         {

  130.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  131.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  132.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  133.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN2);
  134.             for( ii=0 ; ii < DELAYL ; ii++ )
  135.             {
  136.             }

  137.         }

  138.         /* 模式10, LED2白灯慢速闪烁*/
  139.         else if(KeyS == 10)
  140.         {

  141.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  142.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN0);
  143.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
  144.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN2);
  145.             for( ii=0 ; ii < DELAYL ; ii++ )
  146.             {
  147.             }

  148.         }

  149.         /* 模式11, LED1红灯快速闪烁*/
  150.         else if(KeyS == 11)
  151.         {

  152.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
  153.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  154.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  155.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);
  156.             for( ii=0 ; ii < DELAYS ; ii++ )
  157.             {
  158.             }

  159.         }

  160.         /* 模式12, LED2红灯快速闪烁*/
  161.         else if(KeyS == 12)
  162.         {

  163.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  164.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN0);
  165.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  166.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);
  167.             for( ii=0 ; ii < DELAYS ; ii++ )
  168.             {
  169.             }

  170.         }

  171.         /* 模式13, LED2绿灯快速闪烁*/
  172.         else if(KeyS == 13)
  173.         {

  174.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  175.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  176.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
  177.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);
  178.             for( ii=0 ; ii < DELAYS ; ii++ )
  179.             {
  180.             }

  181.         }

  182.         /* 模式14, LED2蓝灯快速闪烁*/
  183.         else if(KeyS == 14)
  184.         {

  185.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  186.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  187.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  188.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN2);
  189.             for( ii=0 ; ii < DELAYS ; ii++ )
  190.             {
  191.             }

  192.         }

  193.         /* 模式15, LED2白灯快速闪烁*/
  194.         else if(KeyS == 15)
  195.         {

  196.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  197.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN0);
  198.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
  199.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN2);
  200.             for( ii=0 ; ii < DELAYS ; ii++ )
  201.             {
  202.             }

  203.         }

  204.         /* 模式16, LED1红灯和LED2白灯快速闪烁*/
  205.         else if(KeyS == 16)
  206.         {

  207.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P1, GPIO_PIN0);
  208.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN0);
  209.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN1);
  210.             MAP_GPIO_toggleOutputOnPin(GPIO_PORT_P2, GPIO_PIN2);
  211.             for( ii=0 ; ii < DELAYS ; ii++ )
  212.             {
  213.             }

  214.         }

  215.         /* 其他模式, LED1、LED2熄灭*/
  216.         else
  217.         {

  218.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  219.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  220.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  221.             MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);

  222.         }

  223.     }
  224. }

  225. /* GPIO中断服务程序  */
  226. /* 在中断中进行列扫描判断哪个按键按下,中断结束将所有列置为0. */
  227. /* 第1行和第2行的按键中断服务程序,*/
  228. void PORT6_IRQHandler(void)
  229. {
  230.     uint32_t status1;    //设置一个状态标志量,寄存中断情况

  231.     status1 = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P6);
  232.     MAP_GPIO_clearInterruptFlag(GPIO_PORT_P6, status1);           //清零所有中断标志位

  233.     /*先熄灭所有LED,避免模式干扰*/
  234.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  235.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  236.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  237.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);

  238.     /* 判断第一列按键是否按下,按下输入为0 */
  239.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
  240.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  241.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  242.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  243.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) )        //S1按下
  244.     {
  245.         KeyS=1;

  246.     }
  247.     else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN7)) )   //S5按下
  248.     {
  249.         KeyS=5;

  250.     }

  251.     /* 判断第二列按键是否按下,按下输入为0 */
  252.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  253.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
  254.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  255.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  256.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) )        //S2按下
  257.     {
  258.         KeyS=2;

  259.     }
  260.     else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN7)) )   //S6按下
  261.     {
  262.         KeyS=6;

  263.     }

  264.     /* 判断第三列按键是否按下,按下输入为0 */
  265.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  266.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  267.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
  268.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  269.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) )        //S3按下
  270.     {
  271.         KeyS=3;

  272.     }
  273.     else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN7)) )   //S7按下
  274.     {
  275.         KeyS=7;

  276.     }

  277.     /* 判断第四列按键是否按下,按下输入为0 */
  278.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  279.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  280.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  281.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);
  282.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN6)) )        //S4按下
  283.     {
  284.         KeyS=4;

  285.     }
  286.     else if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P6, GPIO_PIN7)) )   //S8按下
  287.     {
  288.         KeyS=8;

  289.     }

  290.     /*所有列置0,方便下一次进入中断*/
  291.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
  292.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
  293.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
  294.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);

  295. }


  296. /* 第4行的按键中断服务程序,*/
  297. void PORT5_IRQHandler(void)
  298. {
  299.     uint32_t status3;    //设置一个状态标志量,寄存中断情况

  300.     status3 = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P5);
  301.     MAP_GPIO_clearInterruptFlag(GPIO_PORT_P5, status3);           //清零所有中断标志位

  302.     /*先熄灭所有LED,避免模式干扰*/
  303.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  304.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  305.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  306.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);

  307.     /* 判断第一列按键是否按下,按下输入为0 */
  308.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
  309.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  310.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  311.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  312.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1) ) )        //S13按下
  313.     {
  314.         KeyS=13;

  315.     }

  316.     /* 判断第二列按键是否按下,按下输入为0 */
  317.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  318.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
  319.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  320.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  321.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1)) )        //S14按下
  322.     {
  323.         KeyS=14;

  324.     }

  325.     /* 判断第三列按键是否按下,按下输入为0 */
  326.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  327.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  328.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
  329.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  330.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1)) )        //S15按下
  331.     {
  332.         KeyS=15;

  333.     }

  334.     /* 判断第四列按键是否按下,按下输入为0 */
  335.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  336.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  337.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  338.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);
  339.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P5, GPIO_PIN1)) )        //S16按下
  340.     {
  341.         KeyS=16;

  342.     }

  343.     /*所有列置0,方便下一次进入中断*/
  344.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
  345.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
  346.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
  347.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);

  348. }

  349. /* 第3行的按键中断服务程序,*/
  350. void PORT2_IRQHandler(void)
  351. {
  352.     uint32_t status2;    //设置一个状态标志量,寄存中断情况

  353.     status2 = MAP_GPIO_getEnabledInterruptStatus(GPIO_PORT_P2);
  354.     MAP_GPIO_clearInterruptFlag(GPIO_PORT_P2, status2);           //清零所有中断标志位

  355.     /*先熄灭所有LED,避免模式干扰*/
  356.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P1, GPIO_PIN0);
  357.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN0);
  358.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN1);
  359.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN2);

  360.     /* 判断第一列按键是否按下,按下输入为0 */
  361.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
  362.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  363.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  364.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  365.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN3)) )        //S9按下
  366.     {
  367.         KeyS=9;

  368.     }

  369.     /* 判断第二列按键是否按下,按下输入为0 */
  370.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  371.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
  372.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  373.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  374.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN3)) )        //S10按下
  375.     {
  376.         KeyS=10;

  377.     }

  378.     /* 判断第三列按键是否按下,按下输入为0 */
  379.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  380.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  381.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
  382.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN7);
  383.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN3)) )        //S11按下
  384.     {
  385.         KeyS=11;

  386.     }

  387.     /* 判断第四列按键是否按下,按下输入为0 */
  388.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P5, GPIO_PIN6);
  389.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN4);
  390.     MAP_GPIO_setOutputHighOnPin(GPIO_PORT_P2, GPIO_PIN6);
  391.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);
  392.     if(!(MAP_GPIO_getInputPinValue(GPIO_PORT_P2, GPIO_PIN3)) )        //S12按下
  393.     {
  394.         KeyS=12;

  395.     }

  396.     /*所有列置0,方便下一次进入中断*/
  397.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P5, GPIO_PIN6);
  398.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN4);
  399.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);
  400.     MAP_GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN7);

  401. }
复制代码
matrix_button.zip (136.67 KB, 下载次数: 34)





打赏

参与人数 11赫兹币 +55 收起 理由
bly + 5
lithiumice + 5
mei187 + 5
hu158 + 5
fu188 + 5
zombiejbt + 5
csj0710 + 5
RHAnthony + 5
blueblues + 5
JTao + 5
hw123456 + 5

查看全部打赏

73

主题

469

帖子

1005

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1005
沙发
发表于 2021-4-27 14:07:21   只看该作者
感谢分享
快速回复 返回顶部 返回列表