金豆大战斗帝 2023-01-25 03:04 采纳率: 33.3%
浏览 149
已结题

stmSTM32L476 4x4矩阵键盘

想请各位帮忙
用的是 stmSTM32L476 4x4矩阵键盘
参考逐行逐列扫描法,不知为何不工作
下面是我的代码,求帮忙(给各位拜年了)


```c

#include "stm32l476xx.h"

#include "keypad.h"

void Keypad_Init() {

    //激活GPIOC 时钟
    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;
    
    //设置输出 PIN 0, PIN1, PIN 2, PIN3, 
    GPIOC->MODER &= ~(GPIO_MODER_MODE0 | GPIO_MODER_MODE1 | GPIO_MODER_MODE2 | GPIO_MODER_MODE3);                            
    GPIOC->MODER |= (GPIO_MODER_MODE0_0 | GPIO_MODER_MODE1_0 | GPIO_MODER_MODE2_0 | GPIO_MODER_MODE3_0);            

    //设置输入PIN4,PIN10, PIN11,PIN12
    GPIOC->MODER &= ~(GPIO_MODER_MODE4 | GPIO_MODER_MODE10 | GPIO_MODER_MODE11 | GPIO_MODER_MODE12);                

    //选择 open train 模式
    GPIOC->OTYPER |= (GPIO_IDR_ID0 | GPIO_IDR_ID1 | GPIO_IDR_ID2 | GPIO_IDR_ID3);      
}

unsigned char keypad_scan() {
    unsigned char row, col;
    unsigned char key;

    unsigned char keymap[4][4] = {
        {'1','2','3','A'},
        {'4','5','6','B'},
        {'7','8','9','C'},
        {'*','0','#','D'}
    };
    /* 这里我做的是 4x4 键盘
    输出          1    2    3   A
    输出          4    5    6   B
    输出          7    8    9   C
    输出          *    0    #   D
                             4个输入
    */


    // 设置 outputmask 为一个整数
    uint32_t  outputMask = GPIO_ODR_OD0 | GPIO_ODR_OD1 | GPIO_ODR_OD2 | GPIO_ODR_OD3;
    // 设置 intputmask 为一个整数
    uint32_t  inputMask = GPIO_IDR_ID4 | GPIO_IDR_ID10 | GPIO_IDR_ID11 | GPIO_IDR_ID12;


    // output 数组
    uint32_t  outputArray[4] = { GPIO_ODR_OD0 , GPIO_ODR_OD1 , GPIO_ODR_OD2 , GPIO_ODR_OD3 };
    // intput 数组
    uint32_t inputArray[4] = { GPIO_IDR_ID4 , GPIO_IDR_ID10 , GPIO_IDR_ID11 , GPIO_IDR_ID12 };

    
    waitms(3);    // 延迟

    while( (GPIOC->IDR & inputMask) == inputMask) {;} // 等待按键
    _output = 0xF; //先让输出都为0
            
    for(row = 0; row < 4; row++) {          // 检测横列
            
                GPIOC->ODR &= ~(outputArray[row]);  让单个输出依次为0
    
                waitms(3); // short delay  
                
                for(col = 0; col < 4; col++) {  // 检测竖排
                        if((GPIOC->IDR & inputArray[col]) == 0  ){  //如果 输入 and 输出 不为1 
                            key = keymap[row][col];  //在矩阵数组中确认按下的位置
                            return key; 
                        }
                }        
        }
    return 0xFF; //如果没有按键 返回0xFF
}

//  延迟fuction 
void waitms(unsigned int ms) {
    int i, j;
    for(i = 0; i < ms; i++) {
        for(j=0; j < 4000; j++);
    }
}


```

  • 写回答

4条回答 默认 最新

  • 阳光宅男xxb 2023-01-25 10:36
    关注

    根据您的描述的问题,关于stm32l476矩阵键盘的实现,您给出的代码,是有什么问题吗,报错了还是咋样,还是说需要继续完善,关于stm32l476的编程,你可以参考编程手册:
    STM32L476编程手册【翻译】【中文版】.pdf
    https://download.csdn.net/download/feiniao200201/35869675

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月1日
  • 修改了问题 1月29日
  • 修改了问题 1月29日
  • 赞助了问题酬金50元 1月25日
  • 展开全部

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?