打印
[STM32L0]

用STM32L053做矩阵键盘的代码为什么IO口读不出数据

[复制链接]
159|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
麻烦各位帮忙看看
#include "KEY.h"
#define KEY_PIN_1            GPIO_PIN_0
#define KEY_PIN_2            GPIO_PIN_1
#define KEY_PIN_3            GPIO_PIN_2
#define KEY_PIN_4            GPIO_PIN_3
#define KEY_PIN_5            GPIO_PIN_4
#define KEY_PIN_6            GPIO_PIN_5
#define KEY_PIN_7            GPIO_PIN_6
#define KEY_PIN_8            GPIO_PIN_7
#define KEY_PIN_ALL         KEY_PIN_1|KEY_PIN_2|KEY_PIN_3|KEY_PIN_4|KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8
#define KEY_PORT             GPIOB

void GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;
        
  __HAL_RCC_GPIOB_CLK_ENABLE();
        __HAL_RCC_GPIOA_CLK_ENABLE();
        //__HAL_RCC_GPIOH_CLK_ENABLE();
        
  GPIO_InitStruct.Pin = KEY_PIN_1|KEY_PIN_2|KEY_PIN_3|KEY_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);
        
        GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
        
        GPIO_InitStruct.Pin = KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  //GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        
  HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);
}

unsigned char HL_Scan(void)
{
        unsigned char KeyVal=0;
        unsigned key=0;
        //unsigned int WriteVal=0;
        if(key==0)
        {
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_1|KEY_PIN_2|KEY_PIN_3|KEY_PIN_4,GPIO_PIN_SET);
                if(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8)==0)
                {
                        key=0;
                        return 0;
                }
                else
                {
                        HAL_Delay(5);
                        if(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8)==0)
                        {
                                key=0;
                                return 0;
                        }
                        else
                                key=1;
                }
        }
        if(key==1)
        {        
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_1,GPIO_PIN_SET);
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_2|KEY_PIN_3|KEY_PIN_4,GPIO_PIN_RESET);
                switch(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8)&0xf0)
                {
                        case 0x10: KeyVal=15;        break;
                        case 0x20: KeyVal=11;        break;
                        case 0x40: KeyVal=7;        break;
                        case 0x80: KeyVal=3;        break;
                }
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_2,GPIO_PIN_SET);
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_1|KEY_PIN_3|KEY_PIN_4,GPIO_PIN_RESET);
                switch(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8)&0xf0)
                {
                        case 0x10: KeyVal=14;        break;
                        case 0x20: KeyVal=10;        break;
                        case 0x40: KeyVal=6;        break;
                        case 0x80: KeyVal=2;        break;
                }
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_3,GPIO_PIN_SET);
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_1|KEY_PIN_2|KEY_PIN_4,GPIO_PIN_RESET);
                switch(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8)&0xf0)
                {
                        case 0x10: KeyVal=13;        break;
                        case 0x20: KeyVal=9;        break;
                        case 0x40: KeyVal=5;        break;
                        case 0x80: KeyVal=1;        break;
                }
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_4,GPIO_PIN_SET);
                HAL_GPIO_WritePin(KEY_PORT,KEY_PIN_1|KEY_PIN_2|KEY_PIN_3,GPIO_PIN_RESET);
                switch(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8)&0xf0)
                {
                        case 0x10: KeyVal=12;        break;
                        case 0x20: KeyVal=8;        break;
                        case 0x40: KeyVal=4;        break;
                        case 0x80: KeyVal=0;        break;
                }
                key=0;
        }
        return KeyVal;
}

使用特权

评论回复
沙发
stormwind123| | 2024-7-28 14:26 | 只看该作者
是不是不引脚配置错误

使用特权

评论回复
板凳
laocuo1142| | 2024-7-28 14:27 | 只看该作者
可能是初始化代码问题,确保没有遗漏或错误配置。

使用特权

评论回复
地板
jcky001| | 2024-7-28 14:30 | 只看该作者
检查电源和地符不符要求

使用特权

评论回复
5
elephant00| | 2024-7-28 14:33 | 只看该作者
如果您的设计中使用了中断来读取键盘,请检查中断是否被正确配置,并且中断优先级设置是否合适。

使用特权

评论回复
6
powerantone| | 2024-7-28 15:00 | 只看该作者
检查矩阵键盘与STM32L053之间的连接是否稳固可靠,没有接触不良或短路现象。

使用特权

评论回复
7
probedog| | 2024-7-28 16:00 | 只看该作者
如果在读取键盘时没有实现去抖动,可能会导致读取到错误的数据。在读取按键之前,应该实现一个去抖动机制,例如通过延时函数等待一段时间再读取。

使用特权

评论回复
8
两只袜子| | 2024-7-28 17:05 | 只看该作者
扫描逻辑错误?

使用特权

评论回复
9
yiy| | 2024-7-28 21:41 | 只看该作者
有上拉电阻吗

使用特权

评论回复
10
yiy| | 2024-7-28 21:43 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

607

主题

2215

帖子

0

粉丝