|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
对单片机的累加器A的逻辑操作:
9 i8 h; b1 h- d7 Z+ pCLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果相同。) K& _0 I; t' f; h
CPL A ;将A中的值按位取反: S0 r" P% y! s7 ]
RL A ;将A中的值逻辑左移
% C: ?/ q8 |8 Z* b L) {- LRLC A ;将A中的值加上进位位进行逻辑左移
/ M! I& E- {# d; a. FRR A ;将A中的值进行逻辑右移8 H5 X. [6 w: y: \4 o5 d
RRC A ;将A中的值加上进位位进行逻辑右移* ^5 n! |; H9 G o, \
SWAP A ;将A中的值高、低4位交换。% {; i. q! ~7 P: t2 Q* o) p
例:(A)=73H,则执行CPL A,这样进行:2 k7 e( a2 H# w$ j# N5 y3 t
73H化为二进制为01110011,
' [9 x/ a; _6 i* ? [7 x逐位取反即为 10001100,也就是8CH。
" g5 M E# \( u! y' {RL A是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。! v- e' _3 A* ^4 @3 J4 K
例:A中的值为68H,执行RL A。68H化为二进制为01101000,按上图进行移动。01101000化为11010000,即D0H。+ P% O% W% ~9 h/ S0 K$ d; I
RLC A,是将(A)中的值带上进位位(C)进行移位。
% D6 i2 S% a; Z) O) l: X( j3 M例:A中的值为68H,C中的值为1,则执行RLC A
$ A o$ B, p7 A% b1 01101000后,结果是0 11010001,也就是C进位位的值变成了0,而(A)则变成了D1H。; k7 n+ d& _3 R, e
RR A和RRC A就不多谈了,请大家参考上面两个例程自行练习吧。
# \2 z$ f2 y mSWAP A,是将A中的值的高、低4位进行交换。
0 ^- f1 H V( S4 l" i例:(A)=39H,则执行SWAP A之后,A中的值就是93H。怎么正好是这么前后交换呢?因为这是一个16进制数,每1个16进位数字代表4个二进位。注意,如果是这样的:(A)=39,后面没H,执行SWAP A之后,可不是(A)=93。要将它化成二进制再算:39化为二进制是10111,也就是0001,0111高4位是0001,低4位是0111,交换后是01110001,也就是71H,即113。& V. z2 `, X( P6 F
练习,已知(A)=39H,执行下列单片机指令后写出每步的结果
6 R" |& F, t3 t q/ Z; PCPL A
7 _1 f7 T D" R& R8 [: lRL A# Y( G% k7 P7 m# [. ]
CLR C
) a7 { u' `$ c( }- j, B1 m" [RRC A
- s/ s- z. I" I) QSETB C0 a% j5 v$ z0 u' A6 A3 d: M" j
RLC A
8 C; Y' o6 v5 M! f! T) M( VSWAP A
" o5 c0 v. M1 `通过前面的学习,我们已经掌握了相当一部份的单片机指令,大家对这些枯燥的单片机指令可能也有些厌烦了,下面让我们轻松一下,做个实验。( z* w6 Y1 Z# a2 K8 r7 M0 G& Y1 u- H6 G
实验五:
1 q- l# E, v4 j; M/ dORG 0000H
" V+ w* g4 h: W2 o, E+ h& L4 uLJMP START, G2 P5 F4 Y R" D- ]: G$ G
ORG 30H7 [& H6 o+ U3 i3 q( H. d) I
START:) c& h6 X/ u/ [# j
MOV SP,#5FH
. I+ |9 [9 i/ T; D( JMOV A,#80H
" t" n$ f- f2 n) @! cLOOP:
! y; P- `; F! [/ ]MOV P1,A
+ x( ]/ b: L) A6 O% F# v2 |RL A
/ l1 ~) a, n: S5 W( eLCALL DELAY4 Q/ Z- n! t% q1 L$ T
LJMP LOOP
7 H- x4 i( e. W$ ^/ W! Q+ vdelay:0 M0 ^3 @( _" g5 @) F
mov r7,#255+ v, A) b9 v- X# s
d1: mov r6,#255. _7 \8 C# C' M. H! F; T
d2: nop$ V3 {2 `% b) O
nop
% D. F3 ~* ?6 P0 s) tnop
0 ?% A; f6 M) X( znop
0 F) n9 P$ x i, sdjnz r6,d2
, V9 N" Z8 \: r$ _1 x: ~+ \djnz r7,d1
+ t d+ u" _9 r tret
$ n* I8 R& J, G2 EEND. d$ i* N) u9 `, Z
先让我们将程序写入片中,装进实验板,看一看现象。
& C" }( \- X3 f5 Y; z看到的是一个暗点流动的现象,让我们来分析一下吧。
' [5 E0 H C- \0 P0 R0 ^ K前而的ORG 0000H、LJMP START、ORG 30H等我们稍后分析。从START开始,MOV SP,#5FH,这是初始化堆栈,在本程序中有无此句无关紧要,不过我们慢慢开始接触正规的编程,我也就慢慢给大家培养习惯吧。+ Y( d* ^; ~( p: w Q( K6 ?5 s
MOV A,#80H,将80H这个数送到A中去。干什么呢?不知道,往下看。/ [( t6 B* x" E3 Q; B- n- c8 Q
MOV P1,A。将A中的值送到P1端口去。此时A中的值是80H,所以送出去的也就是80H,因此P1口的值是80H,也就是10000000B,通过前面的分析,我们应当知道,此时P1。7接的LED是不亮的,而其它的LED都是亮的,所以就形成了一个“暗点”。继续看,RL A,RL A是将A中的值进行左移,算一下,移之后的结果是什么?对了,是01H,也就是00000001B,这样,应当是接在P1。0上的LED不亮,而其它的都亮了,从现象上看“暗点”流到了后面。然后是调用延时程序,这个我们很熟悉了,让这个“暗点”“暗”一会儿。然后又调转到LOOP处(LJMP LOOP)。请大家计算一下,下面该哪个灯不亮了。。。。。对了,应当是接在P1。1上灯不亮了。这样依次循环,就形成了“暗点流动”这一现象。
0 Z7 Z" T# ~' h$ Y: I/ T% \8 X) I问题:
) b4 I- ?: W- k$ T0 |3 A6 h如何实现亮点流动?
1 h3 }2 a/ Z9 {6 c T+ y) |如何改变流动的方向?
% E5 M* J2 d V% V, _! \答案:
& O _( N+ b5 C, h! q1、将A中的初始值改为7FH即可。
7 h0 U+ L1 }) i# B& d, f2、将RL A改为RR A即可。
& W- |4 e1 P1 E8 m. W4 A+ R
' U; s; Z/ {; M# V; X# Y |
|