如何检测IO口上下沿C程序
本帖最后由 bootgames 于 2012-11-28 14:51 编辑高手给写个程序
单片机的PF0设置为输入,
外部信号给PF0先来一个低电平再来一个高电平,这就产生了一个上升沿,
利用这个上升沿进行其他操作。 异或啊,这个才是有用的。
uchar SavedPinState; //保存引脚状态,变量类型根据编译器更改
while(1){
if(SavedPinState ^ CurrentPinState){ //边沿触发
SavedPinState = CurrentPinState; //保存状态
if(SavedPinState){ //上升沿
...
} else { //下降沿
...
}
}
} bootgames 发表于 2012-11-29 09:55 static/image/common/back.gif
SavedPF0 --; //PF0发生了跳变,电平方向必定改变
这句不大明 ...
这个是对运算速度进行优化的,一个小技巧而已,一般情况下不这样写。
因为PF0是最低位,发生了边沿变化,而++、--恰好使得最低位变化,而从题目要求中高7位都可以不予理会,所以可以这么写。其他的写法还有直接取反。因为一般情况下,++、--、取反比赋值所用的时间要短。
你那个写法当然也是可以的,只不过效率没有那么高而已。 外部中断应该能搞定吧 不是中断IO口
只能普通操作 只要这些功能的话小定时或延时循环检测IO电平,去抖获得上升沿,再计算输出 if( (PINF & ( 1 << DDF0 )) == 0 )
{
LowLevel=1;
}
Delayms(10);
if( (PINF & ( 1 << DDF0 )) == 1 )
{
HighLevel=1;
}
LevelState = LowLevel & HighLevel;
这样OK? 单片机的IO口反复出现高 低电平,当低电平转为高电平的时候单片机启动测试。这句话是下面两句的总结?
如果当前IO口为低电平,则变量1等于1,
如果当前IO口为高电平,则变量2等于1,
如果当前IO口为低电平,则变量1等于1,--变量2是该如何变化
如果当前IO口为高电平,则变量2等于1,--变量1是该如何变化
开定时器定时扫描IO{:smile:} 不用定时器 楼主题目不清楚 dgdzas 发表于 2012-11-28 14:06 static/image/common/back.gif
楼主题目不清楚
单片机的PF0设置为输入,
外部信号给PF0先来一个低电平再来一个高电平,这就产生了一个上升沿,
利用这个上升沿进行其他操作。 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;
}
}
更具体到你这个题目进行优化,只检测PF0的上升沿:
uchar SavedPF0 = PINF; //保存引脚状态,保存了8位
while(1){
if((SavedPF0 ^ PINF)& 1)){ //边沿触发,只检测第0位变化的情况
SavedPF0 --; //PF0发生了跳变,电平方向必定改变
if(SavedPF0 & 1){ //上升沿
...
}
}
} 12L&13L的不错,学习了;嘿嘿 12L很好,学习了 takashiki 发表于 2012-11-28 15:32 static/image/common/back.gif
更具体到你这个题目进行优化,只检测PF0的上升沿:
uchar SavedPF0 = PINF; ...
SavedPF0 --; //PF0发生了跳变,电平方向必定改变
这句不大明白 “SavedPF0 --"是做什么?
我写的那个运行起来也可以啊 不错,学习了
页:
[1]