|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
对单片机的累加器A的逻辑操作:0 D6 w# h: \+ }/ e' l( `5 L1 |
CLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果相同。
. p. p2 m' }# a$ ]: {9 e: cCPL A ;将A中的值按位取反. n e' X' k2 t& f' ^
RL A ;将A中的值逻辑左移
, H' d* j* {! V a6 wRLC A ;将A中的值加上进位位进行逻辑左移% ]2 f! H& I2 d
RR A ;将A中的值进行逻辑右移7 ^% V( u2 N& Y, h8 w2 O' A
RRC A ;将A中的值加上进位位进行逻辑右移
; {$ O' }2 Q# b: k: E; r$ [+ y( rSWAP A ;将A中的值高、低4位交换。
* \3 A* ^: k" r. x1 o例:(A)=73H,则执行CPL A,这样进行:% Q3 x5 R) M. q- ?6 i+ k
73H化为二进制为01110011,
) m: o& l" ?5 ?* S& W0 z5 B逐位取反即为 10001100,也就是8CH。
* T W9 Y% X8 E( R7 M9 L# L# lRL A是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。: s! a/ @( H. H# t" c' P; _
例:A中的值为68H,执行RL A。68H化为二进制为01101000,按上图进行移动。01101000化为11010000,即D0H。+ C f5 c% I( W" S+ U
RLC A,是将(A)中的值带上进位位(C)进行移位。
+ x9 X$ Q) A7 y- K7 D例:A中的值为68H,C中的值为1,则执行RLC A
) v1 [) O+ T# S! i4 C5 H( t$ J/ W1 01101000后,结果是0 11010001,也就是C进位位的值变成了0,而(A)则变成了D1H。% r# I5 n- _9 ~& @6 R; L, j4 c
RR A和RRC A就不多谈了,请大家参考上面两个例程自行练习吧。
% w: X% Z9 h1 X3 V W' j4 RSWAP A,是将A中的值的高、低4位进行交换。2 L5 j5 W5 t% h
例:(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。$ K0 X; {" @$ h( `5 A
练习,已知(A)=39H,执行下列单片机指令后写出每步的结果
R6 x) G, o; \/ fCPL A
% R9 j! @* K7 I, {: j& a9 f' XRL A% s! |3 ~1 r2 F, @9 g8 ?+ @
CLR C8 D# ?# s. ]) p7 c
RRC A
8 n) f/ @7 D' w2 Y# o- ySETB C& ^2 k: D' l6 k7 ]: X
RLC A" b) }3 G' A1 U: m8 h0 u
SWAP A
$ U3 w8 ? _) [1 Q- |通过前面的学习,我们已经掌握了相当一部份的单片机指令,大家对这些枯燥的单片机指令可能也有些厌烦了,下面让我们轻松一下,做个实验。( T" }' n( w# o# S7 X* z
实验五:
& L, f; d( z0 K6 w9 VORG 0000H; S: w! q6 B( u% n9 v8 j
LJMP START/ X h5 S8 F) h9 C9 Q8 t& ? k2 g
ORG 30H
w/ ?' z; B2 @) O5 GSTART:# Q% G9 y" X1 g: s; r
MOV SP,#5FH
9 D8 w0 Z! C% ?MOV A,#80H
1 T. a& C$ A$ h# ?LOOP:5 ~* S0 J. x7 X g
MOV P1,A- N1 B9 e2 n/ X
RL A; @( O9 {0 ^3 w3 H
LCALL DELAY
: L8 s/ s# I3 kLJMP LOOP
2 Q/ B& H& `4 k) K& u$ h9 ]delay:
6 ]% t: {3 ^3 j; J0 a& smov r7,#255
+ E! A' h! [/ F) k# o: r. S2 {4 ]/ dd1: mov r6,#255. G, w& E; W+ L% F4 H/ _
d2: nop
7 |7 v! Q5 b7 {: P) I' F8 J. T) Wnop
8 ~. x; E$ U. ?9 X2 Wnop! F8 ?! B6 q8 A% M. v- D5 J0 h
nop* f/ _9 u: S; Q
djnz r6,d2
. S9 i, A2 G" W! f2 O) zdjnz r7,d1" b! y' e2 j8 m$ |& r1 D7 e
ret
6 S6 c' S. m8 s9 J5 v8 e: r) lEND! B5 O- s& d" X
先让我们将程序写入片中,装进实验板,看一看现象。
4 \! S4 g; R$ o& z H4 _看到的是一个暗点流动的现象,让我们来分析一下吧。3 A" w, v9 V- A0 j9 F# S* B
前而的ORG 0000H、LJMP START、ORG 30H等我们稍后分析。从START开始,MOV SP,#5FH,这是初始化堆栈,在本程序中有无此句无关紧要,不过我们慢慢开始接触正规的编程,我也就慢慢给大家培养习惯吧。
+ G" w' V% M' A) IMOV A,#80H,将80H这个数送到A中去。干什么呢?不知道,往下看。4 k. c" b5 R' Q/ A; c6 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上灯不亮了。这样依次循环,就形成了“暗点流动”这一现象。
! a( d: y) W$ i4 F2 X. ]问题:
: j3 v' ? e/ L0 ?如何实现亮点流动?" `3 w& ]$ ^7 g! C! a
如何改变流动的方向?
& v- v) J9 I+ a+ L. T+ N* c6 ~+ F答案:& A8 K( N# V: L% w3 L
1、将A中的初始值改为7FH即可。
9 W; V+ |% m: v6 u: b: {2、将RL A改为RR A即可。& W7 J3 F8 T2 T; _' Z& S5 K
, |8 U+ t$ [+ k9 N |
|