找回密码
 注册
关于网站域名变更的通知
查看: 154|回复: 3
打印 上一主题 下一主题

单片机教程12单片机逻辑运算类指令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-25 10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机的累加器A的逻辑操作:
( g. G$ q7 l$ L. N/ p0 C  G) @( X: Q/ zCLR A ;将A中的值清0,单周期单字节指令,与MOV A,#00H效果相同。* F; S$ U% }3 z8 A6 g) Q
CPL A ;将A中的值按位取反# e3 \9 W! S- k' S7 L( S/ j* M
RL A ;将A中的值逻辑左移
/ s. X6 k. @( d# q# {RLC A ;将A中的值加上进位位进行逻辑左移
; C( A- _) n, h" E# ERR A ;将A中的值进行逻辑右移' P# u/ |8 C: {8 \0 C
RRC A ;将A中的值加上进位位进行逻辑右移. B# J, @5 U3 X
SWAP A ;将A中的值高、低4位交换。8 S5 s; @# @" \3 @0 Q1 S& |! x
例:(A)=73H,则执行CPL A,这样进行:
' b4 e, ~- ]2 Q8 O+ o: k- q73H化为二进制为01110011,1 n5 e: O# |2 O3 L8 J! I( ^
逐位取反即为 10001100,也就是8CH。
* R; [$ `# F+ e, ], G' yRL A是将(A)中的值的第7位送到第0位,第0位送1位,依次类推。
5 Z9 C6 T% ]: V7 v) d, H& C例:A中的值为68H,执行RL A。68H化为二进制为01101000,按上图进行移动。01101000化为11010000,即D0H。+ i  V% ~3 @( C# W+ z; j
RLC A,是将(A)中的值带上进位位(C)进行移位。
8 E0 [( @  Y; K+ ~2 n例:A中的值为68H,C中的值为1,则执行RLC A
% _( P; Y, u1 _0 x' h. h; |, |, V- u7 S1 01101000后,结果是0 11010001,也就是C进位位的值变成了0,而(A)则变成了D1H。
1 i2 o( z+ E# [" y. K9 QRR A和RRC A就不多谈了,请大家参考上面两个例程自行练习吧。9 t- `$ Y/ }- X9 ^6 z5 l
SWAP A,是将A中的值的高、低4位进行交换。
8 w$ F6 m- i. C8 h: e0 O$ v例:(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。
5 Z- ^; e- Q4 z练习,已知(A)=39H,执行下列单片机指令后写出每步的结果
& u' h* F* e8 R4 M9 ?CPL A
' e  g# Z$ X+ I+ U$ Q8 oRL A
& Z4 ?$ Q2 C9 f1 n5 K* GCLR C
7 ]; N& i* ^) mRRC A
# m6 z: _5 c9 z2 ISETB C
' S9 g: k0 m" G9 [3 SRLC A& \. d) F1 z* x* _6 x+ c8 w2 j
SWAP A' C0 [9 u4 O  O; i4 i4 P' L# Q5 d5 T: l
通过前面的学习,我们已经掌握了相当一部份的单片机指令,大家对这些枯燥的单片机指令可能也有些厌烦了,下面让我们轻松一下,做个实验。
* s3 e4 m6 F5 A9 A实验五:: M: ]+ L9 |7 P
ORG 0000H
9 g# r. n) n: @: o! `! V. ?/ mLJMP START
% C' v* E8 ^9 Q  ]ORG 30H
; V6 R$ \% r' p0 J( V2 F, J0 @. `START:
8 `" F2 y/ x  O; P! HMOV SP,#5FH+ C8 {( f# M( W0 B* u' G% W
MOV A,#80H/ Q, b8 W2 c; h7 ^1 P
LOOP:
( x( f$ |9 E! p5 c% K7 C6 KMOV P1,A
4 T, \1 X' M8 {0 k6 QRL A
& q2 g4 C% o2 P5 E. x  t, L1 K' mLCALL DELAY" C$ c8 q! P2 q" c
LJMP LOOP
8 ^3 E" \+ k/ k+ a& G  l& c7 y/ fdelay:9 N: d3 F) L! W0 H7 f
mov r7,#2559 [" w! ~3 h+ c7 m$ k
d1: mov r6,#2553 d2 g6 a% I4 ^) _" _
d2: nop
5 Y( \' O1 O; h) [nop) o  l8 s* H& @( B6 q' R; |' q
nop
" u; _2 d8 I. w# X6 X( nnop
4 |+ F5 v8 x+ i6 tdjnz r6,d2/ N) [  `8 K+ }
djnz r7,d1
4 J: k4 K0 w/ \1 y9 q5 k6 Kret
3 L! r/ y* m) |  kEND4 \5 I* m) X6 i. N& s% i% Y
先让我们将程序写入片中,装进实验板,看一看现象。# Q2 x. H1 D, |% c4 V* p) A% I' d
看到的是一个暗点流动的现象,让我们来分析一下吧。
, z6 \2 f: y5 ?; ?( n前而的ORG 0000H、LJMP START、ORG 30H等我们稍后分析。从START开始,MOV SP,#5FH,这是初始化堆栈,在本程序中有无此句无关紧要,不过我们慢慢开始接触正规的编程,我也就慢慢给大家培养习惯吧。
  G1 E1 k; I" p- h" i4 h7 J4 C+ EMOV A,#80H,将80H这个数送到A中去。干什么呢?不知道,往下看。- ?  L* N" {, g! M1 [% n: A8 `* a
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上灯不亮了。这样依次循环,就形成了“暗点流动”这一现象。
8 V$ E- s1 h: Q9 g2 c问题:
6 z# a1 P3 P. t, g1 [6 O+ f如何实现亮点流动?# [/ C5 w5 x$ G9 `
如何改变流动的方向?% c; E9 s$ S( l& _0 i
答案:
1 n9 E% R, u: R* ]3 S1、将A中的初始值改为7FH即可。
8 `1 n$ C9 f0 m, T, d. P2、将RL A改为RR A即可。
; M/ F$ R: [6 @1 c, E
: t- G/ r5 v, w/ D, r

该用户从未签到

2#
发表于 2022-7-25 11:01 | 只看该作者
非常好的初学者,学习资料。

该用户从未签到

3#
发表于 2022-7-25 13:35 | 只看该作者
初学者的学习资料,

该用户从未签到

4#
发表于 2022-7-25 14:28 | 只看该作者
非常好的初学者,学习资料。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-24 07:13 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表