打印
[51单片机]

见鬼了,为什么定时器中断中==不执行呢

[复制链接]
2938|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xyz549040622 于 2018-12-19 23:56 编辑

硬件:
单片机型号: STC15W4K32S4
固件版本号: 7.3.5T

出现问题:
一条判断两个变量if(TKeyValue == u8GKey_Value)相等的语句,放在main函数while中可以执行,放在定时器中断中就不会执行。
1.语句if(TKeyValue == u8GKey_Value)判断前使用串口输出两个变量的值,确认是相等的,但就是进不去。
2.这条语句改为if(TKeyValue&&u8GKey_Value)//可以执行的
3.同样是分支语句,这条语句放在case 2中也是可以执行的。
为什么代码复制过来格式不对呢?

  case 1:
      TKeyValue = GetKeyPort();   
                        if(TKeyValue != No_Key_Press1)//
                        {
//                                if(TKeyValue&&u8GKey_Value)//
        if(TKeyValue == u8GKey_Value)
                                {
                                        uKey_Hold_Time++;//
                                        if(uKey_Hold_Time >= 0)//
                                        {
            uGKey_Pressed = TRUE;//
            uKey_State++;//
                                        }
                                        else
                                        {
            uKey_State = 0;//
            u8GKey_Value = No_Key_Press1;
                                        }

                                }
                                else//
                                {
          uKey_State = 0;//
          u8GKey_Value = No_Key_Press1;
                                }
                        }
                        else //
                        {
        uKey_State = 0;//
        u8GKey_Value = No_Key_Press1;
                        }
                        break;
                case 2:        //
      TKeyValue = GetKeyPort();        
                        if(TKeyValue != No_Key_Press1)//
                        {
                                if(TKeyValue == u8GKey_Value)//
                                {
                                        uKey_Hold_Time++;//
                                        if(uKey_Hold_Time >= 200)//
                                        {
            u8GKey_Pressed_1s = TRUE; //
            uKey_State++;//
                                        }
                                }
                        }
                        else//
                        {
        uKey_State = 4;//
                        }
                        break;



相关帖子

沙发
ayb_ice| | 2018-12-20 08:32 | 只看该作者
应该是抖动影起的
GetKeyPort();
这个API获取值是不稳定的,特别是在按键按压或弹起期间

使用特权

评论回复
板凳
gaoyang9992006| | 2018-12-20 08:35 | 只看该作者
一条一条的执行,看看发生了什么,是怎样不执行,跳过去了,还是执行了没有看到效果,还是不进中断

使用特权

评论回复
地板
xyz549040622|  楼主 | 2018-12-20 08:40 | 只看该作者
ayb_ice 发表于 2018-12-20 08:32
应该是抖动影起的
GetKeyPort();
这个API获取值是不稳定的,特别是在按键按压或弹起期间 ...

问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊涂了,搞了这么几年程序,第一次碰到这么奇葩的问题。

使用特权

评论回复
5
xyz549040622|  楼主 | 2018-12-20 08:40 | 只看该作者
gaoyang9992006 发表于 2018-12-20 08:35
一条一条的执行,看看发生了什么,是怎样不执行,跳过去了,还是执行了没有看到效果,还是不进中断 ...

51没法仿真。

使用特权

评论回复
6
ayb_ice| | 2018-12-20 08:48 | 只看该作者
xyz549040622 发表于 2018-12-20 08:40
问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊 ...

你首先判断不等于之前的值才会处理下面,所以只会在按下或弹起的时间执行,这期间正好不稳定

if(TKeyValue != No_Key_Press1)//
{
    。。。。
}

使用特权

评论回复
7
ayb_ice| | 2018-12-20 08:53 | 只看该作者
xyz549040622 发表于 2018-12-20 08:40
问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊 ...

你的代码逻辑有问题
仔细分析
u8GKey_Value这个变量的赋值不符合逻辑

使用特权

评论回复
8
ayb_ice| | 2018-12-20 09:03 | 只看该作者
xyz549040622 发表于 2018-12-20 08:40
问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊 ...

只有部分代码,不好分析具体原因

使用特权

评论回复
9
xyz549040622|  楼主 | 2018-12-20 09:10 | 只看该作者
ayb_ice 发表于 2018-12-20 09:03
只有部分代码,不好分析具体原因

现在手机,一会上传全部代码看看,这个是我一直用的一个状态机检测程序,一直没问题,这次突然出口了这个bug,我待会重新检查下程序,说不定搞了一天思路乱了。。◕‿◕。

使用特权

评论回复
10
一叶倾城wwq| | 2018-12-20 09:23 | 只看该作者
换个存储地址试试,data、idata、xdata,或者code,之前有个程序各个空间都快满了也出现过一些奇葩问题

使用特权

评论回复
评论
xyz549040622 2018-12-20 19:45 回复TA
我试试这个办法。 
11
ningling_21| | 2018-12-20 10:39 | 只看该作者

把这代码(稍加修改)放在stm32里仿真看看结果如何

使用特权

评论回复
12
rankey| | 2018-12-20 12:23 | 只看该作者
这两个变量类型,会不会不一样?

使用特权

评论回复
13
gaoyang9992006| | 2018-12-20 14:48 | 只看该作者

有个方法,这个句子前后插入一个LED等闪烁的或者串口打印的命令,看看有没有执行前后两个。

使用特权

评论回复
14
xyz549040622|  楼主 | 2018-12-20 19:26 | 只看该作者
本帖最后由 xyz549040622 于 2018-12-20 19:41 编辑
void Key_Scanf(void)
{
        static uint8_t uKey_State = 0;//
        static uint16_t uKey_Hold_Time = 0;//
        uint8_t TKeyValue = 0x00;
        switch(uKey_State)
        {
                case 0:
                        TKeyValue = GetKeyPort();
                        if(TKeyValue != No_Key_Press1)//
                        {
                                u8GKey_Value = TKeyValue;//
                                uKey_State++;//
                        }
                        break;
                case 1:
                        TKeyValue = GetKeyPort();   
                        if(TKeyValue != No_Key_Press1)//
                        {
                                if(TKeyValue&&u8GKey_Value)//
                            // if(TKeyValue == u8GKey_Value)
                                {
                                        uKey_Hold_Time++;//
                                        if(uKey_Hold_Time >= 0)//
                                        {
                                            uGKey_Pressed = TRUE;//
                                            uKey_State++;//
                                        }
                                        else
                                        {
                                            uKey_State = 0;//
                                            u8GKey_Value = No_Key_Press1;
                                        }

                                }
                                else//
                                {
                                    uKey_State = 0;//
                                    u8GKey_Value = No_Key_Press1;
                                }
                        }
                        else //
                        {
                             uKey_State = 0;//
                             u8GKey_Value = No_Key_Press1;
                        }
                        break;
                case 2:        //
                        TKeyValue = GetKeyPort();        
                        if(TKeyValue != No_Key_Press1)//
                        {
                                if(TKeyValue == u8GKey_Value)//
                                {
                                        uKey_Hold_Time++;//
                                        if(uKey_Hold_Time >= 200)//
                                        {
                                            u8GKey_Pressed_1s = TRUE; //
                                            uKey_State++;//
                                        }
                                }
                        }
                        else//
                        {
                           uKey_State = 4;//
                        }
                        break;
                case 3://
                        TKeyValue = GetKeyPort();        
                        if(TKeyValue != No_Key_Press1)//
                        {
                                if(TKeyValue == u8GKey_Value)//
                                {
                                        uKey_Hold_Time++;//
                                        if(uKey_Hold_Time >= 600)//
                                        {
                                            u8GKey_Pressed_3s = TRUE;
                                            uKey_State++;//
                                        }
                                }
                        }
                        else//
                        {
                            uKey_State = 4;//
                        }
                        break;
                case 4:        //
                        TKeyValue = GetKeyPort();  
                        if(TKeyValue == No_Key_Press1)//
                        {
                                uKey_State = 0;//
                                uKey_Hold_Time = 0;
                                u8GKey_Value = No_Key_Press;
                        }
                        break;
                default :
                        break;
        }
}

使用特权

评论回复
15
xyz549040622|  楼主 | 2018-12-20 19:43 | 只看该作者
void Key_Scanf(void)
{
        static uint8_t uKey_State = 0;//
        static uint16_t uKey_Hold_Time = 0;//
        uint8_t TKeyValue = 0x00;
        switch(uKey_State)
        {
                case 0:
                        TKeyValue = GetKeyPort();
                        if(TKeyValue != No_Key_Press1)//
                        {
                                u8GKey_Value = TKeyValue;//
                                uKey_State++;//
                        }
                        break;
                case 1:
                        TKeyValue = GetKeyPort();   
                        if(TKeyValue != No_Key_Press1)//
                        {


使用特权

评论回复
16
xyz549040622|  楼主 | 2018-12-20 19:43 | 只看该作者
ningling_21 发表于 2018-12-20 10:39
把这代码(稍加修改)放在stm32里仿真看看结果如何

STM32中硬件不一样,暂时没法验证。

使用特权

评论回复
17
xyz549040622|  楼主 | 2018-12-20 19:44 | 只看该作者
ayb_ice 发表于 2018-12-20 09:03
只有部分代码,不好分析具体原因

见14楼的代码。

使用特权

评论回复
18
xyz549040622|  楼主 | 2018-12-20 19:44 | 只看该作者
rankey 发表于 2018-12-20 12:23
这两个变量类型,会不会不一样?

都是uint8_t类型的。

使用特权

评论回复
19
xyz549040622|  楼主 | 2018-12-20 19:45 | 只看该作者
gaoyang9992006 发表于 2018-12-20 14:48
有个方法,这个句子前后插入一个LED等闪烁的或者串口打印的命令,看看有没有执行前后两个。 ...

判断之前串口打印两者的值了,确定是相等的。

使用特权

评论回复
20
xyz549040622|  楼主 | 2018-12-20 20:11 | 只看该作者
一叶倾城wwq 发表于 2018-12-20 09:23
换个存储地址试试,data、idata、xdata,或者code,之前有个程序各个空间都快满了也出现过一些奇葩问题[em: ...

修改了也没用,纠结。

使用特权

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

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝