8255控制字组暂存器位址
- 格式:doc
- 大小:36.00 KB
- 文档页数:3
三,程式:A10-2-3.ASM
CRTL XDATA 8300H ;8255控制字組暫存器位址
PA XDATA 8000H ;8255 PA埠位址
RESET BIT P2.2 ;8255 RESET接腳
FLAG BIT 20H.0 ;按鍵回應旗號
D_RAM DATA 30H ;顯示器位址30H~35H
dis_ptr DA TA 22H ;顯示器掃描指標
scan_val DATA 23H ;鍵盤列掃描值
key_ptr DATA 24H ;按鍵計數指標
temp DATA 25H ;按鍵暫存RAM,以判斷是否放開CSEG A T 00H
JMP START
CSEG A T 0BH
JMP T0_int
START:
MOV SP,#60H ;設堆疊區在60H
MOV dis_ptr,#00 ;七段顯示器掃描初值D1
MOV TMOD,#00000001B ;設TIMER0工作在MODE1
MOV TH0,#HIGH (65536-3000) ;計時中斷4000微秒=4毫秒
MOV TL0,#LOW (65536-3000)
MOV IE,#10000010B ;TIMER0中斷致能
SETB TR0 ;TIMER0啟動計時
SETB RESET ;8155重置
CALL D100US
CLR RESET
MOV DPTR,#CRTL ; 8255設定PB輸出、PC0~PC3輸出、PC4~P7輸入
MOV A,#88H
MOVX @DPTR,A
MOV R0,#D_RAM ;顯示器記憶體位址30H~35H,定址在30H
SS1: CLR FLAG ;清除按鍵旗號=0,有按則為1
CALL SCAN_4X3 ;掃描4×3鍵盤
JNB FLAG,SS1 ;是否有按鍵?FLAG=1表有按
CALL D20MS ;有按則機械反彈跳
SS2: MOV DPTR,#PA+200H ;按鈕是否放開?
MOVX A,@DPTR
XRL A,temp
JZ SS2
CALL D20MS
MOV A,key_ptr ;按鈕放開,則依按鍵指標讀取按鍵碼
MOV DPTR,#KEY_TAB
MOVC A,@A+DPTR
XCH A,D_RAM+5 ;目前按鍵碼存入35H,35H原來資料移入34H
XCH A,D_RAM+4 ;34H←35H
XCH A,D_RAM+3 ;33H←34H
XCH A,D_RAM+2 ;32H←33H
XCH A,D_RAM+1 ;31H←32H
XCH A,D_RAM ;30H←31H
JMP SS1
SCAN_4X3:
MOV scan_val,#0F7H ;列掃描初值
MOV key_ptr,#00H ;按鍵指標初值
SC1: MOV DPTR,#PA+200H
MOV A,scan_val ;輸出列掃描值
MOVX @DPTR,A
MOV DPTR,#PA+200H ; PC埠定址,讀取4×3按鍵, 目前按鍵值存入temp
MOVX A,@DPTR
MOV temp,A
SETB C
MOV 08H,#03H ;偵測3行(PC7~PC5)
SC2: RLC A
JNC KEYIN ;C=0表有按,有按則設FLAG=1
INC key_ptr ;沒有按則按鍵指標加1
DJNZ 08H,SC2 ;是否已偵測3行?
MOV A,scan_val ;是則掃描下一列
SETB C
RRC A
MOV scan_val,A
JC SC1 ;C=0表4列已掃描完畢
RET
KEYIN: SETB FLAG ;有按則設旗號為1
RET
T0_int: PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
CLR RS0 ;暫存器庫2
SETB RS1
MOV TH0,#HIGH (65536-3000) ;重設計時中斷4000微秒=4毫秒
MOV TL0,#LOW (65536-3000)
MOV A,dis_ptr ;將顯示器掃描值移至高4位元
SW AP A
MOV B,A
MOV A,dis_ptr
ADD A,#30H ;顯示器記憶體定址30H+掃描值=目前顯示器位址
MOV R0,A
MOV A,@R0 ;間接定址,顯示器記憶體內容讀入A
ORL A,B ;掃描值+顯示值
MOV DPTR,#PA+100H ;PB埠定址
MOVX @DPTR,A ;輸出至PB埠
INC dis_ptr
MOV A,dis_ptr
CJNE A,#6,TI1 ;是否掃完6個顯示器?不是則跳至TI1
MOV dis_ptr,#0 ;重設顯示器掃描初值0
TI1: POP DPL
POP DPH
POP PSW
POP ACC
RETI
D100US: MOV R7,#50 ;100微秒
DJNZ R7,$
RET
D20MS: MOV R7,#40 ;20毫秒
D21: MOV R6,#248
DJNZ R6,$
DJNZ R7,D21
RET
KEY_TAB:
DB 01H,02H,03H ;按鍵碼
DB 04H,05H,06H
DB 07H,08H,09H
DB 0AH,00H,0BH
END。