[关闭]
@floatsd 2016-01-02T03:02:16.000000Z 字数 2252 阅读 1044

实验二 矩阵按键

CM4实验报告


实验目的

  • 熟悉和掌握矩阵式键盘的工作原理、电路设计和软件编程方法。
  • 熟悉和掌握矩阵键盘的行列扫描法

实验原理

信号 端口 信号 端口
ROW1_IN PP2 COL1_OUT PD1
ROW2_IN PN3 COL2_OUT PH3
ROW3_IN PN2 COL3_OUT PH2
ROW4_IN PD0 COL4_OUT PM3
Created with Raphaël 2.1.2Start列循环低电平扫描行值有键按下确定是哪个键调用对应程序Endyesno

实现功能

实验代码

矩阵按钮初始化

  1. /*******************************************************************
  2. * 函数: Toggle_Init()
  3. * 描述: 配置使能矩阵按钮gpio口
  4. * 输入值:无
  5. * 返回值:无
  6. *****************************************************************/
  7. void Toggle_Init()
  8. {
  9. //使能引脚
  10. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);
  11. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
  12. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
  13. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH);
  14. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOM);
  15. //输入配置
  16. GPIOPinTypeGPIOInput(GPIOP, GPIO_PIN_2);
  17. GPIOPinTypeGPIOInput(GPION, GPIO_PIN_2|GPIO_PIN_3);
  18. GPIOPinTypeGPIOInput(GPIOD, GPIO_PIN_0);
  19. //输出配置
  20. GPIOPinTypeGPIOOutput(GPIOD, GPIO_PIN_1);
  21. GPIOPinTypeGPIOOutput(GPIOH, GPIO_PIN_2|GPIO_PIN_3);
  22. GPIOPinTypeGPIOOutput(GPIOM, GPIO_PIN_3);
  23. //设置行都为高电平,列为低电平
  24. R1h();
  25. R2h();
  26. R3h();
  27. R4h();
  28. C1l();
  29. C2l();
  30. C3l();
  31. C4l();
  32. }

按键扫描函数

  1. /*******************************************************************
  2. * 函数: Row_Scan()
  3. * 描述: 扫描行或列返回电平被拉低的行/列
  4. * 输入值:无
  5. * 返回值:uint8_t
  6. *****************************************************************/
  7. uint8_t Row_Scan(){
  8. uint8_t r0,r1,r2,r3;
  9. r0 = GPIOPinRead(GPIOP, GPIO_PIN_2);
  10. r1 = GPIOPinRead(GPION, GPIO_PIN_2);
  11. r2 = GPIOPinRead(GPION, GPIO_PIN_3);
  12. r3 = GPIOPinRead(GPIOD, GPIO_PIN_0);
  13. if(r0==0x00){
  14. return 0;
  15. }
  16. else if(r1==0x00){
  17. return 1;
  18. }
  19. else if(r2==0x00){
  20. return 2;
  21. }
  22. else if(r3==0x00){
  23. return 3;
  24. }
  25. else return 4;
  26. }

识别哪一行按键按下

  1. /*******************************************************************
  2. * 函数: Toggle_Loop()
  3. * 描述: 这里做的是检测被按下的行,本来是套了两个Row_Scan分别检测行列
  4. * 输入值:无
  5. * 返回值:无
  6. *****************************************************************/
  7. void Toggle_Loop(){
  8. ledclose();
  9. while(true){
  10. switch(Row_Scan()){
  11. case 0:led0(); break;
  12. case 1:led2(); break;
  13. case 2:led4(); break;
  14. case 3:ledrun(1); break;
  15. default:ledclose();break;
  16. }Delay(24);
  17. }
  18. }

实验结论

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注