4-2led霹雳灯实验
4-2 LED霹靂燈實驗
4-2-1 目的
介紹查
指令,並利用查表方式讓八顆LED達到各式各樣的燈號效果。
4-2-2 電路圖
圖4-2-1
產生其他各種燈號的變化,「查表法」是最方便的方式,只要事先將所要的燈號變化資料依序存放於程式記憶體(此即所謂「建表」),再由程式控制在適當的時機讀取並由I/O埠送出,就可以讓LED展現不同的顯示效果。
4-2-3 流程圖
4-2-4 程式碼
4-2-4-1
(TRBRD [m])
INCLUDE HT66F70A.INC
MY_DATA .SECTION 'DATA'
DEL1 DB ? ;定義變數位址
DEL2 DB ? ;定義變數位址
DEL3 DB ? ;定義變數位址
COUNT DB ? ;定義變數位址
LED_PORT EQU PC ;定義LED_PORT等於PC LED_PORTC EQU PCC ;定義LED_PORTC等於PCC ROMBANK 0 MY_CODE
MY_CODE .SECTION AT 000H 'CODE'
MOV A,0AFH
MOV WDTC,A ;關閉看門狗計時器
CLR LED_PORTC ;將LED_PORT規劃為輸出模式 MAIN:
MOV A,HIGH TAB_PILI ;將TBHP指向表格(TAB_PILI)起始位址
MOV TBHP,A
MOV A,LOW TAB_PILI ;將TBLP指向表格(TAB_PILI)起始位址
MOV TBLP,A
MOV A,06
MOV COUNT,A ;將COUNT設定為6 LOOP:
TABRD LED_PORT ;依TBHP及TBLP指示之值讀取資料,送至LED_PORT顯示
MOV A,80
CALL DELAY ;呼叫DELAY副程式
INC TBLP ;TBLP加1,指向下一筆顯示資料
SDZ COUNT ;判斷COUNT減1是否為0
JMP LOOP
JMP MAIN
TAB_PILI: ;LED顯示資料建表區
DC 1B
DC 0B
DC 0B
DC 0B
DC 0B
DC 0B
;=================================== DELAY PROC ;DELAY副程式
MOV DEL1,A
DEL_1: MOV A,3
MOV DEL2,A
DEL_2: MOV A,110
MOV DEL3,A
DEL_3: SDZ DEL3
JMP DEL_3
SDZ DEL2
JMP DEL_2
SDZ DEL1
JMP DEL_1
RET
DELAY ENDP
END
建表就是將一些固定不變的常數資料存放在程式記憶體中,當程式運行時再依據實際需求讀出,常見的應
用,七段顯示器、三角函數、指數等,都是可以先將結果計算好加以存放。HT66F70A提供兩個查表指令
(『TABRD[m]』及『TABRDL[m]』)方便使用者使用;以HT66F70A為例,程式記憶體共有4個BANK,每一個BANK
有8192個位置(0000h~1FFFh),固需要兩個暫存器組成13位元做為讀取之位址。當使用『TABRD[m]』指令時,是依據TBHP、TBLP暫存器所指示之位址,將程式記憶體內容讀出,並將低八位元存入資料記憶體m位址中,其餘位元則存入TBLH暫存器。
HT66F70A將程式記憶體以256個位置為單位,稱為『程式頁』;若使用「TABRDL[m]」指令,則是根據TBLP所指示之位址將程式最末頁的內容讀出,並將低八位元存入資料記憶體m位址中,TBHP暫存器的內容不會影響TABRDL指令的執行結果,TBHP、TBLH之關係如下。
指令 晶片 查表資料所在位址
12 11 10 9 8 7 6 5 4 3 2 1 0
TABRD [m] HT66F50 TBHP[4:0] TBLP[7:0]
TABRDL [m] 1 1 1 1 1 TBLP[7:0]
通常都習慣把建表資料直接置於程式之後,以增加程式的可讀性,但當程式經過多次修改,可能會產生跨頁的現象,又少指令的判定,就無法取得正確資料,要特別注意。為避免此問題,建議把資料存放在程式記憶體的最末頁,用『TABRDL[m]』指令來讀取資料,程式碼如下。
4-2-4-2
(TABRDL [M])
INCLUDE HT66F70A.INC
MY_DATA .SECTION 'DATA'
DEL1 DB ? ;定義變數位址
DEL2 DB ? ;定義變數位址
DEL3 DB ? ;定義變數位址
COUNT DB ? ;定義變數位址
LED_PORT EQU PC ;定義LED_PORT為PC
LED_PORTC EQU PCC ;定義LED_PORTC為PCC
ROMBANK 0 MY_CODE
MY_CODE .SECTION AT 000H 'CODE'
MOV A,0AFH
MOV WDTC,A
CLR LED_PORTC ;將LED_PORT規劃為輸出模式
MAIN:
MOV A,LOW TAB_PILI ;將TBLP指向表格(TAB_PILI)起始位址
MOV TBLP,A
MOV A,06
MOV COUNT,A ;將COUNT設定為6 LOOP:
TABRDL LED_PORT ;依TBLP之值讀取資料,並送至LED_PORT
MOV A,80
CALL DELAY ;呼叫DELAY副程式
INC TBLP ;將TBLP加1,指向下一筆資料
SDZ COUNT ;判斷COUNT減1是否等於0,成立就跳至MAIN,
JMP LOOP ; 不成立就跳至LOOP
JMP MAIN
;==================================== DELAY PROC ;DELAY副程式
MOV DEL1,A
DEL_1: MOV A,3
MOV DEL2,A
DEL_2: MOV A,110
MOV DEL3,A
DEL_3: SDZ DEL3
JMP DEL_3
SDZ DEL2
JMP DEL_2
SDZ DEL1
JMP DEL_1
RET
DELAY ENDP
ROMBANK 3 MY_CODE1
MY_CODE1 .SECTION AT 1F00H 'CODE' TAB_PILI: ;LED顯示資料建表區
DC 1B
DC 0B
DC 0B
DC 0B
DC 0B
DC 0B
END
程式4-2-4-1 跟4-2-4-2 的差異有兩點:第一是改用『TABRDL [m]』指令來讀取資料,第二是利用
ROMBANK 3 MY_CODE1
MY_CODE1 .SECTION AT 1F00H 'CODE'
將資料擺到程式記憶體的最後一頁,使用『TABRDL[m]』指令不用理會TBHP暫存器,可使程式更簡潔。
不管是『TABRDL[m]』或『TABRD[m]』,在循序讀取表格資料時,可以直接利用遞增或遞減指令來更改指標值,可說是相當方便,要注意跨頁現象,如果想要隨機讀取表格內的資料,使用上述的指
令就有點慢,所以HT66F70A的程式計數器PCL是可以當成一般暫存器來運算,若能好好利用,也可以做為查表的另一項選擇,尤其在隨機讀取資料時更顯為其功效,請參考如下。
4-2-4-3
(ADDM A,PCL)
INCLUDE HT66F70A.INC
MY_DATA .SECTION 'DATA'
DEL1 DB ? ;定義變數位址
DEL2 DB ? ;定義變數位址
DEL3 DB ? ;定義變數位址
COUNT DB ? ;定義變數位址
INDEX DB ? ;定義變數位址
LED_PORT EQU PC ;定義LED_PORT為PC LED_PORTC EQU PCC ;定義LED_PORTC為PCC ROMBANK 0 MY_CODE
MY_CODE .SECTION AT 000H 'CODE'
MOV A,0AFH
MOV WDTC,A
CLR LED_PORTC ;將LED_PORT規劃為輸出模式 MAIN:
CLR INDEX ;將INDEX清除為0
MOV A,06
MOV COUNT,A ;將COUNT設定為6
LOOP:
MOV A,INDEX
CALL TRANS_PILI ;呼叫TRANS_PILI
MOV LED_PORT,A
MOV A,80
CALL DELAY ;呼叫DELAY副程式
INC INDEX ;INDEX加1
SDZ COUNT ;判斷COUNT減1是否為0,成立就跳至MAIN,
JMP LOOP ; 不成立就跳至LOOP
JMP MAIN
;====================================== DELAY PROC ;DELAY副程式
MOV DEL1,A
DEL_1: MOV A,3
MOV DEL2,A
DEL_2: MOV A,110
MOV DEL3,A
DEL_3: SDZ DEL3
JMP DEL_3
SDZ DEL2
JMP DEL_2
SDZ DEL1
JMP DEL_1
RET
DELAY ENDP
TRANS_PILI PROC ;LED顯示資料建表區
ADDM A,PCL
RET A,10000001B
RET A,01000010B
RET A,00100100B
RET A,00011000B
RET A,00100100B
RET A,01000010B
TRANS_PILI ENDP
END
TRANS_PILI副程式,當Acc=0執行『ADDM A,PCL』後,就接著執行『RET A,10000001B』回到
主程式,並在Acc載入表中第一筆顯示值『10000001B』;同理當Acc=1執行『ADDM A,PCL』後,就
接著執行『RET A,01000010B』回到主程式,此時Acc載入表中第二筆顯示值『01000010b』,依此類
推。此種查表方式是利用改變PCL而達到改變程式流程的目的,一般稱之為『計算式跳躍』。