📄 main.asm
字号:
ORG 0000h
AJMP START
ORG 0013h
AJMP init1
OUTBIT EQU 0E101H
CLK164 EQU 0E102H
DAT164 EQU 0E102H
LINE EQU 0E103H
COLUMN EQU 0E101H
LEDBuf EQU 60H
KEYBOARD:
DB 11H,21H,22H,24H,41H,42H,44H,81H,82H,84H,88H,48H,28H,18H,14H,12H
LEDMap:
db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
ADC_LED:
DB 3FH,3FH,77H,5EH,39H
DAC_LED:
DB 3FH,3FH,5EH,77H,39H
F_LED:
DB 3FH,3FH,3FH,3FH,71H
V_LED:
DB 3FH,3FH,3FH,3FH,3EH
START:
MOV DPTR,#0E100H
MOV A,#03H
MOVX @DPTR,A
MOV A,#0
MOV R0,#LEDBuf ; LED显示缓存空间
MOV R1,#6 ; LED数量
LOOP1:
MOV @R0,A ;置LED缓存全为0
INC R0
DJNZ R1,LOOP1
CYCLE:
ACALL DisplayLED ;调用显示子程序
ACALL KS1 ;调用键盘扫描程序
JZ CYCLE ;无键,转
ACALL DisplayLED
ACALL DisplayLED
ACALL KS1
JZ CYCLE
ACALL KEY
JZ CYCLE
Delay: ; 延时子程序
MOV R7,#0
DelayLoop:
DJNZ R7,DelayLoop
DJNZ R6,DelayLoop
RET
DisplayLED: ;显示子程序
MOV R0,#LEDBuf
MOV R1,#6
MOV R2,#00100000B
LOOP:
MOV DPTR,#OUTBIT
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#LEDMap ;查询LED数值
MOV A,@R0
MOVC A,@A+DPTR
MOV B,#8
DLP:
RLC A
MOV R3,A
MOV ACC.0,C
ANL A,#0FDH
MOV DPTR,#DAT164
MOVX @DPTR,A
MOV DPTR,#CLK164
ORL A,#02H
MOVX @DPTR,A
ANL A,#0FDH
MOVX @DPTR,A
MOV A,R3
DJNZ B,DLP
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 R1,LOOP
MOV DPTR,#OUTBIT
MOV A,#0
MOVX @DPTR,A
RET
KS1: ;扫描键盘子程序
MOV DPTR,#COLUMN
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#LINE
MOVX A,@DPTR
CPL A
ANL A,#0FH
RET
KEY: ;键盘输入子程序
MOV R2,#0FEH
MOV R4,#4 ;4列
SCAN:
MOV DPTR,#COLUMN ;逐列扫描
MOV A,R2
MOVX @DPTR,A
MOV DPTR,#LINE ;读入行信号
MOVX A,@DPTR
ANL A,#0FH ;屏蔽高四位
CJNE A,#0FH,NEXT ;有键输入,转
MOV A,R2 ;指向下一列
RL A
MOV R2,A
DJNZ R4,SCAN
AJMP FINISH
NEXT:
SWAP A ;合并行列信号
MOV R3,A
MOV A,R2
ANL A,#0FH
ORL A,R3
CPL A ;行列信号逐位取反
MOV R3,A ;暂存
MOV R2,#0
MOV DPTR,#KEYBOARD
FINDKEY: ;查找键值
MOV A,R2
MOVC A,@A+DPTR
CLR C
SUBB A,R3
JNZ NEXT1
MOV R0,#LEDBuf+5
MOV A,R2
MOV @R0,A
AJMP FINISH
NEXT1:
INC R2
SJMP FINDKEY
FINISH:
CLR C
MOV A,R2
MOV R4,#08H
SUBB A,R4
JC KS2
MOV A,R2
MOV R4,#0AH
CLR C
SUBB A,R4
JNC KS3
CJNE R2,#08H,ENDP
ACALL KS4
AJMP ENDP
KS2:
MOV R0,#LEDBuf
MOV DPTR,#ADC_LED
MOV R4,#00H
MOV R6,#5
NEXT2:
MOV A,R4
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R6,NEXT2
ACALL ADC
AJMP ENDP
KS3:
MOV R0,#LEDBuf
MOV DPTR,#DAC_LED
MOV R4,#00H
MOV R6,#5
NEXT3:
MOV A,R4
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R6,NEXT3
; ACALL FANDV
AJMP ENDP
KS4:
MOV R0,#LEDBuf
MOV DPTR,#DAC_LED
MOV R4,#00H
MOV R6,#5
NEXT4:
MOV A,R4
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R6,NEXT4
ACALL DAC
AJMP ENDP
ENDP:
ACALL DisplayLED
ACALL KS1
JNZ ENDP
RET
ADC:
setb it1 ;设置中断服务
setb ea
setb ex1
mov dptr,#0a000h
cyc1:
mov a,dpl
MOV 06H,R2
cjne a,06H,adddpl
movx @dptr,a
push dpl
push dph
ajmp ad2
adddpl:
inc dptr
ajmp cyc1
ad2:
sjmp $
ret
init1:
pop dph
pop dpl
movx a,@dptr
mov p1,a
movx @dptr,a
mov dptr,#0b000h
movx @dptr,a
reti
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -