OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2502|回复: 3

第一次发帖,希望大家指点一下菜鸟,谢谢!

[复制链接]

1

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-12-22
在线时间
7 小时
发表于 2017-1-7 18:03:06 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 modongwei 于 2017-1-7 18:26 编辑

@正点原子 我在用STM8S写一个独立按键的程序,使用IAR for stm8软件,遇到奇怪的问题,希望高手给我指点迷津,详细如下:

先看程序
[mw_shl_code=applescript,true]typedef enum//枚举变量
{
    KEY_DOWN = 0,
    KEY_UP   = 1,
    KEY_WAIT = 2,
}KEYState_TypeDef;

void KEY_Init(void)//初始化
{  
    GPIO_Init(K1_PORT,   K1_PIN,   GPIO_MODE_IN_PU_NO_IT );//浮动输入无中断功能
    GPIO_Init(Touch_PORT,Touch_PIN,GPIO_MODE_IN_PU_NO_IT );  
}

KEYState_TypeDef keycan(GPIO_TypeDef* GPIOx,GPIO_Pin_TypeDef GPIO_Pin,u8 KEY_ID)
{
  
static KEYState_TypeDef KEY_State[4]={KEY_UP,KEY_UP,KEY_UP,KEY_UP};   //存入每个按键状态

    if(KEY_State[KEY_ID]==KEY_UP)
    {
            if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) == RESET)
            {
                   delay_ms(20);//消抖
                    if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) == RESET)
                    {        
                            KEY_State[KEY_ID]=KEY_DOWN;//按键按下
                    }
            }
    }
    else
    {
        if(KEY_State[KEY_ID]!=KEY_UP)
        {
   //!!请注意这里,我的问题就出现在这里,如果改成【 if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) != RESET)】程序就正常了;                 
          if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) == SET)
            {
                KEY_State[KEY_ID]=KEY_UP;//按键松开
            }
            else
            {
                KEY_State[KEY_ID]=KEY_WAIT;//按键没有松开,进入等待状态
            }
        }
    }

    return KEY_State[KEY_ID];
}[/mw_shl_code]


我在调试界面查看Watch1
1、当按键按下之后

按下之后

按下之后

2、当按键松开之后 QQ截图20170107175002.jpg

我就怀疑是这句有问题了GPIO_ReadInputPin(GPIOx, GPIO_Pin) == SET,松开之后不是高电平??
改成 if(GPIO_ReadInputPin(GPIOx, GPIO_Pin) != RESET)程序就正常了;
正常状态下Watch1显示结果如下:
1、当按键按下之后

22

22

2、当按键一直按着

不松

不松


3、当按键松开之后 4.jpg
我想知道怎么在Watch1界面查看GPIO_ReadInputPin读上来的的值,STM8库函数里面不是说:
GPIO_ReadInputPin()返回值是电平状态:
1、RESET,复位状态,低电平;
2、SET,置位状态,高电平;

难道高电平不是1?还是我的程序有错误吗?



我是一个业余单片机爱好者。
简单的事情重复做,重复的事情用心做,用心的事情坚持做
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2016-12-22
在线时间
7 小时
 楼主| 发表于 2017-1-7 18:09:57 | 显示全部楼层
补充一下,调用

[mw_shl_code=applescript,true]void key_Demo()
{
    if(keycan(K1_PORT,K1_PIN,0)== KEY_DOWN)
    {
        LED1_R;//LED状态取反
    }
    if(keycan(Touch_PORT,Touch_PIN,1)== KEY_DOWN)
    {
      KM1_R;
    }
}

[/mw_shl_code]
我是一个业余单片机爱好者。
简单的事情重复做,重复的事情用心做,用心的事情坚持做
回复

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2017-1-9 15:13:20 | 显示全部楼层
首先赞一下楼主的状态机按键风格。

猜测问题出在IO口初始化上,楼主给IO口初始化为了浮空输入,改成上拉输入尝试一下。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复

使用道具 举报

头像被屏蔽

106

主题

157

帖子

0

精华

禁止访问

积分
1263
金钱
1263
注册时间
2014-3-7
在线时间
90 小时
发表于 2017-1-10 08:24:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-6-28 22:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表