使用散轉表可以盡可能的減少程序的編寫,方便。減少判斷次數(shù)。
本文引用地址:http://m.butianyuan.cn/article/201611/320137.htm程序名:散轉程序試驗
;說明: 開使后led1亮,按下任何按鍵,寄存器r0從零加起,根據(jù)r0內(nèi)容,程序散轉到
;相應處執(zhí)行,以點亮不同的led
;入口: p3.0--p3.3
;出口: P0
;練習日期:2007--06--17 好心情;修正日期:2007--06--18
;修正內(nèi)容:將原來用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口狀態(tài)
cjne a, #0fh, F1 ;判斷是否有按鍵按下,若有則跳到F1 處(比較轉移,比較a與#0fh的大小
;若不相等,責轉移,否則順序往下執(zhí)行,如果第一個數(shù)大于第二個數(shù),則CY
;清零,否則置1,不影響其它操作位,3字節(jié)指令
acall del
ajmp st
;**********************去抖動***********************************************
F1: acall del ;延時
cjne a, #0fh, f2 ;再次判斷按鍵,若按下,則區(qū)按鍵處理程序,否則為干擾
ajmp st
;**********************按鍵處理*********************************************mov
F2: inc r0 ;r0加1
cjne r0, #08h, F3 ;判斷R0是否=8,若等于,則順序執(zhí)行并將R0,清0,否則跳轉到散轉程序
mov r0, #00h ;R0清零
ajmp main
;**********************散轉處理*********************************************
F3: mov DPTR, #TAB ;將數(shù)據(jù)表地址傳送到DPTR
mov a, R0 ;將偏移量送入a
clr c ;清零進位位
rlc a ;累加器a內(nèi)容左移,(相當于*2)
jnc nadd ;若cy為零,則跳轉到NADD,否則順序執(zhí)行
inc dph ;若cy為1時,DPH+1(因為DPTR為16位地址,a為8位,在此處加一,相當于DPTR低8位
;向高8位進位)修正地址
NADD: jmp @a+DPTR ;散裝指令,將a中的無符號數(shù)與數(shù)據(jù)指針DPTR的16位相加,相加之和做為下一條指令的
;地址送入PC中,不改變a和dptr,也不影響標志位,采用變址方式實現(xiàn)無條件轉移
;其特點時轉移地址可以在程序中加以改變
;***********************數(shù)據(jù)表************************************************
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
評論