实验具体内容

在 Proteus 环境下搭建如下图所示的电路图:

img

实验功能为:

当按键 SW1 按下之后,D1-D8 轮流点亮,点亮时间为 100ms,当按键停下后,停止轮换,

再次按下后继续轮换。

编程思路

①进行初始化工作,包括设置堆栈指针 SP,将 P2 口所有位设置为 1,使 P2 口所接发光二极管全部熄灭。将显示缓冲单元(设为 20H 单元)初始化为 FEH。

② 从 P1 口读数据,查看 P1.0 位,如果 P1.0 位为 0,则执行如下循环:将显示缓冲元的值送给 P2 口,调用 100ms 延时程序,将显示缓冲单元的值循环左移 1 位,再送回显缓冲单元。如果 P1.0 位不为 0 则不执行上述循环。

③重复上面的操作②

流程图

image-20220212123440620

实验过程

① 根据上述实验内容,在 Proteus 环境下建立上电路图所示原理图,并将其保存为 basicIO_self.DSN 文件。

② 根据编程思路和流程图编写控制源程序,将其保存为 basicIO_self.asm。

③ 将源程序添加到 U1 中,并构造(build)该程序。

④ 执行仿真过程观察 D1-D8 的指示,查看程序功能是否正确。

⑤ 修改延时程序延时参数,重新执行③和④。

实验截图:

按键持续按下时,8个LED灯轮流亮,持续100ms

img

img

实验源程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
    ORG 0000H
   AJMP START

   ORG 0030H
START:  
   mov SP,#60H     ;设置堆栈指针
   MOV P2,#0FFH   ;将P2口所有位设置为1,使所有LED熄灭
   MOV P1,#0FFH   ;将P1口所有位设置为1
   MOV A,#0       ;A = 0
   JNB P1.0,INC1   ;若P1.0 = 0,则跳转到INC1。用来判断按键是否按下,如果按键被按下就跳转到INC1
   SJMP START      ;如果没有被按下,就跳转回START,等待按键被按下
INC1:
INC A           ;A = 1
   CPL A           ;让A按位取反,A = 11111110
CYCLE:
   MOV P2,A        ;P2 = A
   RL A          ;将A左移,原低7位向左移1位,原最高位移至最低位
   LCALL DELAY    ;调用延时100ms子程序
   JNB P1.0,CYCLE  ;检测P1.0的数据。当按钮还是处于按下的状态,则转移到CYCLE
SJMP START      ;当按钮放开,则转移到START

DELAY:  
   MOV R7,#10
DL1:
   MOV R6,#100
DL2:
   MOV R5,#48
   DJNZ R5,$
   DJNZ R6,DL2
   DJNZ R7,DL1
   RET
END