[51单片机] 见鬼了,为什么定时器中断中==不执行呢

[复制链接]
 楼主| xyz549040622 发表于 2018-12-19 23:54 | 显示全部楼层 |阅读模式
本帖最后由 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中也是可以执行的。
为什么代码复制过来格式不对呢?

  1.   case 1:
  2.       TKeyValue = GetKeyPort();   
  3.                         if(TKeyValue != No_Key_Press1)//
  4.                         {
  5. //                                if(TKeyValue&&u8GKey_Value)//
  6.         if(TKeyValue == u8GKey_Value)
  7.                                 {
  8.                                         uKey_Hold_Time++;//
  9.                                         if(uKey_Hold_Time >= 0)//
  10.                                         {
  11.             uGKey_Pressed = TRUE;//
  12.             uKey_State++;//
  13.                                         }
  14.                                         else
  15.                                         {
  16.             uKey_State = 0;//
  17.             u8GKey_Value = No_Key_Press1;
  18.                                         }

  19.                                 }
  20.                                 else//
  21.                                 {
  22.           uKey_State = 0;//
  23.           u8GKey_Value = No_Key_Press1;
  24.                                 }
  25.                         }
  26.                         else //
  27.                         {
  28.         uKey_State = 0;//
  29.         u8GKey_Value = No_Key_Press1;
  30.                         }
  31.                         break;
  32.                 case 2:        //
  33.       TKeyValue = GetKeyPort();        
  34.                         if(TKeyValue != No_Key_Press1)//
  35.                         {
  36.                                 if(TKeyValue == u8GKey_Value)//
  37.                                 {
  38.                                         uKey_Hold_Time++;//
  39.                                         if(uKey_Hold_Time >= 200)//
  40.                                         {
  41.             u8GKey_Pressed_1s = TRUE; //
  42.             uKey_State++;//
  43.                                         }
  44.                                 }
  45.                         }
  46.                         else//
  47.                         {
  48.         uKey_State = 4;//
  49.                         }
  50.                         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获取值是不稳定的,特别是在按键按压或弹起期间 ...

问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊涂了,搞了这么几年程序,第一次碰到这么奇葩的问题。
 楼主| xyz549040622 发表于 2018-12-20 08:40 | 显示全部楼层
gaoyang9992006 发表于 2018-12-20 08:35
一条一条的执行,看看发生了什么,是怎样不执行,跳过去了,还是执行了没有看到效果,还是不进中断 ...

51没法仿真。
ayb_ice 发表于 2018-12-20 08:48 | 显示全部楼层
xyz549040622 发表于 2018-12-20 08:40
问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊 ...

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

if(TKeyValue != No_Key_Press1)//
{
    。。。。
}
ayb_ice 发表于 2018-12-20 08:53 | 显示全部楼层
xyz549040622 发表于 2018-12-20 08:40
问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊 ...

你的代码逻辑有问题
仔细分析
u8GKey_Value这个变量的赋值不符合逻辑
ayb_ice 发表于 2018-12-20 09:03 | 显示全部楼层
xyz549040622 发表于 2018-12-20 08:40
问题是不管按多久,这个判断永远不会执行,判断这两个值相等之前,使用串口输出两个值,是相等的。我也糊 ...

只有部分代码,不好分析具体原因
 楼主| xyz549040622 发表于 2018-12-20 09:10 来自手机 | 显示全部楼层
ayb_ice 发表于 2018-12-20 09:03
只有部分代码,不好分析具体原因

现在手机,一会上传全部代码看看,这个是我一直用的一个状态机检测程序,一直没问题,这次突然出口了这个bug,我待会重新检查下程序,说不定搞了一天思路乱了。。◕‿◕。
一叶倾城wwq 发表于 2018-12-20 09:23 | 显示全部楼层
换个存储地址试试,data、idata、xdata,或者code,之前有个程序各个空间都快满了也出现过一些奇葩问题

评论

我试试这个办法。  发表于 2018-12-20 19:45
ningling_21 发表于 2018-12-20 10:39 | 显示全部楼层

把这代码(稍加修改)放在stm32里仿真看看结果如何
rankey 发表于 2018-12-20 12:23 | 显示全部楼层
这两个变量类型,会不会不一样?
gaoyang9992006 发表于 2018-12-20 14:48 | 显示全部楼层

有个方法,这个句子前后插入一个LED等闪烁的或者串口打印的命令,看看有没有执行前后两个。
 楼主| xyz549040622 发表于 2018-12-20 19:26 | 显示全部楼层
本帖最后由 xyz549040622 于 2018-12-20 19:41 编辑
  1. void Key_Scanf(void)
  2. {
  3.         static uint8_t uKey_State = 0;//
  4.         static uint16_t uKey_Hold_Time = 0;//
  5.         uint8_t TKeyValue = 0x00;
  6.         switch(uKey_State)
  7.         {
  8.                 case 0:
  9.                         TKeyValue = GetKeyPort();
  10.                         if(TKeyValue != No_Key_Press1)//
  11.                         {
  12.                                 u8GKey_Value = TKeyValue;//
  13.                                 uKey_State++;//
  14.                         }
  15.                         break;
  16.                 case 1:
  17.                         TKeyValue = GetKeyPort();   
  18.                         if(TKeyValue != No_Key_Press1)//
  19.                         {
  20.                                 if(TKeyValue&&u8GKey_Value)//
  21.                             // if(TKeyValue == u8GKey_Value)
  22.                                 {
  23.                                         uKey_Hold_Time++;//
  24.                                         if(uKey_Hold_Time >= 0)//
  25.                                         {
  26.                                             uGKey_Pressed = TRUE;//
  27.                                             uKey_State++;//
  28.                                         }
  29.                                         else
  30.                                         {
  31.                                             uKey_State = 0;//
  32.                                             u8GKey_Value = No_Key_Press1;
  33.                                         }

  34.                                 }
  35.                                 else//
  36.                                 {
  37.                                     uKey_State = 0;//
  38.                                     u8GKey_Value = No_Key_Press1;
  39.                                 }
  40.                         }
  41.                         else //
  42.                         {
  43.                              uKey_State = 0;//
  44.                              u8GKey_Value = No_Key_Press1;
  45.                         }
  46.                         break;
  47.                 case 2:        //
  48.                         TKeyValue = GetKeyPort();        
  49.                         if(TKeyValue != No_Key_Press1)//
  50.                         {
  51.                                 if(TKeyValue == u8GKey_Value)//
  52.                                 {
  53.                                         uKey_Hold_Time++;//
  54.                                         if(uKey_Hold_Time >= 200)//
  55.                                         {
  56.                                             u8GKey_Pressed_1s = TRUE; //
  57.                                             uKey_State++;//
  58.                                         }
  59.                                 }
  60.                         }
  61.                         else//
  62.                         {
  63.                            uKey_State = 4;//
  64.                         }
  65.                         break;
  66.                 case 3://
  67.                         TKeyValue = GetKeyPort();        
  68.                         if(TKeyValue != No_Key_Press1)//
  69.                         {
  70.                                 if(TKeyValue == u8GKey_Value)//
  71.                                 {
  72.                                         uKey_Hold_Time++;//
  73.                                         if(uKey_Hold_Time >= 600)//
  74.                                         {
  75.                                             u8GKey_Pressed_3s = TRUE;
  76.                                             uKey_State++;//
  77.                                         }
  78.                                 }
  79.                         }
  80.                         else//
  81.                         {
  82.                             uKey_State = 4;//
  83.                         }
  84.                         break;
  85.                 case 4:        //
  86.                         TKeyValue = GetKeyPort();  
  87.                         if(TKeyValue == No_Key_Press1)//
  88.                         {
  89.                                 uKey_State = 0;//
  90.                                 uKey_Hold_Time = 0;
  91.                                 u8GKey_Value = No_Key_Press;
  92.                         }
  93.                         break;
  94.                 default :
  95.                         break;
  96.         }
  97. }

 楼主| xyz549040622 发表于 2018-12-20 19:43 | 显示全部楼层
  1. void Key_Scanf(void)
  2. {
  3.         static uint8_t uKey_State = 0;//
  4.         static uint16_t uKey_Hold_Time = 0;//
  5.         uint8_t TKeyValue = 0x00;
  6.         switch(uKey_State)
  7.         {
  8.                 case 0:
  9.                         TKeyValue = GetKeyPort();
  10.                         if(TKeyValue != No_Key_Press1)//
  11.                         {
  12.                                 u8GKey_Value = TKeyValue;//
  13.                                 uKey_State++;//
  14.                         }
  15.                         break;
  16.                 case 1:
  17.                         TKeyValue = GetKeyPort();   
  18.                         if(TKeyValue != No_Key_Press1)//
  19.                         {


 楼主| xyz549040622 发表于 2018-12-20 19:43 | 显示全部楼层
ningling_21 发表于 2018-12-20 10:39
把这代码(稍加修改)放在stm32里仿真看看结果如何

STM32中硬件不一样,暂时没法验证。
 楼主| xyz549040622 发表于 2018-12-20 19:44 | 显示全部楼层
ayb_ice 发表于 2018-12-20 09:03
只有部分代码,不好分析具体原因

见14楼的代码。
 楼主| xyz549040622 发表于 2018-12-20 19:44 | 显示全部楼层
rankey 发表于 2018-12-20 12:23
这两个变量类型,会不会不一样?

都是uint8_t类型的。
 楼主| xyz549040622 发表于 2018-12-20 19:45 | 显示全部楼层
gaoyang9992006 发表于 2018-12-20 14:48
有个方法,这个句子前后插入一个LED等闪烁的或者串口打印的命令,看看有没有执行前后两个。 ...

判断之前串口打印两者的值了,确定是相等的。
 楼主| xyz549040622 发表于 2018-12-20 20:11 | 显示全部楼层
一叶倾城wwq 发表于 2018-12-20 09:23
换个存储地址试试,data、idata、xdata,或者code,之前有个程序各个空间都快满了也出现过一些奇葩问题[em: ...

修改了也没用,纠结。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2841

主题

19330

帖子

110

粉丝
快速回复 在线客服 返回列表 返回顶部