sbit key=P2.0char keyLastStatus=0
keyLastStatus=key //初始化
while (1)
{
if(key==1 &&keyLastStatus!=key) Todo()//上升沿
if(key==0 &&keyLastStatus!=key) Todo()//下降沿
keyLastStatus=key //记录上一次的状态
}
这里只讲原理,不关注速度。实际设计工作中,已经有很多单片机能够识别io端口上升沿和下降沿中断,且方式不止一种。
sbit
io_inp=p2^1输入端
bit
old_bit输入端电平记忆
unsigned
char
low_high上升下降沿标志,0=无变化,1=上升沿,2、下降沿
void
io_rest(void)
{
if(old_bit=!io_inp)
{
old_bit=io_inp
if(io_inp=1)
low_high=1
else
low_high=2
}
}
void
main(void)
{
old_bit=io_inp=p2^1
while(1)
{
low_high=0
io_rest(void)
//在此应用
}
}
扩展资料:
直接使用汇编指令编写单片机程序,对硬件的控制更加直接,可以直接 *** 作物理地址,寄存器,端口等;其它更高级的语言(如:C语言)对硬件的控制是依赖于类库来实现的。并且,对于一些对程序大小和运行速度有非常严苛要求的项目而言,都必须使用汇编指令。
C语言只是为了方便编写,与机器打交道的其实都是2进制得代码,汇编语言就是这些代码好记忆的名称和规则,只是比C语言难理解些。
参考资料来源:百度百科-单片机汇编指令
单片机上升沿:顺时针旋转A超前B相信号90°:
A: _|--|__|--|_
B: __|--|__|--|
逆时针旋转B相信号超前A相信号90°:
A:__|--|__|--|_
B:_|--|__|--|__
下面是AT89C2051检测并进行二倍频程序:
采用外部中断方式
ORG 00H
LJMP MAIN
ORG 03H
LJMP INT0
ORG 13H
LJMP INT1
ORG 50H
MAIN: MOV SP,#40H
MOV P3,#0FFH
MOV IE,#10000101B 设定外部中断
MOV TCON,#00000101B
SETB EA
MA1: MOV P1,#0FFH
MOV P3,#0FFH
SJMP MA1
*******************
INT0: PUSH PSW
CLR EA
I0: JNB P1.0,FAN
CLR P3.4
SJMP INT0END
FAN: CLR P3.5
INT0END:
POP PSW
SETB EA
MOV P3,#0FFH
RETI
INT1: PUSH PSW
CLR EA
JNB P1.0,ZHENG
CLR P3.5
SJMP INT1END
ZHENG: CLR P3.4
INT1END:
POP PSW
SETB EA
MOV P3,#0FFH
RETI
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)