搜索
bottom↓
回复: 17

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

[复制链接]

出0入0汤圆

发表于 2012-11-28 11:07:24 | 显示全部楼层 |阅读模式
本帖最后由 bootgames 于 2012-11-28 14:51 编辑

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入93汤圆

发表于 2012-11-28 15:18:46 | 显示全部楼层
异或啊,这个才是有用的。

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

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

出0入93汤圆

发表于 2012-11-29 22:07:41 | 显示全部楼层
bootgames 发表于 2012-11-29 09:55
SavedPF0 --;                                        //PF0发生了跳变,电平方向必定改变

这句不大明 ...

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


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

出0入0汤圆

发表于 2012-11-28 11:11:37 | 显示全部楼层
外部中断应该能搞定吧

出0入0汤圆

 楼主| 发表于 2012-11-28 11:15:09 | 显示全部楼层
不是中断IO口
只能普通操作

出0入0汤圆

发表于 2012-11-28 11:17:47 | 显示全部楼层
只要这些功能的话小定时或延时循环检测IO电平,去抖获得上升沿,再计算输出

出0入0汤圆

 楼主| 发表于 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?

出0入0汤圆

发表于 2012-11-28 11:23:37 | 显示全部楼层
单片机的IO口反复出现高 低电平,当低电平转为高电平的时候单片机启动测试。这句话是下面两句的总结?
如果当前IO口为低电平,则变量1等于1,
如果当前IO口为高电平,则变量2等于1,


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



  

出0入0汤圆

发表于 2012-11-28 11:26:26 | 显示全部楼层
开定时器定时扫描IO

出0入0汤圆

 楼主| 发表于 2012-11-28 11:43:17 | 显示全部楼层
不用定时器

出0入0汤圆

发表于 2012-11-28 14:06:48 | 显示全部楼层
楼主题目不清楚

出0入0汤圆

 楼主| 发表于 2012-11-28 14:51:20 | 显示全部楼层
dgdzas 发表于 2012-11-28 14:06
楼主题目不清楚

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

出0入0汤圆

 楼主| 发表于 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;
           }
    }

出0入93汤圆

发表于 2012-11-28 11:07:25 | 显示全部楼层
更具体到你这个题目进行优化,只检测PF0的上升沿:
uchar SavedPF0 = PINF;                                //保存引脚状态,保存了8位

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

出0入0汤圆

发表于 2012-11-28 20:41:55 | 显示全部楼层
12L&13L的不错,学习了;嘿嘿

出0入0汤圆

发表于 2012-11-28 23:57:16 | 显示全部楼层
12L很好,学习了

出0入0汤圆

 楼主| 发表于 2012-11-29 09:55:32 | 显示全部楼层
takashiki 发表于 2012-11-28 15:32
更具体到你这个题目进行优化,只检测PF0的上升沿:
uchar SavedPF0 = PINF;                               ...

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

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

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

出0入0汤圆

发表于 2012-11-29 10:09:54 | 显示全部楼层
不错,学习了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 05:17

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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