微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 单片机学习知识点全攻略(二)

单片机学习知识点全攻略(二)

时间:05-12 来源:本站整理 点击:

=39,后面没H,执行SWAP A之后,可不是(A)=93。要将它化成二进制再算:39化为二进制是10111,也就是0001,0111高4位是0001,低4位是0111,交换后是01110001,也就是71H,即113。

  练习,已知(A)=39H,执行下列单片机指令后写出每步的结果

  CPL A

  RL A

  CLR C

  RRC A

  SETB C

  RLC A

  SWAP A

  通过前面的学习,我们已经掌握了相当一部份的单片机指令,大家对这些枯燥的单片机指令可能也有些厌烦了,下面让我们轻松一下,做个实验。

  实验五:

  ORG 0000H

  LJMP START

  ORG 30H

  START:

  MOV SP,#5FH

  MOV A,#80H

  LOOP:

  MOV P1,A

  RL A

  LCALL DELAY

  LJMP LOOP

  delay:

  mov r7,#255

  d1: mov r6,#255

  d2: nop

  nop

  nop

  nop

  djnz r6,d2

  djnz r7,d1

  ret

  END

  先让我们将程序写入片中,装进实验板,看一看现象。

  看到的是一个暗点流动的现象,让我们来分析一下吧。

  前而的ORG 0000H、LJMP START、ORG 30H等我们稍后分析。从START开始,MOV SP,#5FH,这是初始化堆栈,在本程序中有无此句无关紧要,不过我们慢慢开始接触正规的编程,我也就慢慢给大家培养习惯吧。

  MOV A,#80H,将80H这个数送到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上灯不亮了。这样依次循环,就形成了"暗点流动"这一现象。

  问题:

  如何实现亮点流动?

  如何改变流动的方向?

  答案:

  1、将A中的初始值改为7FH即可。

  2、将RL A改为RR A即可。

  13、单片机逻辑与或异或指令详解

  ANL A,Rn ;A与Rn中的值按位‘与’,结果送入A中

  ANL A,direct ;A与direct中的值按位‘与’,结果送入A中

  ANL A,@Ri ;A与间址寻址单元@Ri中的值按位‘与’,结果送入A中

  ANL A,#data ;A与立即数data按位‘与’,结果送入A中

  ANL direct,A ;direct中值与A中的值按位‘与’,结果送入direct中

  ANL direct,#data ;direct中的值与立即数data按位‘与’,结果送入direct中。

  这几条指令的关键是知道什么是逻辑与。这里的逻辑与是指按位与

  例:71H和56H相与则将两数写成二进制形式:

  (71H) 01110001

  (56H) 00100110

  结果 00100000 即20H,从上面的式子能看出,两个参与运算的值只要其中有一个位上是0,则这位的结果就是0,两个同是1,结果才是1。

  理解了逻辑与的运算规则,结果自然就出来了。看每条指令后面的注释

  下面再举一些例程来看。

  MOV A,#45H ;(A)=45H

  MOV R1,#25H ;(R1)=25H

  MOV 25H,#79H ;(25H)=79H

  ANL A,@R1 ;45H与79H按位与,结果送入A中为 41H (A)=41H

  ANL 25H,#15H ;25H中的值(79H)与15H相与结果为(25H)=11H)

  ANL 25H,A ;25H中的值(11H)与A中的值(41H)相与,结果为(25H)=11H

  在知道了逻辑与指令的功能后,逻辑或和逻辑异或的功能就很简单了。逻辑或是按位"或",即有"1"为1,全"0"为0。例:

  10011000

  或 01100001

  结果 11111001

  而异或则是按位"异或",相同为"0",相异为"1"。例:

  10011000

  异或 01100001

  结果 11111001

  而所有的或指令,就是将与指仿中的ANL 换成ORL,而异或指令则是将ANL 换成XRL。即

  或指令:

  ORL A,Rn ;A和Rn中的值按位‘或’,结果送入A中

  ORL A,direct ;A和与间址寻址单元@Ri中的值按位‘或’,结果送入A中

  ORL A,#data ;A和立direct中的值按位‘或’,结果送入A中

  ORL A,@Ri ;A和即数data按位‘或’,结果送入A中

  ORL direct,A ;direct中值和A中的值按位‘或’,结果送入direct中

  ORL direct,#data ;direct中的值和立即数data按位‘或’,结果送入direct中。

异或指令

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top