你现在位置:首页>技术论文>电气常识>嵌入式系统>正文
法宝级的EMC单片机编程技巧集锦
日期:2008-5-14 0:06:07 来源:本站整理  
点击: 作者:
点击【】放大字体.

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

本新闻共4页,当前在第11 2  3  4  
——可——编——程——控-制-器-技——术——门——户

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行