?? key_scan15x20d.asm
字號:
;****************************************************
RS EQU P3.0 ;L:存取緩存器,H:存取DDRAM
WR EQU P3.1 ;L有效
RD EQU P3.2 ;L有效
CS1 EQU P3.3 ;L有效
CS2 EQU P3.4 ;H有效
BUSY EQU P3.5
INT EQU P3.6
RST EQU P3.7 ;L有效
REGNAME EQU 30H
REGDATA EQU 31H
REGDATA1 EQU 32H
LCM_X EQU 33H
LCM_Y EQU 34H
COUNT1 EQU 35H
COUNT2 EQU 36H
KEY_X EQU 37H
KEY_Y EQU 38H
KEY_COUNT1 EQU 39H
;****************************************************
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: NOP
MOV SP,#5FH
LCALL DELAY2 ;延時120MS等待上電復位
MOV P3,#0FFH
LCALL LCM_INIT
LCALL LCM_CLR
;****************************************************
LGS1: MOV REGNAME,#10H
MOV REGDATA,#2BH
LCALL REG_WRITE
MOV REGNAME,#00H
MOV REGDATA,#0CDH
LCALL REG_WRITE
MOV REGNAME,#0F1H
MOV REGDATA,#7FH
LCALL REG_WRITE
MOV DPTR,#KEYTAB
MOV LCM_X,#00H
MOV LCM_Y,#58H
LCALL WR_ZB
MOV COUNT1,#14H
LGS11: CLR A
MOVC A,@A+DPTR
LCALL DDR_WRITE
INC DPTR
DJNZ COUNT1,LGS11
LCALL D60MS
MOV REGNAME,#0A1H ;設定緩存器[A1]
MOV REGDATA,#0F1H
LCALL REG_WRITE
MOV REGNAME,#0A0H ;設定緩存器[A0]
MOV REGDATA,#08H
LCALL REG_WRITE
LGS12: LCALL KEY_SCAN
MOV LCM_X,#20H
MOV LCM_Y,#58H
LCALL WR_ZB
MOV A,KEY_Y
ADD A,#30H
LCALL DDR_WRITE
MOV LCM_X,#26H
MOV LCM_Y,#58H
LCALL WR_ZB
MOV A,KEY_X
ADD A,#30H
LCALL DDR_WRITE
AJMP LGS12
;****************************************************
LCM_INIT: MOV COUNT1,#00H ;初始化
MOV COUNT2,#27H
LCM_INIT1: MOV DPTR,#INITTAB1
MOV A,COUNT1
MOVC A,@A+DPTR
MOV REGNAME,A
MOV DPTR,#INITTAB2
MOV A,COUNT1
MOVC A,@A+DPTR
MOV REGDATA,A
LCALL REG_WRITE
INC COUNT1
DJNZ COUNT2,LCM_INIT1
RET
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
LCM_CLR: MOV REGNAME,#0E0H ;清屏
MOV REGDATA,#00H
LCALL REG_WRITE
MOV REGNAME,#0F0H
LCALL REG_READ
MOV A,REGDATA1
ORL A,#08H
MOV REGDATA,A
MOV REGNAME,#0F0H
LCALL REG_WRITE
MOV REGNAME,#00H
MOV REGDATA,#0C5H
LCALL REG_WRITE
MOV LCM_X,#00H
MOV LCM_Y,#00H
LCALL WR_ZB
MOV A,#00H
LCALL DDR_WRITE
RET
;****************************************************
KEY_SCAN: MOV REGNAME,#0A0H ;讀緩存器[A0]
LCALL REG_READ
MOV REGNAME,#0A1H ;設定緩存器[A1]
MOV REGDATA,#0F1H
LCALL REG_WRITE
LCALL D60MS ;延時60ms
MOV A,REGDATA1
JNB ACC.7,KEY_SCAN ;判斷鍵盤有無偵測到按鍵輸入
KEY_SCAN1: MOV REGNAME,#0A2H ;讀緩存器[A2]
LCALL REG_READ
MOV A,REGDATA1
MOV KEY_Y,#00H
MOV KEY_COUNT1,#08H
KEY_SCAN11: JNB ACC.0,KEY_SCAN2
INC KEY_Y
RR A
DJNZ KEY_COUNT1,KEY_SCAN11
AJMP KEY_SCAN
KEY_SCAN2: MOV REGNAME,#0A3H ;讀緩存器[A3]
LCALL REG_READ
MOV A,REGDATA1
MOV KEY_X,#00H
MOV KEY_COUNT1,#08H
KEY_SCAN21: JNB ACC.0,KEY_SCAN3
INC KEY_X
RR A
DJNZ KEY_COUNT1,KEY_SCAN21
AJMP KEY_SCAN
KEY_SCAN3: RET
;****************************************************
WR_ZB: MOV REGNAME,#60H ;定坐標
MOV REGDATA,LCM_X
LCALL REG_WRITE
MOV REGNAME,#70H
MOV REGDATA,LCM_Y
LCALL REG_WRITE
RET
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
REG_WRITE: MOV A,REGNAME ;寫資料到緩存器
LCALL REG_WR
MOV A,REGDATA
LCALL REG_WR
RET
REG_WR: MOV P1,A
CLR CS1
SETB RD
CLR RS
CLR WR
NOP
NOP
SETB WR
SETB RS
SETB CS1
RET
DDR_WRITE: JB BUSY,$ ;寫資料到DDRAM
MOV P1,A
CLR CS1
SETB RD
SETB RS
CLR WR
NOP
NOP
SETB WR
SETB RS
SETB CS1
RET
REG_READ: MOV A,REGNAME ;讀緩存器
LCALL REG_WR
MOV P1,#0FFH
CLR CS1
SETB WR
CLR RS
CLR RD
NOP
MOV A,P1
SETB RD
SETB RS
SETB CS1
MOV REGDATA1,A
RET
;****************************************************
DELAY2: MOV R6,#0EAH
DEL21: MOV R7,#0FFH
DEL22: DJNZ R7,DEL22
DJNZ R6,DEL21
RET
D60MS: MOV R6,#78H
D60: MOV R7,#0F8H
DJNZ R7,$
DJNZ R6,D60
RET
;****************************************************
INITTAB1:
DB 000H,001H,002H,003H,010H,011H,012H,021H,031H,041H,051H,020H,030H,040H,050H,060H
DB 061H,070H,071H,072H,080H,081H,091H,090H,0A0H,0A1H,0A2H,0A3H,0B0H,0B1H,0C0H,0C1H
DB 0C8H,0C9H,0CAH,0D0H,0E0H,0F0H,0F1H
INITTAB2:
DB 0C9H,0F2H,010H,080H,06BH,000H,091H,027H,0EFH,000H,000H,027H,0EFH,000H,000H,000H
DB 000H,000H,000H,0EFH,0AAH,000H,000H,006H,011H,000H,000H,000H,027H,0EFH,000H,00AH
DB 080H,080H,000H,080H,000H,0A0H,00FH
KEYTAB:
DB '鍵盤應用請按鍵KC KR '
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -