内容正文:
项目五 单片机控制流水灯
任务一 彩灯基本控制(一)
任务二 彩灯基本控制(二)
任务三 键控彩灯
返回
1
任务一 彩灯基本控制(一)
一、任务描述
利用 P0 口实现对单个彩灯闪烁、循环控制。通过由浅及深的程序及指令介绍,逐渐引入单片机编程的基本知识;结合硬件电路,使学生初步了解、掌握 P0 口作为输出口使用的方法;掌握软件延时的编程方法;熟悉针对单片机应用电路开发程序的过程。
二、基础知识
1. 单片机程序
单片机程序是按照一定目的有效组织起来的一系列指令的集合。指令是指挥单片机工作的命令,是单片机软件程序的基本单元。指令有两种基本形式,即机器指令和汇编语言指令。
下一页
返回
任务一 彩灯基本控制(一)
2. 单片机程序开发过程
在编写汇编语言程序时,应本着程序设计简明,占用内存少,执行时间最短的原则,大致有以下几个过程:
(1) 需求分析。先要对所需解决的问题进行分析,明确目的和任务,了解现有条件和目标要求后再确定设计方法。
(2) 画流程图。流程图又称为程序框图,是使用最广泛的描述过程设计的方法,是人们对解决问题的方法、思路或算法的一种描述。
(3) 编写源程序。根据流程图中各部分的功能,写出具体程序。
(4) 汇编和调试。对已编好的程序,先进行汇编。在汇编过程中,若还有错误,需要对源程序进行不断地修改。汇编工作完成后,上机调试运行。
上一页
下一页
返回
任务一 彩灯基本控制(一)
三、单灯闪烁控制程序设计
电路原理图如图 5−1 所示,通过简单的程序控制 P0.0 口的发光二极管闪烁发光。
1. 单灯闪烁控制(一)
1) 编程思路
根据电路设计,发光二极管阳极接 V CC ,阴极接 P0.0 管脚。当 P0.0 管脚电平为低电平时,发光二极管导通发光;当 P0.0 管脚电平为高电平时,发光二极管截止熄灭。根据以上原理,通过单片机控制 P0.0 管脚电平变化,即可实现对发光二极管的闪烁控制。R 7 ~R 14 为限流电阻,防止发光二极管因电流过大而烧坏。
上一页
下一页
返回
任务一 彩灯基本控制(一)
利用“SETB P0.0”指令使 P0.0 为高电平,发光二极管不发光(灭),延时一段时间;利用“CLR P0.0”指令使 P0.0 为低电平,发光二极管发光(亮),再延时一段时间后,无条件跳转到开始,形成循环,使得 P0.0 连接的发光二极管能够忽明忽暗,闪烁。
2) 程序清单
单灯闪烁 1.ASM
ORG 0000H ;开始
START: SETB P0.0 ;P0.0 置 1
LCALL DELAY ;调用延时
CLR P0.0 ;P0.0 清零
上一页
下一页
返回
任务一 彩灯基本控制(一)
LCALL DELAY ;调用延时
AJMP START ;循环
DELAY: MOV R7,#100 ;延时子程序
DL1: MOV R6,#50
DL2: MOV R5,#20
DJNZ R5,$
DJNZ R6,DL2
DJNZ R7,DL1
RET
END
上一页
下一页
返回
任务一 彩灯基本控制(一)
3) 程序分析
上述程序在单片机上电复位后,开始控制 P0.0 口的发光二极管每隔 0.2 s 左右闪亮一次,亮 0.2 s,灭 0.2 s。
(1) ORG 0000H:表示程序从 0000H 地址开始执行,是汇编语言程序的开头。
(2) SETB P0.0:使 P0.0 口置 1(即高电平),由于发光二极管为低电平发光,所以不发光。
(3) LCALL DELAY:调用延时子程序。(关于延时子程序的编写将在后面介绍)
(4) CLR P0.0:使 P0.0 清零(即低电平),发光二极管发光。
上一页
下一页
返回
任务一 彩灯基本控制(一)
(5) AJMP START:跳转到 START 处,实现程序循环执行。
(6) RET:子程序返回指令,有子程序的调用,就必须有 RET。
(7) END:END 伪指令成为结束汇编伪指令,常用于汇编语言源程序末尾,用来指示源程序到此全部结束。在机器汇编时,当汇编程序检测到该语句时,它就确认汇编语言源程序已经结束,对 END 后面的指令不予汇编。因此,一个源程序只能有一个 END 语句,而且必须放在整个程序的末尾。
(8) 标号:标号对应指令地址,用于标记跳转、循环体等的开始位置,程序中最后生成的代码中标号都换成了相应的数值,不占据内存。
上一页
下一页
返回
任务一 彩灯基本控制(一)
通过在目标地址的前面放上一个标号,可以在指令中使用标号来代替直接使用地址。标号可有可无,只有当需要用符号地址来访问该语句时,才给此语句赋予标号。
指令“START:MOV A,#00H”中,符号 START 即为标号,其后用“:”与指令分隔开。
2. 单灯闪烁控制(二)
1) 编程思路
利用“CPL P0.0”指令,每隔一定的时间产生一次电平翻转,使得 P0.0 连接的发光二极管能够忽明忽暗,闪烁。
上一页
下一页
返回
任务一 彩灯基本控制(一)
2) 程序清单
单灯闪烁 2.ASM
START: CPL P0.0 ;位取反
LCALL DELAY ;调用延时子程序
AJMP START ;循环
3) 程序分析
本程序完整的形式应包括单灯闪烁控制程序 1 中的“头”(ORG 0000H)、“尾”(END)及延时子程序(DELAY:后到 RET 段程序),以后例程序都需增加相应的部分。本程序的执行结果:在单片机上电复位后,开始控制 P0.0 口的发光二极管每隔 0.2 s 左右闪亮一次,亮0.2 s,灭 0.2 s。
上一页
下一页
返回
任务一 彩灯基本控制(一)
CPL P0.0:将 P0.0 位取反,上电复位后,单片机 4 个 I/O 口(P0、P1、P2、P3)均为00H,第一次执行本条指令后,P0.0 为 1,发光二极管灭。第二次执行时,P0.0 为 0,发光二极管亮。第三次灭,第四次亮,周而复始循环闪亮。“LCALL DELAY”调用延时子程序,“AJMP START”无条件跳转,形成循环。
3. 单灯循环控制(一)
1) 编程思路
前面的例子是利用单片机控制一个独立发光二极管,可将其看作使用的是单片机位操作指令。如果要同时操作多位发光二极管,比如图中电路八个发光二极管,则可以直接将其视为一个字节,直接操作单片机端口。
上一页
下一页
返回
任务一 彩灯基本控制(一)
字节与位的对应关系如图 5−2 所示。以P0 端口为例,P0 端口相当于一个字节,由 P0.0、P0.1、…、P0.7 八个位组成。
编程时可以单独操作某一位,也可以向P0 端口赋值一个字节数据,直接操作八个位对应的状态。
根据这个思路,把不同的立即数输出到 P0 口,程序顺序执行,然后再无条件跳转到初始处,进行循环,实现从 P0.0 口到 P0.7 口的发光二极管依次循环亮、灭。
2) 程序清单
单灯循环闪烁 1.ASM
MAIN: MOV P0,#0FFH ;全灭
上一页
下一页
返回
任务一 彩灯基本控制(一)
LCALL DELAY ;调用延时子程序
MOV P0,#11111110B ;P0.0 对应的发光二极管亮
LCALL DELAY
MOV P0,#11111101B; P0.1 对应的发光二极管亮
LCALL DELAY
MOV P0,#11111011B; P0.2 对应的发光二极管亮
LCALL DELAY
MOV P0,#11110111B ;P0.3 对应的发光二极管亮
LCALL DELAY
上一页
下一页
返回
任务一 彩灯基本控制(一)
MOV P0,#11101111B ;P0.4 对应的发光二极管亮
LCALL DELAY
MOV P0,#11011111B ;P0.5 对应的发光二极管亮
LCALL DELAY
MOV P0,#10111111B ;P0.6 对应的发光二极管亮
LCALL DELAY
MOV P0,#01111111B ;P0.7 对应的发光二极管亮
LCALL DELAY
AJMP MAIN ;无条件跳转到 MAIN,使程序实现循环
上一页
下一页
返回
任务一 彩灯基本控制(一)
3) 单灯循环闪烁程序分析
程序执行结果是从 P0.0 口到 P0.7 口的发光二极管依次循环亮、灭。
MOV P0,#11111110B:将二进制数据 11111110B 送到输出寄存器 P0,#号表示其后的是数据,字母 B 表明前面的数据为二进制。使 P0.0 为 0,P0.0 引脚的发光二极管点亮。该指令属于数据传送指令,其通用表示形式为:
MOV P0,#DATA
#DATA是立即数,可以为二、十、十六进制数。表示方法为:二进制后加B,如#11110000B;十进制后加 D,如#100D(D 可以不用,省略);
上一页
下一页
返回
任务一 彩灯基本控制(一)
十六进制数加H,如#7EH(若十六进制数的第一个字符为字母,需在其前加0,如#F7H 应写为#0F7H)。故该指令亦可写成:MOV P0,#0FEH。
LCALL DELAY:调用延时子程序。在 WAVE 集成调试环境中可以不区分 LCALL 和 ACALL,均可写为 CALL 替代,即本条指令可以写成“CALL DELAY”的形式,调用的空间大小由环境自动编译生成相应的机器码。类似的情况还有用 JMP 代替AJMP、LJMP、SJMP 使用,如“AJMP MAIN”可以写成“JMPMAIN”。这样对初学者来说会省去很多不必要的麻烦。
图 5−3 所示为单灯循环闪烁程序原理示意图。
上一页
下一页
返回
任务一 彩灯基本控制(一)
4. 单灯循环闪烁控制(二)
1) 编程思路
利用带进位标志位的左(右)环移,把环移的结果(一定规律的立即数)输出到 P1 口,程序采用顺序执行,然后再无条件跳转到初始处,进行循环。
2) 程序清单
单灯循环闪烁 2.ASM
MAIN: MOV A,#0FFH ;(A)=#0FFH
CLR C ;CY 清零,CY=0
LOOPL: RLC A ;带进位标志左环移一位
上一页
下一页
返回
任务一 彩灯基本控制(一)
JNC LOOPR ;若 CY=0,转到 LOOPR,否则顺序执行
MOV P0,A ;将移位结果输出到 P0 口,控制发光二极管发不发光
CALL DELAY ;调用延时子程序
JMP LOOPL ;无条件跳转到 LOOPL,形成左移循环
LOOPR: RRC A ;带进位标志右环移一位
JNC LOOPL ;若 CY=0,转到 LOOPL,否则顺序执行
MOV P0,A
CALL DELAY
JMP LOOPR ;无条件跳转到 LOOPL,形成右移循环
上一页
下一页
返回
任务一 彩灯基本控制(一)
3) 程序分析
程序执行结果是从 P0.0 口到 P0.7 口的各发光二极管依次亮、灭一次后,再从 P0.7 口到P0.0 口的各发光二极管依次亮、灭一次,往返循环执行。程序通过“JNC LOOPR”和“JNCLOOPL”两条指令实现判断左移是否完成或右移操作是否完成,实现对程序执行的分支操作。
该程序应用了逻辑循环指令及条件转移指令。
(1) RLC A:带进位循环左移指令,累加器内容连同进位标志位循环左移一位,An−1←(An);n=0~6;A0←(C);C←(A7)。如(A)=10011100B,CY=0,执行“RLC A”后,(A)=00111000B,CY=1。
上一页
下一页
返回
任务一 彩灯基本控制(一)
(2) RRC A:带进位循环右移指令,累加器内容连同进位标志位循环右移一位,An←(An+1);n=0~6;A7←(C);C←(A0)。如(A)=10011101B,CY=0,执行“RRC A”后,(A)=01001110B,CY=1。
(3) JNC REL:累加位条件转移指令,根据进位标志位(CY)的状态决定程序是否转移。若为 0 则转移;否则顺序执行。REL 可直接使用标号替代。如“JNC LOOPR”,若CY=0,转到 LOOPR,否则顺序执行。如“JNC LOOPL”,若 CY=0,转到 LOOPL,否则顺序执行。
上一页
下一页
返回
任务一 彩灯基本控制(一)
5. 延时子程序
以上各程序中均使用了延时子程序 DELAY,下面对相关知识作一介绍。
1) 子程序
在程序设计中,会有一些多次重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。
上一页
下一页
返回
任务一 彩灯基本控制(一)
2) 延时子程序
以上各程序中所用延时子程序如下:
DELAY: MOV R7,#100 ;延时子程序,执行时间:1 次×1 T
DL1: MOV R6,#50 ;执行时间:1 次×1 T
DL2: MOV R5,#20 ;执行时间:1 次×1 T
DJNZ R5,$ ;执行时间:20 次×2 T 共 50 次 共 100 次
DJNZ R6,DL2 ;执行时间:1 次×2 T
DJNZ R7,DL1 ;执行时间:1 次×1 T
RET ;延时子程序返回,执行时间:2 T
上一页
下一页
返回
任务一 彩灯基本控制(一)
若晶体振荡器频率 f osc =12 MHz,则机器周期 T=1 μs,由上述分析就可求出延时子程序的延时时间=(1+(1+(1+20×2+1×2)×50+1)×100+2)×1 μs=215 203 μs。定时精度要求不高的条件时可采用本方式定时,若精度要求高时应使用定时器方式定时。相关指令介绍如下:
(1) MOV R7,#100:使(R7)=100,#100 是#100D 的简写(D 可省略),表示是十进制数。MOV R6,#50:使(R6)=50。MOV R5,#20:使(R5)=20。
(2) DJNZ R6,DL2:工作寄存器 R6 内的数据减 1 后,如结果为 0 则顺序执行,不为0 则转移到 DL2(标号)处。DJNZ R7,DL1:工作寄存器 R7 内的数据减 1,如结果为 0则顺序执行,不为 0 仍执行本条指令继续减 1,直到为 0。
上一页
返回
任务二 彩灯基本控制(二)
一、任务描述
通过查表的方式利用 P0 口实现对彩灯闪烁、循环方式等的控制。通过程序的介绍,结合硬件电路,使学生了解、掌握 P0 口作为输出口使用的方法;结合本任务和任务一的举例程序了解单片机的汇编语言程序结构,掌握流程图画法;熟悉单片机汇编语言编程的方法。
二、基础知识
1. 花样彩灯控制硬件电路
电路原理图如图 5−1 所示,8 个发光二极管 D1~D8 分别由 P0.0~P0.7 控制。
下一页
返回
任务二 彩灯基本控制(二)
由图分析可知 P0.0~P0.7 的控制信号为低电平“0”时,相应的发光二极管发光;为高电平“1”时,相应的发光二极管熄灭。
2. 程序流程图
程序流程图用各种图形、符号、指向线等来说明程序设计的过程,它可以清晰表达程序的设计思路。程序流程图具有结构清晰、逻辑性强、便于描述、容易理解等优点,对于程序设计思路的梳理有很多帮助作用。流程图常用的符号和说明如表 5−1 所示。
3. 汇编语言程序结构
汇编语言程序有多种结构类型:顺序程序、分支程序、循环程序、查表程序等,下面对各种程序设计方法作一简单介绍。
上一页
下一页
返回
任务二 彩灯基本控制(二)
1) 顺序程序
顺序程序又称为直接程序,在程序执行时从第一条指令开始顺序执行直到最后一条指令为止。顺序结构程序比较简单,能完成一定的功能任务,是构成复杂程序的基础。
例如单灯闪烁 1.ASM 中的:
SETB P0.0
LCALL DELAY
CLR P0.0
LCALL DELAY
此程序段就是顺序执行的程序结构,流程图如图 5−4 所示。
上一页
下一页
返回
任务二 彩灯基本控制(二)
2) 分支程序
单片机具有逻辑判断的能力,它能根据条件进行判断并根据判断结果选择相应程序入口。根据不同的条件,要求进行相应的处理,此时就应采用分支程序结构。任务一中介绍的条件转移指令(JNC、DJNZ)就可以实现分支程序。
例如单灯循环闪烁 2.ASM 中的如下程序段:
RLC A
JNC LOOPR
MOV P0,A
LCALL DELAY
上一页
下一页
返回
任务二 彩灯基本控制(二)
程序中的 JNC 就实现了一次分支程序的结构,如图 5−5 所示。
3) 循环程序
在单片机应用中,当程序处理的对象具有某种重复性的规律时,需要用到循环程序。循环程序一般由以下四个部分组成:
(1) 置循环初值。在进入循环之前,要对循环中需要使用的寄存器和存储器赋予其规定的初始值,如循环次数、循环中工作单元的初值等。
(2) 置循环体。循环体是程序中需要重复执行的部分,是循环结构中的主要部分。
(3) 循环修改。每执行一次循环,就对有关参数进行相应的修改,使指针指向下一数据所在的位置,为进入下一轮循环做准备。
上一页
下一页
返回
任务二 彩灯基本控制(二)
(4) 循环控制。在程序执行中需要根据循环计数器的值或其他条件,来判断控制循环是否该结束。
以上四部分有两种结构形式,如图 5−7 所示。
4) 散转程序
散转程序可以简便地实现很多分支出口的转移。散转多用于打印机等计算机外围设备的单片机中。如图 5−8 所示。
5) 子程序
在利用汇编语言编制程序时,往往会遇到重复多次地去执行某程序段,对于这种情况,往往把重复的程序编写为一段子程序,可以方便地通过主程序调用它。
上一页
下一页
返回
任务二 彩灯基本控制(二)
这样,可以减少编制程序的工作。实际上,通常把一些运算程序写成子程序形式,被随时调用,为广大用户提供方便。主程序调用子程序及子程序与子程序间的调用关系如图 5−9 所示。
由图示可知,调用和返回构成了子程序调用的完整过程。为了实现这一过程,必须有子程序调用和返回指令,调用指令在主程序中使用,返回指令应该是子程序的最后一条指令。
执行完这条指令后,程序返回主程序断点后继续执行。前面我们已讲过了 LCALL 和 ACALL调用指令及子程序返回指令 RET,在应用子程序编制程序时,必须一定注意:若有调用指令,也必须要有返回指令。对于许多个子程序嵌套,更应注意这一点。
上一页
下一页
返回
任务二 彩灯基本控制(二)
在编制比较复杂的子程序中,往往还可能再调用另一个子程序,这种子程序再次调用子程序的情况,成为子程序的嵌套。
6) 查表程序
在 MCS−51 型单片机应用系统中,查表程序用来完成数据计算及转换等功能,查表程序单片机技术应用具有程序简单、使用便捷、执行速度快等特点。通常数据表格被存放在程序存储器 ROM 中,所以在编制程序时,可以用 DB 伪指令将表格中内容存入 ROM。常用查表指令使用方法有以下两种:
(1) MOVC A,@ A+PC
说明:用 PC 作为基址寄存器时,由于 PC 是一个程序计数器,所以查表时操作可分三步:
上一页
下一页
返回
任务二 彩灯基本控制(二)
① 变址值存于累加器 A 中;
② 偏移量加上累加器 A→累加器 A 中;
③ 执行指令“MOVC A,@ A+PC”。
(2) MOVC A,@ A+DPTR
说明:该指令用 DPTR 作基址寄存器,查表时分以下三步进行:
① 基址值赋给 DPTR;
② 变址值存于累加器 A 中;
③ 执行指令“MOVC A,@ A+DPTR”。
上一页
下一页
返回
任务二 彩灯基本控制(二)
三、花样彩灯控制程序设计
通过查表程序控制 P0 口的发光二极管周期性变化花样闪烁发光。
1. 编程思路
利用查表的方式实现彩灯的花样控制,实现多种花样周期性地闪烁。并判断查表是否结束,同时将查表取得的数据送到 P0 口线上,实现输出,使连接的发光二极管能够忽明忽暗,闪烁,形成彩灯花样。程序流程图如图 5−10 所示。
2. 程序清单
单灯闪烁 1.ASM
MAIN: CLR A ;初始化
上一页
下一页
返回
任务二 彩灯基本控制(二)
MOV DPTR,#SHEET ;取表首地址
MOV R0,A ;初始化
LOOP: MOV A,R0 ;准备查表
MOVC A,@A+DPTR ;查表
CJNE A,#01H,SHOW ;判断查表结束没有?
AJMP MAIN ;若查表结束,重新开始
SHOW: MOV P0,A ;输出到 P0 口
LCALL DELAY ;调用延时子程序
INC R0 ;准备下次查表
上一页
下一页
返回
任务二 彩灯基本控制(二)
AJMP LOOP ;继续查表
DELAY: MOV R7,#100 ;延时子程序
D1: MOV R6,#50
D2: MOV R5,#50
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET
SHEET: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH;单灯流水两遍
上一页
下一页
返回
任务二 彩灯基本控制(二)
DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
DB 0FAH,0F5H,0EBH,0D7H,0AFH,5FH,0BEH,7DH;双灯流水两遍
DB 0FAH,0F5H,0EBH,0D7H,0AFH,5FH,0BEH,7DH
DB 01H;表结束标志
3. 程序分析
上述程序在单片机上电复位后,开始控制 P0 口的发光二极管从 D1 开始至 D8 依次连续每隔 0.2 s 左右闪亮一次,呈现流水状两次,然后 D1 和 D3 同时亮,D2 和 D4 同时亮,依次每隔 0.2 s,就有两个灯亮。
上一页
下一页
返回
任务二 彩灯基本控制(二)
(1) CLR A:将 A 清零,(A)=0,初始化为查表做准备;
(2) MOV DPTR,#SHEET:将表 SHEET 的首地址送到 DPTR,取表首地址;
(3) MOV R0,A:数据缓存,初始化;
(4) MOV A,R0:准备查表;
(5) MOVC A,@A+DPTR:查表指令,将完成(A)←((A)+DPTR),在 ROM 区的 SHEET 表中取数据,查表。
(6) CJNE A,#01H,SHOW:判断(A)是否等于 01H,若相等则顺序执行,若不等则转移到 SHOW 处,判断查表结束没有。
上一页
下一页
返回
任务二 彩灯基本控制(二)
(7) INC R0:(R0)=(R0)+1,与(4)结合即是为取表中的下一个数据做准备,准备下次查表;
(8) DB 0FEH,0FDH…:DB 为定义字节指令,项或项表指所定义一个字节或用逗号分开的字符串。汇编程序把 DB 指令中项或项表所指字符的内容(数据或 ASCII 码)依次存入从标号开始的存储器单元。如本例中的定义,即是将 SHEET 表中第一个数据 0FEH,…,最后一个数据 01H 依次放入存储器单元。
由上述程序分析,采用查表方式建立的程序,灵活性比前面任务一的程序灵活得多,想改变花样无须再将全部程序推翻,只需将数据表中的数据进行相应的改动即可。
上一页
返回
任务三 键控彩灯
一、任务描述
通过对按键的操作,选择彩灯的闪亮方式,若无键按下,全部彩灯忽明忽暗闪亮,若进入某种闪亮方式后,再有键按下,就进入按键对应的闪亮方式,若无键按下则在该花样中循环闪亮。
二、基础知识
1. 键控彩灯硬件电路
电路原理由图 5−11 与图 5−12 共同构成,12 个发光二极管中 D1~D8 分别由 P0.0~P0.7 控制,D9~D12 分别由 P1.0~P1.3 控制。由图分析可知控制信号为低电平“0”时,相应的发光二极管发光;为高电平“1”时,相应的发光二极管熄灭。
下一页
返回
任务三 键控彩灯
按键电路原理图如图 5−12 所示,按键分别连接在 P3.2~P3.5 脚,按键按下时引脚的状态为“0”,释放时为“1”。
2. 按键的程序设计
键盘是计算机最常用的输入设备,是实现人机对话的一种纽带。按其结构形式可分为非编码键盘和编码键盘。编码键盘采用硬件方法产生键码。每按下一个键,键盘能自动生成键盘代码,键数较多,且具有去抖动功能。这种键盘使用方便,但硬件较复杂,PC 机所用键盘即为编码键盘。非编码键盘仅提供按键开关工作状态,其键码由软件确定,这种键盘键数较少,硬件简单,广泛应用于各种单片机应用系统,本书主要介绍非编码键盘的设计与应用。
上一页
下一页
返回
任务三 键控彩灯
按照键盘与单片机的连接方式可分为独立式键盘与矩阵式键盘。独立式键盘相互独立,每个按键占用一根 I/O 口线,每根 I/O 口线上的按键工作状态不会影响其他按键的工作状态。
这种按键软件程序简单,但占用 I/O 口线较多(一根口线只能接一个键),适用于键盘应用数量较少的系统中。图 5−12 为 4 个独立式按键的应用电路。
三、键控彩灯程序设计
1. 编程思路
利用查表的方式实现彩灯的花样控制,实现多种花样周期性地闪烁。
上一页
下一页
返回
任务三 键控彩灯
并判断查表是否结束,同时将查表取得的数据送到 P0 口线上,实现输出,使连接的发光二极管闪烁,形成彩灯花样。程序流程图如图 5−15 所示。
2. 程序清单
单灯闪烁 1.ASM
ORG 0000H
JMP MAIN
ORG 0030H
MAIN: MOV P0,#0FFH
MOV P1,#0FFH
上一页
下一页
返回
任务三 键控彩灯
MOV P3,#0FFH
MOV P0,#00H ;开始运行,无键按下时全部灯闪亮
MOV P1,#00H
CALL DELAY
MOV P0,#0FFH
MOV P1,#0FFH
CALL DELAY
CALL KEY ;调用按键查询子程序
JMP MAIN ;若无键按下,返回开始
上一页
下一页
返回
任务三 键控彩灯
FUN0: MOV P0,#0F8H ;花样 1:P0.0~P0.3 对应的发光二极管循环闪亮
CALL DELAY
MOV P0,#0FFH
CALL DELAY
CALL KEY
JMP FUN0 ;若无键按下,接着执行本花样
FUN1: MOV P0,#0C7H ;花样 2:P0.3~P0.5 对应的发光二极管循环闪亮
上一页
下一页
返回
任务三 键控彩灯
CALL DELAY
MOV P0,#0FFH
CALL DELAY
CALL KEY
JMP FUN1 ;若无键按下,接着执行本花样
FUN2: MOV P0,#03FH ;花样 3:P0.6、P0.7、P1.0 对应的发光二极管循环闪亮
MOV P1,#0FEH
CALL DELAY
MOV P0,#0FFH
上一页
下一页
返回
任务三 键控彩灯
MOV P1,#0FFH
CALL DELAY
CALL KEY
JM FUN2 ;若无键按下,接着执行本花样
FUN3: MOV P1,#0F1H ;花样 4:P1.1~P1.4 对应的发光二极管循环闪亮
CALL DELAY
MOV P1,#0FFH
CALL DELAY
上一页
下一页
返回
任务三 键控彩灯
CALL KEY
JMP FUN3 ;若无键按下,接着执行本花样
DELAY: MOV R7,#30 ;延时子程序
D1: MOV R6,#50
D2: MOV R5,#50
DJNZ R5,$
DJNZ R6,D2
DJNZ R7,D1
RET
END
上一页
下一页
返回
任务三 键控彩灯
3. 程序分析
本程序运行的结果是没有键按下时,12个发光二极管共同闪亮。当S7按下时,只有P0.0~P0.3 对应的发光二极管循环闪亮,若再没其他按键按下,程序将保持这种状态,其他按键的功能都与此相同。当 S8 按下时,P0.3~P0.5 对应的发光二极管循环闪亮。当 S9 按下时,P0.6、P0.7、P1.0 对应的发光二极管循环闪亮。当 S10 按下时,P1.1~P1.4 对应的发光二极管循环闪亮。
本程序完整形式需将本任务的另外两个程序(JP 程序段、KEY 程序段)和本程序联系在一起,才能运行。
上一页
返回
图 5 - 1
返回
图 5 - 2
返回
图 5 - 3
返回
表 5 - 1
返回
图 5 - 4
返回
图 5 - 5
返回
图 5 - 7
返回
图 5 - 8
返回
图 5 - 9
返回
图 5 - 10
返回
图 5 - 11
返回
图 5 - 12
返回
图 5 - 15
返回
$$