你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
贫道5 提问时间:2018-3-17 09:29 /
麻烦各位帮忙看看
#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;
}

点评

先把前一个帖子的情况总结一下  发表于 2018-3-20 09:36
收藏 评论13 发布时间:2018-3-17 09:29

举报

13个回答
七哥 回答时间:2018-3-17 22:11:16
先把前一个帖子的情况总结一下。
琦子 回答时间:2018-3-17 09:33:33
楼主 io口模式是不是应该设置为上拉啊,还有就是您那个外部电路上有上拉电阻吗

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

MrJiu 回答时间:2018-3-17 09:56:09
读不出数据啥意思?是数据出错,还是数据随机变化?

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

贫道5 回答时间:2018-3-17 10:10:58
bargagebaobei 发表于 2018-3-17 09:33
楼主 io口模式是不是应该设置为上拉啊,还有就是您那个外部电路上有上拉电阻吗 ...

你说的是输入改成上拉,还是输出改成上拉?外部没有上拉电阻
贫道5 回答时间:2018-3-17 10:12:28
MrJiu 发表于 2018-3-17 09:56
读不出数据啥意思?是数据出错,还是数据随机变化?

我用万用表测管脚的电压是正确的,可结果读取管脚高低电平的时候就是进不了swicth语句。。。
贫道5 回答时间:2018-3-17 10:13:29
MrJiu 发表于 2018-3-17 09:56
读不出数据啥意思?是数据出错,还是数据随机变化?

是不是switch(HAL_GPIO_ReadPin(KEY_PORT,KEY_PIN_5|KEY_PIN_6|KEY_PIN_7|KEY_PIN_8)&0xf0)我这句代码出问题了
琦子 回答时间:2018-3-17 10:28:26
输出的引脚啊  应该是上拉啊
琦子 回答时间:2018-3-17 10:30:22
另外我理解输入引脚应该是加一个电阻接地 然后键盘按下之后就接到了高电平 这样输入引脚就应该检测到高电平的输入

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

jianzhirao 回答时间:2018-3-17 13:39:19
感谢大佬
x5y4z3 回答时间:2018-3-17 16:25:01
藉由此帖亦受益良多。
feixiang20 回答时间:2018-3-17 22:18:15
是不是循环有问题啊,一般参数循环错误也会读不出

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

埃斯提爱慕 回答时间:2018-3-19 18:23:05
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版