H451_DCLK BIT P2.4 ;串行數據時鐘,上升沿激活
CH451_DIN BIT P2.5 ;串行數據輸出,接 CH451 的數據輸入
CH451_LOAD BIT P2.6 ;串行命令加載,上升沿激活
CH451_DOUT BIT P2.7 ;INT0,鍵盤中斷和鍵值數據輸入,接 CH451 的數
ORG 0000H
START:
ACALL CH451_INIT ;調用初始化程序
MOV A,#0D5H
MOV B,#0CH
ACALL CH451_WRITE
MOV A,#0BDH
MOV B,#0DH
ACALL CH451_WRITE
MOV A,#18H
MOV B,#0EH
ACALL CH451_WRITE
MOV A,#0F9H
MOV B,#0FH
ACALL CH451_WRITE
MOV R6,#00H
MOV R5,#00H
MOV R4,#00H
MOV R3,#00H
MOV R1,#30H
ACALL SCAN1
; 初始化子程序
CH451_INIT:
CLR CH451_DIN ;先低后高,輸出上升沿通知 CH451 選擇 4 線串行接口
SETB CH451_DCLK ;置為默認的高電平
SETB CH451_DIN
SETB CH451_LOAD
SETB CH451_DOUT ;置為輸入
CLR IT0 ;置外部信號為低電平觸發
SETB PX0 ;置高優先級或者低優先級
CLR IE0 ;清中斷標志
SETB EX0 ;允許鍵盤中斷
MOV B,#04H ;設置為鍵盤與顯示開
MOV A,#03H
ACALL CH451_WRITE
RET
;串口通信讀出寫入程序
CH451_WRITE:
CLR EX0 ;禁止鍵盤中斷
CLR CH451_LOAD ;命令開始,此命令可以放在后面
MOV R7,#08H ;將 ACC 中 8 位送出
CH451_WRITE_8:
RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知 CH451 輸入位數據
DJNZ R7,CH451_WRITE_8 ;位數據未完繼續
MOV A,B
MOV R7,#04H ;將 B 中 4 位送出
CH451_WRITE_4:
RRC A ;低位在前,高位在后
CLR CH451_DCLK
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知 CH451 輸入位數據
DJNZ R7,CH451_WRITE_4 ;位數據未完繼續
SETB CH451_LOAD ;產生加載上升沿通知 CH451 處理命令數據
SETB EX0 ;允許鍵盤中斷
RET
; ;輸入鍵值子程序
CH451_READ:
CLR EX0
CLR CH451_LOAD
MOV A,#07H
MOV R7,#04H
CH451_READ_4:
RRC A
CLR CH451_DCLK
MOV CH451_DIN, C
SETB CH451_DCLK
DJNZ R7,CH451_READ_4 ;位 數據未完繼續
SETB CH451_LOAD ;產生加載上升沿 通知CH451 處理命令數據
CLR A ;先清除鍵值單元以便移位
MOV R7,#07H ;讀入7位鍵值
CH451_READ_7:
MOV C,CH451_DOUT ;讀入- ~位數據
CLR CH451_DCLK ;產生時鐘上升沿 通知CH451輸出下一位
RLC A ;數據移入ACC,高位在前,低位在后
SETB CH451_DCLK
DJNZ R7,CH451_READ_7 ;位 數據未完繼續
CLR IE0 ;清中斷標志,讀操作過程中有低電平脈沖
SETB EX0 ;允許鍵盤中斷;
RET
SCAN1: MOV C,CH451_DOUT;鍵盤掃描
JC SCAN1
ACALL CH451_READ
MOV R2, A
C0: CJNE R2, #44H,C1
ACALL K1
ACALL TES
C1: CJNE R2, #45H,C2
ACALL K2
ACALL TES
C2: CJNE R2,#46H,C3
ACALL K3
ACALL TES
c3: CJNE R2,#47H,C4
ACALL K4
ACALL TES
C4: CJNE R2,#4CH,C5
ACALL K5
ACALL TES
C5: CJNE R2,#4DH,C6
ACALL K6
ACALL TES
C6: CJNE R2,#4EH,C7
ACALL K7
ACALL TES
C7: CJNE R2,#4FH,SCAN1
ACALL K8
ACALL TES
RET
TES:SETB C
RET
K1:
MOV DPTR,#TAP
INC R3
MOV A,R3
MOVC A,@A+DPTR
MOV B,#0CH
ACALL CH451_WRITE
RET
K2:MOV DPTR,#TAP
INC R4
MOV A,R4
MOVC A,@A+DPTR
MOV B,#0DH
ACALL CH451_WRITE
RET
K3:MOV DPTR,#TAP
INC R5
MOV A,R5
MOVC A,@A+DPTR
MOV B,#0EH
ACALL CH451_WRITE
RET
K4:MOV DPTR,#TAP
INC R6
MOV A,R6
MOVC A,@A+DPTR
MOV B,#0FH
ACALL CH451_WRITE
RET
K5:
RET
K6:
RET
K7:
RET
k8:
RET
TAP:
DB 0BDH;0
DB 018H;1
DB 0D5H;2
DB 0D9H;3
DB 078H;4
DB 0E9H;5
DB 0EDH;6
DB 098H;7
DB 0FDH;8
DB 0F9H;9
YY:MOV R3,#00H
MOV R4,#09H
RET
END
|