要求在数码管上循环显示数字 1~5。
范例分析:
1.1硬件分析
数码管采用共阳极结构。
1.2软件设计
设计中要求循环显示1~5,很显然应采用循环的方法来实现,最简单的方法是将1~5的段码依次由p0口送出。
准备程序
2、控制转移类指令的特点及使用
(1)长转移指令
ljmp addr16
功能:长距离无条件转移指令
说明:三字节指令,它直接将指令中的16位常数装入pc,使程序无条件转移到指定的地址处执行。目标语句可以是程序存储器64kb空间的任何地方。
(2)绝对转移指令
ajmp addr11
例: 4002h ajmp mm
……
4600h mm: mov a,#00h
注意:目标语句必须和当前语句同页。在51中,64kb程序存储器分成32页,每页2kb(7ffh)。
(3)短跳转指令
sjmp 目标语句(rel)
例: 4060h sjmp loop
……
4090h loop:mov a,#0ffh
……
注意:短跳转的目标语句地址必须在当前语句向前127(7fh)字节,向后128(80h)字节,否则在进行程序编译时会出错。
(4)变址寻址转移指令
jmp @a+dptr
该指令主要用于多分支的跳转程序设计。跳转的目标地址是累加器a和数据指针dptr之和,它可以是64kb存储空间的任何地方。
例 根据标志单元r2中的内容,分别转各个处理程序。
程序如下:
pj1: mov dptr ,#tab1
clr c
mov a,r2
add a,r2 ;(r2) ×2←a
jnc nadd
nc dph ;(r2)×2>;256时,16位数据指针高8位加1
nadd:jmp @a+dptr
tab1:ljmp prg0 ;转处理程序0的首地址
ljmp rrg1
…
ljmp rrg n
(5)减1条件转移指令组
djnz rn,目标地址(rel);如果(rn)-1≠0,则程序跳转到目标语句,否则顺序执行下一条语句。
djnz direct,目标地址(rel);如果(direct)-1≠0,则程序跳转到目标语句,否则顺序执行下一条语句。
例 将8031内部ram的40h~4fh单元置初值a0h~afh。程序为:
start:mov ro,#40h ;ro赋值,指向数据单元
mov r2,#10h ;r2赋值,为传送字节数,十六进制数
mov a,#0a0h ;给a赋值
loop: mov @ro,a ;开始传送
inc,ro ;修改地址指针,准备传下一数地址
inc a ;修改传送数据值
djnz r2,loop ;如果未传送完,则继续循环传送
ret ;当r2的值减为0时,则传送结束
3、延时程序的设计和延时时间的计算方法
延时程序是一种应用较为广泛的小程序,一般采用多条语句循环执行来实现延时。
例1:设计一延时程序,延时时间为1ms(fosc=12mhz)。
例2:设计一延时250ms的程序
已有上例所举延时1ms子程序,调用250次,即得延时250ms子程序
delay2:mov r3,#fah
del3:acall delay1
del2: nop
nop
djnz r3,del3
ret
本段程序延时的时间为:
1+(2+993+2)250+2=249253us
误差不到1ms
思考:如何设计延时1s程序?
4、子程序的设计方法
4.1子程序:在程序中反复多次执行的程序段,可编写为子程序,在使用时通过主程序调用就可以使用它。这样不但可以减少编程工作量,也缩短了程序的长度。
4.2子程序的使用:
(1)子程序调用:
指令:acall ××× ;绝对调用,2kb范围
lcall ××× ;长调用,64kb范围
(2)子程序返回:
指令:ret ;子程序返回指令
reti ;中断子程序返回指令
org 2000h
main: clr p3.2
mov p0,#0f9h
lcall del
mov p0,#0a4h
lcall del
mov p0,#0b0h
lcall del
sjmp main
del: mov r7,#10
del1: mov r6,#123
…………
djnz r7,del1
ret
end
5、循环程序设计的基本方法
循环程序:在程序中需要反复执行的程序段,为了避免在程序中多次的编写,可以通过利用条件转移或无条件转移指令来控制程序的执行。结构流程图一般如下图所示: