2016-11-02 12:18:53 | 人围观 | 评论:
三、I/O引脚的输出
在第一讲里,在最小系统的电路图里,大家已知P1口和P3口接了16只发光二极管,现在我们将这两个口作为输出口用,很明白,当其中的某个脚为1时,该脚所接的LED是“灭”的;反之,为0时,则“亮”。如下图所示。可见,这里的亮或灭是由硬件的接法决定的(若换一种接法,亮灭的电平会颠倒的)。
由此我们也看出,学习单片机,软、硬件是分不开的,这是它的显著的特点。
下面给大家介绍几条I/O引脚输出的指令:
先介绍指令格式
【标号:】操作码操作数1,操作数2 【,操作数n】【;注释】
以上的指令格式中,方括号内的内容可有可无,若要的话,一定注意标点符号不能省略;操作码必有,它是简单的英语单词以助记符形式出现,便于记忆,它说明了操作的性质;操作数可有可无,可多可少,中间以逗号分隔,它和操作码之间至少空一格,它说明了操作的具体内容;注释也是可有可无,但规范和专业的做法是要有详细的注释,且不是简单的指令说明,而是其物理的、硬件的、实质性的解释。
字节输出的指令
Mov P1,#00000000B ;该指令可使P1口的8个脚(P1.0~P1.7)全部变为低电平,当然,P1口的8只发光管都会点亮;(指令中的操作数2也可写成#0、#0H,前者是10进制写法,后者是16进制写法,均可)
Mov P1,#11111111B ;这条指令相反,8只发光管都会灭。
位输出的指令
Clr P1.0 ;该指令使P1口的0脚变为低电平,它所接的那只发光管亮,不会影响其他。
而 Setb P1.0 这条指令就使P1口的0脚变为高电平。
有了以上这些准备,下面我们就来编一段程序,让P1口和P3口的发光管轮流点亮,每个发光管点亮200ms,轮流不息,俗称“流水灯”。
四、流水灯编程
1.字节方式处理
;****************************************
Org 0000H
;org为伪指令,告诉汇编程序,下面的指令从ROM的0000H处开始放
Main: Mov P1,#11111110B
Mov P3,#11111110B
;可见,以上两条指令使P1口的P1.0脚和P3口的P3.0脚所接发光管点亮
Lcall ys200ms
;上面是一条调用子程序指令,用意是让CPU执行一些其他无关的指令,耗费掉200ms的时间,让刚亮的两只发光管能亮200ms时间,否则,由于CPU执行指令太快,我们将无法分清哪只发光管亮了。
Mov P1,#11111101B
Mov P3,#11111101B ;很显然,换了两只发光管亮
Lcall ys200ms
Mov P1,#11111011B
Mov P3,#11111011B ;很显然,又换了两只发光管亮
Lcall ys200ms
Mov P1,#11110111B
Mov P3,#11110111B ;很显然,又换了两只发光管亮
Lcall ys200ms
Mov P1,#11101111B
Mov P3,#11101111B ;很显然,又换了两只发光管亮
Lcall ys200ms
Mov P1,#11011111B
Mov P3,#11011111B ;很显然,又换了两只发光管亮
Lcall ys200ms
Mov P1,#10111111B
Mov P3,#10111111B ;很显然,又换了两只发光管亮
Lcall ys200ms
Mov P1,#01111111B
Mov P3,#01111111B ;很显然,又换了两只发光管亮
Lcall ys200ms
;到此为止,P1口和P3口的发光管轮流亮了一遍
Ljmp main
;我们应该让CPU返回开始处,再次开始亮灯循环,上边这条指令就是无条件跳转指令,命令CPU跳回标号为main处,继续执行指令,永远往复。
以下给出延时子程序,以保持程序的完整性,但不讲解,以后再说。
Ys200ms: Mov r7,#4
Ys0: Mov r6,#100
Ys1: Mov r5,#250
Djnz r5,$
Djnz r6,ys1
Djnz r7,ys0
Ret
End
;************************************************************
位处理方式
;**************************************************
Org 0000H
Main: Mov P1,#0FFH
Mov P3,#0FFH ;先做准备工作,使所有LED全灭
Loop: Clr P1.0 ;P1.0脚所接发光管点亮
Clr P3.0 ;P3.0脚所接发光管点亮
Lcall ys200ms
Setb P1.0
Setb P3.0 ;在点亮下一只前,关掉已点亮的
Clr P1.1 ;P1.1脚所接发光管点亮
Clr P3.1 ;P3.1脚所接发光管点亮
Lcall ys200ms
Setb P1.1
Setb P3.1 ;在点亮下一只前,关掉已点亮的
Clr P1.2 ;P1.2脚所接发光管点亮
Clr P3.2 ;P3.2脚所接发光管点亮
Lcall ys200ms
Setb P1.2
Setb P3.2 ;在点亮下一只前,关掉已点亮的
Clr P1.3 ;P1.3脚所接发光管点亮
Clr P3.3 ;P3.3脚所接发光管点亮
Lcall ys200ms
Setb P1.3
Setb P3.3 ;在点亮下一只前,关掉已点亮的
Clr P1.4 ;P1.4脚所接发光管点亮
Clr P3.4 ;P3.4脚所接发光管点亮
Lcall ys200ms
Setb P1.4
Setb P3.4 ;在点亮下一只前,关掉已点亮的
Clr P1.5 ;P1.5脚所接发光管点亮
Clr P3.5 ;P3.5脚所接发光管点亮
Lcall ys200ms
Setb P1.5
Setb P3.5 ;在点亮下一只前,关掉已点亮的
Clr P1.6 ;P1.6脚所接发光管点亮
Clr P3.6 ;P3.6脚所接发光管点亮
Lcall ys200ms
Setb P1.6
Setb P3.6 ;在点亮下一只前,关掉已点亮的
Clr P1.7 ;P1.7脚所接发光管点亮
Clr P3.7 ;P3.7脚所接发光管点亮
Lcall ys200ms
Setb P1.7 ;P1.7脚所接发光管灭
Setb P3.7 ;P3.7脚所接发光管灭
Ljmp Loop ;跳至标号LOOP处继续反复
;***********************************************************
延时子程序同上,不再重复。
以上我们可看出,完成相同的任务,但编写程序的方法却不一样,其实还有更多的方法完成这一任务。由此,我们的同学们应该领会到,“指令是死的,人是活的”,“条条大道通北京”,只要发挥我们的聪明才智,总是可以达到目的的。
最后强调一下,做这些发光管亮灭实验的意义何在?它的意义就在于:我们能使发光管随心所欲的亮和灭,且有精确的时间控制,就能对任何其他的外部设备进行控制,如彩灯、电动机、车床等,只是变一变相应的电路而已。
全站搜索