我开发的是义隆单片机,所以以义隆的汇编举例。
1.定义IO口
原来的方式: IO_Buz == 1
给IO置1,则需要写成
BS P5.IO_Buz
更改方式: IO_Buz == P5.1
BS IO_Buz
这样做的好处是,可避免程序更改带来的兼容问题,只要改文件定义部分就好,而且书写量变小。
2.定义常用的状态标志位
一般功能寄存器定义里都有类似如下的定义:
R3 == 0X03:rpage 0
STATUS == 0X03:rpage 0
我们可以在下面加一些自己要的定义:
;{
;//因为这里定义了每一位,所以才不用指定寄存器
C == STATUS.0 ;
DC == STATUS.1
Z == STATUS.2
P == STATUS.3 ;Power-down bit.
T == STATUS.4 ;
IOCS == STATUS.6 ; I/O REGISTER PEGER CONTER BIT
RST == STATUS.7 ;
;}
不要小看了这个定义,原来可能写的是
bs STATUS.2
现在写的是
bs Z
不但书写量变小,而且不容易出错,一下明白他的意思。
3.代码压缩语法技巧
3.1 调用之后马上返回
call F_XXX
Ret
可改为:
jmp F_XXX
好处是节省一个 ret 栈少压一层。坏处是破坏程序完整性,仿真的时候不方便跟踪。非最后开发需要几行ROM,不建议这样做。
3.2 多次对位比较跳转到相同的地址
Jbc B_XX1
Jmp mainloop
Jbc B_XX2
Jmp mainloop
可改为:
jbs B_XX1
Jbc B_XX2
Jmp mainloop
每两次比较跳转可节省一个 跳转。
4.中断现场保存
1.中断保存的原则是会破坏什么才保护什么,这里的技巧在于,你的中断程序不一定破坏了R4间接寻址寄存器,所以可以选择性保存。
mov V_A_Save,a
swap V_A_Save
中断保存一定要用这个。
不可只用
mov R,a
因为出中断还原的时候:
swapa V_SF_Save
mov SF,a
swapa V_A_Save
是先还原的状态寄存器,如果用 mov a,R 则会改变Z标。
5.改善兼容性
义隆IDE开发还支持条件编译,伪指令,这个利用好能大大增加兼容性。
5.1条件编译
条件编译用法:
if(条件)
/*代码块*/
endif
举例:
我常用的的OTP芯片是153S和372N,在使用IIC的时候,总是有端口设定上兼容性问题,每次都要琢磨改。终于在发现条件编译后才解放。
在开始的位置,先说明使用的OTP平台,需要改IO方向的SDA在哪个端口。
OTP_153S == 0;
OTP_372N == 1;
Port_SDA == P6
下面实际应用实现。
;;------------------153S---------------------