?? io.asm
字號:
.include "2407.h" ;頭文件,2407寄存器的設置
.include "intx.h" ;頭文件,中斷向量表的設置
.include "varx.h" ;頭文件,變量的定義
.include "conx.h" ;頭文件,常量的定義
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.def _c_int0
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IOSFT_REG .usect ".data0",1 ;顯示數據移位寄存器
IO_COUNT .usect ".data0",1 ;延時計數寄存器
IO_DATA .usect ".data0",1 ;I/O臨時數據緩沖區
LEDXS .usect ".data0",1 ;LED顯示的數據
LEDFLAG .usect ".data0",1 ;LED顯示標志 寄存器
K1FLAG .usect ".data0",1 ;K1 標志寄存器
KEYDATA .usect ".data0",1 ;讀得鍵盤值存放寄存器
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(2)主程序
.text
_c_int0
CALL SYSINIT ;調系統初始化程序
CALL KEYLEDINIT ;調鍵盤和LED初始化程序
LDP #DP_USER ;指向0280h~0300h區
SPLK #01H,IOSFT_REG ;寄存器和標志初始化
SPLK #00H,IO_COUNT
SPLK #001H,IO_DATA
SPLK #001H,LEDXS
SPLK #00H,LEDFLAG ;LEDFLAG.0=1表示 K1,K2,K3 按下
;LEDFLAG.0=0表示 K4 按下
SPLK #01H,K1FLAG
CLRC INTM ;開總中斷
LOOP: CALL KEY ;調鍵盤程序,即掃描鍵盤
LDP #DP_USER
BIT LEDFLAG,15
BCND LEDBD1,TC
LACL IO_COUNT
SUB #03E8H
BCND WAIT,LEQ ;判10 s延時到否
LEDBD1: SPLK #00H,IO_COUNT
LDP #DP_PF2
LACL PFDATDIR
OR #0404H ;IOPF2=1
SACL PFDATDIR ;開74HC273片選信號
LDP #DP_USER
LACL LEDXS
OR #0FF00H ;IOPB口為輸出方式
LDP #DP_PF2
SACL PBDATDIR ;送要顯示的數據到IOPB口
LACL PFDATDIR
AND #0FFFBH ;IOPF2=0
SACL PFDATDIR ;關74HC273片選信號
LDP #DP_USER
BIT LEDFLAG,15
BCND LEDBD2,TC
LACL LEDXS
SFL
SACL LEDXS
LACL IOSFT_REG
SFL
SACL IOSFT_REG
BIT IOSFT_REG,BIT8 ;判是否循環完一次
BCND LOOP1,TC
B WAIT
LOOP1: LDP #DP_USER
SPLK #01H,IOSFT_REG ;賦初值
LEDBD2: LACL IO_DATA
SACL LEDXS
WAIT: NOP
B LOOP
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(3)系統初始化程序
SYSINIT:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF ;B0區被配置為數據空間
LDP #DP_PF1 ;指向7000h~7080h區
SPLK #81FEH,SCSR1 ;時鐘4倍頻,CLKIN=6 M,CLKOUT=24 M
SPLK #0E8H,WDCR ;不使能WDT
LDP #0
SPLK #02H,IMR ;使能中斷優先級INT2
SPLK #0FFFFh,IFR ;清中斷標志
LDP #DP_EVA ;指向7400h~7480h區
SPLK #80H,EVAIMRA ;使能T1PINT 中斷
SPLK #0FFFFh,EVAIFRA ;清EVA中斷標志
SPLK #0,GPTCONA
SPLK #0EA6H,T1PR ;使定時器每10 ms產生一次中斷
SPLK #0,T1CNT
SPLK #0164CH,T1CON ;設置通用定時器1
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(4)鍵盤和發光二極管初始化程序
KEYLEDINIT:
LDP #DP_PF2
LACL MCRC
AND #083FFH ;IOPF2,IOPF[3~6] 配置為一般的I/O口
SACL MCRC
LACL MCRA
AND #000FFH ;IOPB[0~7] 配置為一般的I/O口
SACL MCRA
LACL PFDATDIR
OR #0400H ;IOPF2為輸出方式
AND #08787H ;IOPF[3~6] 為輸入方式
SACL PFDATDIR
LACL PBDATDIR
OR #0FF00H ;IOPB[0~7] 為輸出方式
SACL PBDATDIR
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(5)鍵盤程序
KEY:
CALL READKEY ;調讀鍵程序
LACL KEYDATA
BCND KEYRET,EQ ;ACC=0?
CALL KEYDELAY ;延時消抖動
CALL READKEY ;再一次讀鍵值
LACL KEYDATA
BCND KEYRET,EQ
LDP #DP_USER ;判斷按鍵情況
BIT KEYDATA,15
BCND KEY2,NTC
CALL K1 ;功能鍵按下
B KEYRET
KEY2: BIT KEYDATA,14
BCND KEY3,NTC
CALL K2 ;"+"鍵按下
B KEYRET
KEY3: BIT KEYDATA,13
BCND KEY4,NTC
CALL K3 ;移位鍵按下
B KEYRET
KEY4: BIT KEYDATA,12
BCND KEYRET,NTC
CALL K4 ;確認鍵按下
KEYRET: LACL KEYDATA
AND #0FFF0H ;清讀取的鍵值寄存器
SACL KEYDATA
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(6)讀鍵子程序
READKEY:
LDP #DP_PF2
LACL PFDATDIR ;取出鍵值PFDATDIR.3~PFDATDIR.6
RPT #2
SFR ;右移3位
OR #0FFF0H ;屏蔽高4位(用到4個鍵)
CMPL
LDP #DP_USER
SACL KEYDATA ;存放鍵值
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(7)用軟件延時30mS消抖動
KEYDELAY:
LACC #6000
KEYD1: SUB #1
RPT #80
NOP
BCND KEYD1,NEQ
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(8)4個鍵子程序
K1: ;功能鍵子程序
READK1: CALL KEYDELAY
CALL READKEY
LDP #DP_USER ;判斷按鍵 K1 是否松開
BIT KEYDATA,15
BCND READK1,TC
LDP #DP_USER ;可擴展成16個或更多分支
SPLK #01H,LEDFLAG ;關閉LED左移標志,即LED對同一個數不刷新
BIT K1FLAG,15 ;K1FLAG存放K1按鍵的次數相對應的位值
BCND GN_KEY1,TC ;即K1FLAG=01,表示按了1次
BIT K1FLAG,14 ;K1FLAG=02,表示按了2次
BCND GN_KEY2,TC ;K1FLAG=04,表示按了3次
BIT K1FLAG,13
BCND GN_KEY3,TC
BIT K1FLAG,12
BCND GN_KEY4,TC
BIT K1FLAG,11
BCND GN_KEY5,TC
BIT K1FLAG,10
BCND GN_KEY6,TC
BIT K1FLAG,9
BCND GN_KEY7,TC
BIT K1FLAG,8
BCND GN_KEY8,TC
B K1_RET
GN_KEY1:SPLK #01H,IO_DATA
B K1_LOOP1
GN_KEY2:SPLK #11H,IO_DATA
B K1_LOOP1
GN_KEY3:SPLK #03H,IO_DATA
B K1_LOOP1
GN_KEY4:SPLK #033H,IO_DATA
B K1_LOOP1
GN_KEY5:SPLK #05H,IO_DATA
B K1_LOOP1
GN_KEY6:SPLK #55H,IO_DATA
B K1_LOOP1
GN_KEY7:SPLK #07H,IO_DATA
B K1_LOOP1
GN_KEY8:SPLK #77H,IO_DATA
B K1_LOOP1
K1_LOOP1:LACL K1FLAG
SFL
SACL K1FLAG
BIT K1FLAG,7
BCND K1_LOOP2,TC
B K1_RET
K1_LOOP2:SPLK #01H,K1FLAG
K1_RET: NOP
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
K2: ;"+"鍵子程序
READK2: CALL KEYDELAY
CALL READKEY
LDP #DP_USER ;判斷按鍵 K2 是否松開
BIT KEYDATA,14
BCND READK2,TC
SPLK #01,LEDFLAG ;關閉LED左移標志,即LED對同一個數不刷新
LACL IO_DATA
ADD #1
SACL IO_DATA
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
K3: ;移位鍵子程序
READK3: CALL KEYDELAY
CALL READKEY
LDP #DP_USER ;判斷按鍵 K3 是否松開
BIT KEYDATA,13
BCND READK3,TC
LDP #DP_USER
SPLK #01H,LEDFLAG
LACL IO_DATA
SFR
SACL IO_DATA
BCND K3_LOOP1,NC ;C=1 則IO_DATA+80h
LACL #80H
ADD IO_DATA
K3_LOOP1:SACL IO_DATA
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
K4: ;確認鍵子程序
READK4: CALL KEYDELAY
CALL READKEY
LDP #DP_USER ;判斷按鍵 K4 是否松開
BIT KEYDATA,12
BCND READK4,TC
LDP #DP_USER
SPLK #00H,LEDFLAG ;恢復LED左移標志
SPLK #01H,IO_DATA
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(9)中斷程序
GISR2: ;優先級INT2中斷人口
;保護現場
LDP #0E0H
LACC PIVR,1 ;讀取外設中斷向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外設中斷入口地址
BACC ;跳到相應的中斷服務子程序
T1GP_ISR: ;通用定時器1中斷入口
LDP #DP_USER
LACL IO_COUNT
ADD #1
SACL IO_COUNT
;恢復現場
CLRC INTM ;開總中斷,因為一進中斷就自動關閉總中斷
RET
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;(10)假中斷程序
PHANTOM
KICK_DOG ;復位看門狗
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -