当年在大学里面,用的是个什么牌子的实验箱,实验程序,就是这个题目。
想不到,多年后,还有人问这样的问题。
翻开笔记,整理了一下程序,如下。
现在楼主要求使用proteus仿真,本人尚未测试,LED输出的部分,软件、硬件都需要重新设计。
=====================
2.多路分支程序
根据A中内容(来自20H单元)进行多路分支的程序如下:
ORG0000H
MOV20H, #0 每次实验,这里可以改为0、1、2和3
-----------------------------------
MOV A, 20H取预置数据
MOV DPTR, #J_TAB 散转表起始地址
RL A A 乘以 2
JMP @A+DPTR散转指令
------------------------------- 多路分支结构----
J_TAB: 散转表
AJMP P1
AJMP P2
AJMP P3
AJMP P4
P1:
MOV 20H, #0C0H "0"字的7段码
LJMP DISPLAY
P2:
MOV 20H, #0F9H "1"字的7段码
LJMP DISPLAY
P3:
MOV 20H, #0A4H "2"字的7段码
LJMP DISPLAY
P4:
MOV 20H, #0B0H "3"字的7段码
----------------------------------------------
DISPLAY:循环显示程序
MOV A, 20H 取来7段码
MOV R0, #22H 显示器段地址
MOV R1, #21H 显示器位地址
MOVX @R0, A将7段码输出
MOV A, #01H 最"右"边的位发光
D_LOOP:
MOVX @R1, A
MOV R2, #20H 准备延时
LCALL DELAY 调用延时子程序
RL A 左移显示的位
SJMP D_LOOP无穷循环
----------------------------------------------
DELAY: 延时子程序
PUSH 02H
DL0: PUSH 02H
DL1: PUSH 02H
DJNZ R2, $
POP 02H
DJNZ R2, DL1
POP 02H
DJNZ R2, DL0
POP 02H
DJNZ R2, DELAY
RET
----------------------------------------------
用散转表 直接用LJMP指令组成转移表.由于LJMP是3字节的指令,在组成指令转移表时,当执行JMP @A+DPTR指令时,可能出现DPTR低8位向高8位的进位,用加法指令对DPTR直接修改来实现. 程序如下: ORG 0000H PJ2: MOV DPTR,#TAB2 CLR C MOV R5,#0 MOV A,R6 RLC A R6*2 JNC AD1 INC R5 有进位,高8位加1 AD1: ADD A,R6 R6*3 JNC AD2 INC R5 有进位,高8位加1 AD2: MOV A,R5 ADD A,DPH DPTR高8位调整 MOV A,R6 JMP @A+DPTR 得散转地址 TAB2: LJMB LOP0 LJMP LOP1 …… LJMP LOPn END 用AJMP组成的散转表为二字节一项,而用LJMP组成的散转表则为三字节一项,根据R6中的内容或乘2,或乘3得每一处理程序的入口地址表指针. 应该不难理解吧,耐心点看欢迎分享,转载请注明来源:内存溢出
评论列表(0条)