bootgames 发表于 2012-11-28 11:07:24

如何检测IO口上下沿C程序

本帖最后由 bootgames 于 2012-11-28 14:51 编辑

高手给写个程序
单片机的PF0设置为输入,
外部信号给PF0先来一个低电平再来一个高电平,这就产生了一个上升沿,
利用这个上升沿进行其他操作。

takashiki 发表于 2012-11-28 15:18:46

异或啊,这个才是有用的。

uchar SavedPinState;                                             //保存引脚状态,变量类型根据编译器更改

while(1){
    if(SavedPinState ^ CurrentPinState){                     //边沿触发
       SavedPinState = CurrentPinState;                      //保存状态
       if(SavedPinState){                                          //上升沿
         ...
       } else {                                                      //下降沿
          ...
      }
   }
}

takashiki 发表于 2012-11-29 22:07:41

bootgames 发表于 2012-11-29 09:55 static/image/common/back.gif
SavedPF0 --;                                        //PF0发生了跳变,电平方向必定改变

这句不大明 ...

这个是对运算速度进行优化的,一个小技巧而已,一般情况下不这样写。
因为PF0是最低位,发生了边沿变化,而++、--恰好使得最低位变化,而从题目要求中高7位都可以不予理会,所以可以这么写。其他的写法还有直接取反。因为一般情况下,++、--、取反比赋值所用的时间要短。


你那个写法当然也是可以的,只不过效率没有那么高而已。

haizheng4 发表于 2012-11-28 11:11:37

外部中断应该能搞定吧

bootgames 发表于 2012-11-28 11:15:09

不是中断IO口
只能普通操作

shower.xu 发表于 2012-11-28 11:17:47

只要这些功能的话小定时或延时循环检测IO电平,去抖获得上升沿,再计算输出

bootgames 发表于 2012-11-28 11:20:10

    if( (PINF & ( 1 << DDF0 )) == 0 )
    {
      LowLevel=1;
    }
    Delayms(10);
    if( (PINF & ( 1 << DDF0 )) == 1 )
    {
      HighLevel=1;
    }

    LevelState = LowLevel & HighLevel;

这样OK?

STM_FPGA 发表于 2012-11-28 11:23:37

单片机的IO口反复出现高 低电平,当低电平转为高电平的时候单片机启动测试。这句话是下面两句的总结?
如果当前IO口为低电平,则变量1等于1,
如果当前IO口为高电平,则变量2等于1,


如果当前IO口为低电平,则变量1等于1,--变量2是该如何变化
如果当前IO口为高电平,则变量2等于1,--变量1是该如何变化



liuchangyin 发表于 2012-11-28 11:26:26

开定时器定时扫描IO{:smile:}

bootgames 发表于 2012-11-28 11:43:17

不用定时器

dgdzas 发表于 2012-11-28 14:06:48

楼主题目不清楚

bootgames 发表于 2012-11-28 14:51:20

dgdzas 发表于 2012-11-28 14:06 static/image/common/back.gif
楼主题目不清楚

单片机的PF0设置为输入,
外部信号给PF0先来一个低电平再来一个高电平,这就产生了一个上升沿,
利用这个上升沿进行其他操作。

bootgames 发表于 2012-11-28 14:58:19

    U8 OK;
    U8 HighLevel;
    U8 LowLevel;
    U8 LevelState;
    if( (PINF & ( 1 << DDF0 )) == 0 )//判断PF0的电平 低电平则进行处理
    {
      Delayms(10);
      HighLevel=1; //PF0是低电平 则状态HighLevel置1
   
      while(1)
      {
      if( (PINF & ( 1 << DDF0 )) == 1 )//检测PF0的电平, 即判断是否是上升沿,如果是 ,跳出 ,否则继续while
      {
          LowLevel=1; //PF0是搞电平 则状态LowLevel置1
          break;
      }
      }
   
      LevelState = HighLevel & LowLevel;
      
      if( LevelState == 1 )
      {
      OK = TRUE;
      HighLevel=0;
      LowLevel=0;
      }else
         {
            OK = FALSE;
         }
    }

takashiki 发表于 2012-11-28 11:07:25

更具体到你这个题目进行优化,只检测PF0的上升沿:
uchar SavedPF0 = PINF;                              //保存引脚状态,保存了8位

while(1){
    if((SavedPF0 ^ PINF)& 1)){                     //边沿触发,只检测第0位变化的情况
       SavedPF0 --;                                        //PF0发生了跳变,电平方向必定改变
       if(SavedPF0 & 1){                                  //上升沿
         ...
       }
   }
}

Free_Bird 发表于 2012-11-28 20:41:55

12L&13L的不错,学习了;嘿嘿

OKKK 发表于 2012-11-28 23:57:16

12L很好,学习了

bootgames 发表于 2012-11-29 09:55:32

takashiki 发表于 2012-11-28 15:32 static/image/common/back.gif
更具体到你这个题目进行优化,只检测PF0的上升沿:
uchar SavedPF0 = PINF;                               ...

SavedPF0 --;                                        //PF0发生了跳变,电平方向必定改变

这句不大明白 “SavedPF0 --"是做什么?

我写的那个运行起来也可以啊

desert2012sz 发表于 2012-11-29 10:09:54

不错,学习了
页: [1]
查看完整版本: 如何检测IO口上下沿C程序