|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
对单片机的累加器A的逻辑操作:5 J$ P* L4 z$ A( [
CLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果相同。
6 g, S& a: J* @! BCPL A ;将A中的值按位取反
* t* S0 |/ Y( E) _0 q8 N# @+ y; T, L+ M- eRL A ;将A中的值逻辑左移9 g u* q1 t/ W% i, r
RLC A ;将A中的值加上进位位进行逻辑左移2 F: X9 S0 s; y1 c& w5 r5 A4 X s6 U; ?
RR A ;将A中的值进行逻辑右移
7 i, u; f+ D) ?# F1 E' |RRC A ;将A中的值加上进位位进行逻辑右移/ R- N/ x$ y% @2 f, N2 ]: z5 S% k3 C
SWAP A ;将A中的值高、低4位交换。) O7 ^, @% R; J i; @! I
例:(A)=73H,则执行CPL A,这样进行:
3 S3 k7 `2 ?; A6 C! a3 g73H化为二进制为01110011,$ s8 ^* K. Q" t8 w. J3 r: T
逐位取反即为 10001100,也就是8CH。
- ]1 `: U* t( ]* a+ URL A是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。8 n4 A& S5 a# N# @
例:A中的值为68H,执行RL A。68H化为二进制为01101000,按上图进行移动。01101000化为11010000,即D0H。
5 `3 O2 B+ J# B( Q9 Z3 ?3 KRLC A,是将(A)中的值带上进位位(C)进行移位。/ }! g/ ~2 l0 U2 e* }
例:A中的值为68H,C中的值为1,则执行RLC A0 w1 d; z7 h7 ^7 o+ a" |
1 01101000后,结果是0 11010001,也就是C进位位的值变成了0,而(A)则变成了D1H。
" W4 k+ a6 k9 O' z4 `RR A和RRC A就不多谈了,请大家参考上面两个例程自行练习吧。
! V. T9 d. S5 h+ Q. d% u* `SWAP A,是将A中的值的高、低4位进行交换。; b3 J9 y& Z, j% J" e: c
例:(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。9 R- w7 [0 c0 N& `5 ^. ]
练习,已知(A)=39H,执行下列单片机指令后写出每步的结果
- t2 {0 L# |7 }* MCPL A
9 o; o0 u6 [3 \/ G: m3 bRL A% \# i/ T P- l+ j$ R# o
CLR C
* t. o& k% o7 h. c+ b7 ^ {RRC A
: R3 N4 a$ t/ ^7 nSETB C
6 l& A0 G5 H. f. m" O: ]4 W2 x1 TRLC A' B" A0 ^! l0 w4 t u
SWAP A
6 L3 U; E. { l! e通过前面的学习,我们已经掌握了相当一部份的单片机指令,大家对这些枯燥的单片机指令可能也有些厌烦了,下面让我们轻松一下,做个实验。# R* F/ k, I7 M) |5 q
实验五:1 u# u+ M9 t L% \) j& @; W! ]( }
ORG 0000H
( U# v0 } r2 H$ oLJMP START0 N8 V* H" M, _) G, Z. ^' D4 M
ORG 30H
$ a/ R5 l6 H8 l* Y* K+ n0 E' [START:0 `1 {+ g8 x; Q: j" P
MOV SP,#5FH
7 K" {; N) y% `8 ]MOV A,#80H
+ a1 Q$ n$ j% vLOOP:; B1 x- {4 o0 X+ `3 Y, S. @' I. D
MOV P1,A& G1 F, a5 H# ~
RL A
3 }6 Y: l5 ^/ P0 u) y( }LCALL DELAY
7 M! h4 ?( _* `7 OLJMP LOOP; x, R K# D: n8 Y
delay:
# e5 U+ o$ u* c2 c8 ` o! ]mov r7,#255
Y6 F' J2 |- n7 c* nd1: mov r6,#255
, c1 e7 ]# L6 Jd2: nop
s) R: g% t5 ^nop4 p @' \2 Z- U1 w/ q
nop
' e$ C8 m l. P5 Z/ q w7 nnop
3 O' M1 o/ A" s9 t! z* H3 t! wdjnz r6,d2
1 X# `" ?" N) g/ X7 Ldjnz r7,d1' v7 _" Y. I+ w. z# p
ret/ U! A- M, z& p$ a+ m
END
/ _1 x* @2 j5 c: f+ }, n先让我们将程序写入片中,装进实验板,看一看现象。7 L5 z( U5 R, p/ Y6 }
看到的是一个暗点流动的现象,让我们来分析一下吧。
' m2 B% Z% w, N& M! N; g8 R前而的ORG 0000H、LJMP START、ORG 30H等我们稍后分析。从START开始,MOV SP,#5FH,这是初始化堆栈,在本程序中有无此句无关紧要,不过我们慢慢开始接触正规的编程,我也就慢慢给大家培养习惯吧。3 f: u& {) U8 r. L
MOV A,#80H,将80H这个数送到A中去。干什么呢?不知道,往下看。
+ Z0 o- b d0 I3 G! K8 WMOV 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上灯不亮了。这样依次循环,就形成了“暗点流动”这一现象。/ y* ~ Q/ J# V) ?
问题:
: C0 E+ ^) G3 a/ ?" {, P2 i如何实现亮点流动?
0 C7 }; g' a4 Y2 |# u# e如何改变流动的方向?# D& f7 k1 M5 I
答案:: A- F/ D7 l! i. y1 t" l) w) q
1、将A中的初始值改为7FH即可。
+ o3 S1 c, W0 [5 m" H& V2、将RL A改为RR A即可。. _0 Y6 `+ g: B2 d8 D+ `
6 |$ K+ x$ H1 v1 u; M
|
|