为了得到与汇编一样高效的定时器修正代码,经过多次反编译修改后得到如下的代码
即:
“ACC=((65536+8-SYS_CLK)%256);
TR0=0;
TL0+=ACC;
ACC=0;
CY=ACC & 0x80;
ACC =((65536+8-SYS_CLK)/256)+ACC;
TH0+=ACC;
TR0=1;”
其中SYS_CLK为所定时的时间,这里默认的时钟为12MHZ,
本人在keil中,(我当时默认设置了5000)反编译之后得到的汇编的代码为:
MOV A,#080H
CLR TR0
ADD A,TL0
MOV TL0,A;TL0修正
CLR A;清空ACC
RLC A;保存CY到ACC中,即为TLO修正时的进位
ADD A,#0ECH
ADD A,TH0
MOV TH0,A;TH0修正
SETB TR0
看一下与Intel蓝本中汇编比较一下:
; // MOV A,#((65536-SYS_CLK+7) MOD 256)
; // CLR TR0
; // ADD A,TL0
; // MOV TL0,A
; // MOV A,TH0
; // ADDC A,#((65536-SYS_CLK+7 )/256)
; // MOV TH0,A
; // SETB TR0
大家可以看到结果了吧,相比之下只有1条指令的差距
相对来说效率是很高,您可能会发觉这条语句:“ACC =((65536+8-SYS_CLK)/256)+ACC;”
为什么不用“ACC+ =((65536+8-SYS_CLK)/256)”
我原本以为这两句是一样的,可是编译器可不这样想,认为是两种不同的操作,这条指令编译后会将
ACC中的值清零,再与修正值相加,这样就得不到前面TL0修正时的进位CY了
呵呵,如果大家觉得不错就拿去用吧,省着用汇编修正了
欢迎大家到singleywy的个人博客:<a href="http://blog.21ic.com/user1/7823/archives/2010/77521.html">Singleywy</a> |