EM78系列单芯片-提升软件效率的小程序谭振文分享
WWW_PLC※JS_COM-PmLC-技.术_网
笔者闲暇时总喜欢一个人窝在房里拿烙铁 ,焊电路板,在网络上游走,看到喜欢的DIY也一定仔细端详,即使按图施工也可以得到不少的乐趣,相信酷爱此道的人应该也不少 ,除了喜欢看看别人的作品,也可以互相比较一下看谁用的零件少,谁提供的功能强,谁的速度最快,所以经常很容易就搜集到一些不错的电路,日子久了就像堆积木一样,可以一个方块一个方块的拿来用,吾人戏称为积木设计法。将许多有用的电路组合在一起,又是一个新的东西。这种方式的确又快又经济,符合现代人快餐的观念。不仅是硬件可以像堆积木一样的收集起来,软件当然也可以适用于积木法则,于是在不少有心人的努力之下,笔者也收集了EM78系列单芯片一些很好的链接库,所以说麻雀虽小,五脏俱全。也因为这些链接库极具参考价值,笔者不忍独享,故决定将紊乱的笔记重新整理后 WW.W_PLCJS_COM-PLC-技.术_网
公开出来,与热爱此系列单芯片的朋友们一同分享。 P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
EM78XXX单芯片自从问世以来已经陆续推出十余种不同等级的单芯片,小到8Pin的78P152,大到100Pin WWcW_PLCJS_COM-PLC-技.术_网
OTP的78P860,其汇编语言指令都是一样的,仅有57个,所以反复练习几次就能熟悉指令的用法。汇编语言用在I/O控制非常容易,也有很高的效率,所以坊间的书籍大部份以讨论控制为主显,显少专门探讨软件技巧的篇幅,其实老手都知道,关于芯片之控制往往用到时再去翻一翻DATA WW.W_PLCJS_COM-PLC-技.术_网
BOOK,注意一下TIMING,然后准备一部示波器,三两下就可以搞定。反倒是算法用的好不好会大大影响产品的稳定度,所以有经验的程序设计师通常都有自己的一套葵花秘笈,所以要提升自己的功力最好的方式除了多练习之外,看看别人的程序也会使你进步很快。 plcjs.技.术_网
BCD转换成Binary WWW_PLC※JS_COM-PmLC-技.术_网
由于EM78XXX是8位的微控器,因此为了节省内存,我们的范例仅以一个BYTE存放两位BCD数为例,数字的范围在0~99之间,转换后的结果放在ACC,如果您需要更多的位数,相信您在看完之后应该不难自行修改才是。 WWW_PLCJS@_COM%-PLC-技.术_网
程序一 WWW.PLCJS.COM——可编程控制器技术门户
这个范例程序共花费13个指令CYCLE,需要两个变量空间,执行后会影响到原BCD的内容。 WWW.PLCJS.COM——可编程控制器技术门户
MOV A,BCD WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
MOV TMP,A WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
MOV A,@0x0F WWW.PLCJS.COM——可编程控制器技术门户
AND TMP,A WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
SWAP BCD WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
AND BCD,A ——可——编——程——控-制-器-技——术——门——户
BC PSW,0 WWW_P※LCJS_CO※M-PLC-技-.术_网
RLC BCD ; *2 ——可——编——程——控-制-器-技——术——门——户
MOV A,BCD WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
ADD TMP,A WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
RLC BCD WWcW_PLCJS_COM-PLC-技.术_网
RLCA BCD ; *8 WW.W_PLCJS_COM-PLC-技.术_网
ADD A,TMP WWW.PLCJS.COM——可编程控制器技术门户
说明 P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
在程序一中所采用的方式应该算是最多人知道的方式,也是一种最直觉的方法,先将BCD个位数保存起来,因为十位数必须要乘以10,所以利用移位的技巧乘以10再加上个位数,所得的答案放入ACC。 WWW_PL※CJS_COM-PLC-技.术_网
程序二 WWW_PLC※JS_COM-PmLC-技.术_网
在程序一的缺点,就是在执行程序以后,原本BCD的内容已经在移位的过程中被破坏掉了,为了改善这项缺失,我们换一种方式看看。下面这个程序,我们企图改善前面的缺失,共花费11个指令CYCLE,仍需要两个变量空间,但是执行后不会破坏原来BCD的内容。 WWW_P※LCJS_CO※M-PLC-技-.术_网
SWAPA BCD WWW.PLCJS.COM——可编程控制器技术门户
MOV TMP,A WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
MOV A,@0x0F WWW_P※LCJS_CO※M-PLC-技-.术_网
AND BCD,A WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
AND TMP,A WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
BC PSW,0 P.L.C.技.术.网——可编程控制器技术门户
RLCA TMP WW.W_PLC※JS_C,OM-PL,C-技.术_网
SWAP TMP WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
RRC TMP WWW_PLCJS_COM-PLC-技.术_网
ADD A,TMP WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
ADD A,BCD plcjs.技.术_网
程序三 P.L.C.技.术.网——可编程控制器技术门户
对于程序二的结果我们仍然不满意,似乎稍嫌复杂,虽然速度有所改善,但在内存的分配上仍有余地,所以我们再改善成程序三的型态。转换过程只花费10个指令CYCLE,而且只需要一个变量空间,执行之后也不会改变原来BCD的内容。 WWW_PLCJS@_COM%-PLC-技.术_网
MOV A,@0x0f WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
AND A,BCD WW.W_PLCJS_COM-PLC-技.术_网
JBC BCD,4 WWW_P※LCJS_COM-PLC-)技.术_网
ADD A,@10 P.L.C.技.术.网——可编程控制器技术门户
JBC BCD,5 WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
ADD A,@20 WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
JBC BCD,6 WW.W_PLC※JS_C,OM-PL,C-技.术_网
ADD A,@40 WWcW_PLCJS_COM-PLC-技.术_网
JBC BCD,7 WWcW_PLCJS_COM-PLC-技.术_网
ADD A,@80 WWcW_PLCJS_COM-PLC-技.术_网
说明 WWW_PLCJS@_COM%-PLC-技.术_网
看过以上三个范例,您是否觉得程序三最简洁而且容易了解?写程序的确是一项极具挑战性的工作,而且还可以找到很多灵感及乐趣,想不到吧! WW.W_PLCJS_COM-PLC-技.术_网
Binary转换成BCD码 plcjs.技.术_网
下面的范例程序会将存放在ACC内的二进制数转换成两位BCD码(Compacted BCD Code),可转换最大的BCD码是99。 WW.W_PLCJS_COM-PLC-技.术_网
CLR BCD WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
DIGIT_HI: plcjs.技.术_网
ADD A,@256-10 P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
JBS PSW,FC WWW_PL※CJS_COM-PLC-技.术_网
JMP DIGIT_LO WWcW_PLCJS_COM-PLC-技.术_网
INC BCD W1WW_P4LCJS_COM-PLC-技.术_网
JMP DIGIT_HI WWW_PLC※JS_COM-PmLC-技.术_网
DIGIT_LO: WWW_P※LCJS_CO※M-PLC-技-.术_网
ADD A,@10 plcjs.技.术_网
SWAP BCD WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
OR BCD,A WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
减法的陷阱 WW.W_PLC※JS_C,OM-PL,C-技.术_网
EM78系列汇编语言的减法指令是SUB,使用这个指令时您得特别注意,因为ACC永远都是减数,不可为被减数。SUB指令的语法有以下三种: WWW_PLC※JS_COM-PmLC-技.术_网
SUB A,R (R-A→A) WWW_PLCJS_COM-PLC-技.术_网
SUB R,A (R-A→R) WW.W_PLC※JS_C,OM-PL,C-技.术_网
SUB A,K (K-A→A) WWW_PL※CJS_COM-PLC-技.术_网
也就是说如果我们想计算A-2的值,如果写成: WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
SUB A,@2 WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
其实是执行2-A,解决方法如下: WW.W_PLCJS_COM-PLC-技.术_网
ADD A,@256-2 或 W1WW_P4LCJS_COM-PLC-技.术_网
ADD A,@254 WW.W_PLC※JS_C,OM-PL,C-技.术_网
交换两组缓存器的内容 P.L.C.技.术.网——可编程控制器技术门户
如果你觉得要交换两组内存的内容一定要借用第三组变量,那么您可以参考以下的方式,只是用了一些数学技巧就变得又快又简单。 WWW_PLCJS@_COM%-PLC-技.术_网
MOV A,REG1 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
SUB A,REG2 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
ADD REG1,A W1WW_P4LCJS_COM-PLC-技.术_网
SUB REG2,A ——可——编——程——控-制-器-技——术——门——户
原理说明 WWcW_PLCJS_COM-PLC-技.术_网
A=REG1 WWW.PLCJS.COM——可编程控制器技术门户
A=REG2-REG1 WW.W_PLCJS_COM-PLC-技.术_网
REG1=REG1+A WWW_PLCJS_COM-PLC-技.术_网
=REG1+(REG2-REG1) WW.W_PLC※JS_C,OM-PL,C-技.术_网
=REG2 W1WW_P4LCJS_COM-PLC-技.术_网
REG2=REG2-(REG2-REG1) WWW_PL※CJS_COM-PLC-技.术_网
=REG1 WWW_PLCJS_COM-PLC-技.术_网
若X>Y就交换... WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
延续上一个例子,此法用应用在Bubble Sort特别管用。 plcjs.技.术_网
MOV A,X WWW_PLCJS@_COM%-PLC-技.术_网
SUB A,Y P.L.C.技.术.网——可编程控制器技术门户
JBC PSW,FC WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
JMP NO_CHANGE WWW_PLCJS_COM-PLC-技.术_网
ADD X,A P.L.C.技.术.网——可编程控制器技术门户
SUB Y,A WWW_PLC※JS_COM-PmLC-技.术_网
2补码 WWW_P※LCJS_COM-PLC-)技.术_网
2补码加法经常代替减法,传统上的做法是先取1补码,然后加1。 P.L.C.技.术.网——可编程控制器技术门户
COM REG WWW_P※LCJS_CO※M-PLC-技-.术_网
INC REG WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
或是可以利用另一种方式求得,所不同的是第二种方式会影响PSW缓存器。 WWW_PL※CJS_COM-PLC-技.术_网
ADD A,REG WW.W_PLC※JS_C,OM-PL,C-技.术_网
SUB A,REG WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
如果您所要求的数已经放在ACC里面,那只要一行就能解决了。 WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)
SUB A,@0 WWW_PLCJS@_COM%-PLC-技.术_网
旋转字节运算 WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)
在8051指令中位左旋有RLC与RL两种指令区分,RLC在ACC左旋时会连带将CY一并旋转,而RL只会将ACC的MSB旋入LSB。EM78XXX指令只有RLC,那么要如何才能做到不带CY旋转呢?答案是旋转两次: P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户
RLCA REG1 WWW.PLCJS.COM——可编程控制器技术门户
RLC REG1 P.L.C.技.术.网——可编程控制器技术门户
如图1所示,第一次位旋转并没有真正改变REG1的内容,目的是将REG1的MSB先放入FC,第二次位旋转才将刚刚放在FC内的MSB旋入LSB。同理,两个BYTES不经FC的位旋转也是相同的原理。 WWW_P※LCJS_COM-PLC-)技.术_网
RLCA HI_BYTE WWW_P※LCJS_CO※M-PLC-技-.术_网
RLC LO_BYTE WWW_P※LCJS_CO※M-PLC-技-.术_网
RLC HI_BYTE WWW_PLCJS_COM-PLC-技.术_网
范围判断 WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)
写程序免不了会碰到IF..THEN..的场合,有些人觉得EM78XXX的条件判断式太过繁琐,所以笔者也将它们整理归纳一下。条件判断式可分为开放区间条件式与封闭区间条件式来讨论,以图2来表示。 WW.W_PLC※JS_C,OM-PL,C-技.术_网
开放条件式是以N点为出发点,当待测值大于N或是小于等于N时的条件判断,以C的语法描述如下: WWcW_PLCJS_COM-PLC-技.术_网
if(number>n) WWW_PLCJS@_COM%-PLC-技.术_网
... /* number大于N */ ——可——编——程——控-制-器-技——术——门——户
else WWW_PL※CJS_COM-PLC-技.术_网
... /* number小于等于N */ WWW_PL※CJS_COM-PLC-技.术_网
EM78XXX汇编语言写法如下: WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)
MOV A,@N+1 WWW_PLCJS_COM-PLC-技.术_网
SUB A,Number WWW_P※LCJS_CO※M-PLC-技-.术_网
JBC PSW,FC WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)
JMP LABEL_1 ; 大于N ——可——编——程——控-制-器-技——术——门——户