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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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-10-8 16:16 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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