原标题:单片机 散转表程序的使用
使用散转表可以尽可能的减少程序的编写,方便。
减少判断次数。
程序名:散转程序试验
;说明: 开使后 1亮,按下任何按键,寄存器r0从零加起,根据r0内容,程序散转到
;相应处执行,以点亮不同的led
;入口: p3.0--p3.3
;出口: P0
;练习日期:2007--06--17 好心情
;修正日期:2007--06--18
;修正内容:将原来用ljmp的部分换为ajmp,将R0结束值改为08
;**************************************************************************
org 0000h
ljmp main
org 0030h
main: mov p0, #07fh ;初始化p0口,led1点亮
mov r0, #00h ;初始化R0,使R0置1
;**********************按键检测********************************************
st: mov P3, #0Fh ;设置P3口,为检测按键做准备,将p3低3位置0
mov a, p3 ;读p3口状态
cjne a, #0fh, F1 ;判断是否有按键按下,若有则跳到F1 处(比较转移,比较a与#0fh的大小
;若不相等,责转移,否则顺序往下执行,如果第一个数大于第二个数,则CY
;清零,否则置1,不影响其它操作位,3字节指令
acall del
ajmp st
;**********************去抖动***********************************************
F1: acall del ;延时
cjne a, #0fh, f2 ;再次判断按键,若按下,则区按键处理程序,否则为干扰
ajmp st
;**********************按键处理*********************************************mov
F2: inc r0 ;r0加1
cjne r0, #08h, F3 ;判断R0是否=8,若等于,则顺序执行并将R0,清0,否则跳转到散转程序
mov r0, #00h ;R0清零
ajmp main
;**********************散转处理*********************************************
F3: mov DPTR, #TAB ;将数据表地址传送到DPTR
mov a, R0 ;将偏移量送入a
clr c ;清零进位位
rlc a ;累加器a内容左移,(相当于*2)
jnc nadd ;若cy为零,则跳转到NADD,否则顺序执行
inc dph ;若cy为1时,DPH+1(因为DPTR为16位地址,a为8位,在此处加一,相当于DPTR低8位
;向高8位进位)修正地址
NADD: jmp @a+DPTR ;散装指令,将a中的无符号数与数据指针DPTR的16位相加,相加之和做为下一条指令的
;地址送入PC中,不改变a和dptr,也不影响标志位,采用变址方式实现无条件转移
;其特点时转移地址可以在程序中加以改变
;***********************数据表************************************************
TAB: nop
nop ;空指令,修正地址
ajmp pb1
ajmp pb2
ajmp pb3
ajmp pb4
ajmp pb5
ajmp pb6
ajmp pb7
;***********************延时***************************************************
del: mov R1, #014h
d1: mov R2, #0FFH
d2: mov r5, #01fh
djnz R5, $
djnz R2, d2
djnz R1, d1
ret
;***********************显示**************************************************
pb1: mov p0, #03fh
acall del
ljmp st
pb2: mov p0, #01fh
acall del
ljmp st
pb3: mov p0, #0fh
acall del
ajmp st
pb4: mov p0, #07h
acall del
ajmp st
pb5: mov p0, #03h
acall del
ajmp st
pb6: mov p0, #01h
acall del
ajmp st
pb7: mov p0, #00h
acall del
ajmp st
end
责任编辑: