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

用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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版