?? ktwd.asm
字號:
CS0809 EQU 0a000h ;0809地址
SMBUF EQU 36H
SDBUF EQU 30H
LEDBUF EQU 40H ;顯示緩沖
OUTBIT EQU 09002h
OUTSEG EQU 09004h ;段控制口
IN EQU 09001h ;鍵盤輸入
OUT EQU 09002h
KZZ EQU 08003h ;8255控制字地址
PA EQU 08000h ;8255PA口地址
ORG 0000H
LJMP START
ORG 0013H
LJMP DAS
ORG 0100H
DELAY:
MOV R7,#0
DLOOP:DJNZ R7,DLOOP
DJNZ R6,DLOOP
RET
SETDA:MOV IE,#84H ;設中斷
SETB IT1
MOV DPTR,#CS0809
MOVX @DPTR,A
MOV R6,#2
CALL DELAY
DAS:MOV DPTR,#CS0809 ;啟動0809
MOVx A,@DPTR
MOV SMBUF,A
mov r5,#0
mov b,#24
mov a,smbuf
mul ab
push b
mov r3,b
mov r4,a
loopb:add a,#01h
jc sb1
ajmp b1
sb1:inc r5
b1:djnz r3,loopb
mov 49h,r5
mov r4,a
mov a,r5
jz b2
loopd:inc r4
djnz r5,loopd
b2:mov a,r4
mov b,#255
div ab
pop b
add a,b
add a,49h
mov smbuf,a
CLR EX1
RET
DIVAB:MOV B,#100 ;二進制轉換為十進制
DIV AB
MOV @R0,A
MOV A,B
INC R0
MOV B,#10
DIV AB
MOV @R0,A
MOV A,B
INC R0
MOV @R0,A
RET
LEDMAP:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
DISPLAYLED:MOV R1,#LEDBUF
MOV R0,#LEDBUF
MOV R3,#6
MOV DPTR,#LEDMAP
SS1:MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R3,SS1
MOV R0,#LEDBUF ;存放要顯示的數
MOV R3,#6
MOV R2,#00100000B
MOV DPTR,#OUTBIT
MOV A,#0
MOVX @DPTR,A
LOOP:MOV A,@R0
MOV DPTR,#OUTSEG
MOVX @DPTR,A
MOV DPTR,#OUTBIT
MOV A,R2
MOVX @DPTR,A
MOV R6,#1
CALL DELAY
MOV A,R2
RR A
MOV R2,A
INC R0
DJNZ R3,LOOP
RET
;**************************鍵盤掃描子程序 **************************
TESTKEY:MOV DPTR,#OUT
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#IN
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET
KEYTABLE:DB 05H,05H,01H,01H ;鍵碼定義
DB 02H,02H,01H,01H
DB 04H,04H,01H,01H
DB 00H,08H,01H,01H
DB 00H,08H,01H,01H
DB 00H,08H,01H,01H
GETKEY:
MOV R1,#00100000B
MOV R2,#6
KLOOP:MOV A,R1 ;找出鍵所在列
mov dptr,#out
CPL A
MOVX @DPTR,A
CPL A
RR A
MOV R1,A ;下一行
MOV DPTR,#IN
MOVX A,@DPTR
CPL A
ANL A,#0FH
JNZ GOON1 ;該列有鍵入
DJNZ R2,KLOOP
GOON1:MOV R1,A ;求鍵值
MOV A,R2
DEC A
RL A
RL A
MOV R2,A
MOV A,R1
MOV R1,#4
LOOPC:RRC A
JC EXIT
INC R2
DJNZ R1,LOOPC
EXIT:MOV A,R2 ;取鍵碼
MOV DPTR,#KEYTABLE
MOVC A,@A+DPTR
MOV R2,A
WAITELEASE:MOV DPTR,#OUT ;等鍵釋放
CLR A
MOVX @DPTR,A
MOV R6,#10
CALL DELAY
CALL TESTKEY
JNZ WAITELEASE
MOV A,R2
RET
;**************************主程序****************************************
START:MOV SP,#60H ;堆棧地址設定
MOV DPTR,#KZZ
MOV A,#80H ;初始化8255
MOVX @DPTR,A
MOV SMBUF,#0
MOV SDBUF,#0
LOOPA:MOV A,SDBUF
MOV R0,#LEDBUF
CALL DIVAB ;設定值轉換
MOV R0,#LEDBUF+3
MOV A,SMBUF
CALL DIVAB ;掃描轉換
CALL DISPLAYLED ;顯示
CALL SETDA
MOV A,SMBUF
MOV R3,SDBUF
ADD A,#02H
SUBB A,R3
JC A2
MOV A,SDBUF
MOV R3,SMBUF
ADD A,#02H
SUBB A,R3
JC A1
AJMP A6
A1:MOV DPTR,#PA ;紅燈亮
MOV A,#02H
MOVX @DPTR,A
AJMP A3
A2:MOV DPTR,#PA ;綠燈亮
MOV A,#01H
MOVX @DPTR,A
AJMP A3
A6:MOV DPTR,#PA
MOV A,#00H
MOVX @DPTR,A
A3:
CALL TESTKEY
JZ LOOPA ;沒有,轉到LOOPA
CALL GETKEY ;有按鍵,得鍵碼
MOV R1,#SDBUF
CJNE A,#01H,A4
INC @R1
AJMP A5
A4:DEC @R1
A5:mov a,@r1
subb a,#24
JNC A9
AJMP A7
A9:mov @r1,#24
A7:LJMP LOOPA
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -