📄 start.asm
字号:
OUTBIT EQU 0E101H
CLK164 EQU 0E102H
DAT164 EQU 0E102H
LINE EQU 0E103H
COLUMN EQU 0E101H
LEDBuf EQU 60H
DAT_ADH EQU 80H
DAT_ADL EQU 00H
MAX EQU 31H
MIN EQU 32H
Delta EQU 33H
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
LED_ADC:
DB 77H,5EH,39H,00H,00H,00H
LED_DAC:
DB 5EH,77H,39H,00H,00H,00H
ORG 0000h
AJMP START
ORG 0003H
AJMP ADC_
ORG 0013h
AJMP DAC_
START:
SETB EA ;设置初值
SETB IT1
SETB IT0
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 KEY
ACALL KEYDL
SJMP CYCLE
Delay: ; 延时子程序
MOV R7,#0
DelayLoop:
DJNZ R7,DelayLoop
DJNZ R6,DelayLoop
RET
ADC_: ;ADC中断服务程序
CLR EX0
MOV DPTR,#0A000H
MOVX A,@DPTR
MOV 30H,A
MOV A,#00H
MOX @DPTR,A
MOV A,DAT_ADH
MOV DPH,A
MOV A,DAT_ADL
MOV DPL,A
MOV A,30H
MOVX @DPTR,A
INC DAT_ADL
MOV A,DAT_ADL
CJNE A,#0FFH,ADC_1
MOV DAT_ADL,#00H
ADC_1:
MOV DPTR,#0B000H ;D/A转换
MOV A,30H
MOVX @DPTR,A
ACALL PROCESS
SETB EX0
RETI
DAC_:
CLR EX1 ;INT1 输出中断服务程序
MOV DPTR,#0A000H
MOV A,#00H
MOVX @DPTR,A
MOV A,DAT_ADH
MOV DPH,A
MOV A,DAT_ADL
MOV DPL,A
MOVX A, @DPTR
MOV 30H,A
INC DAT_ADL
MOV A,DAT_ADL
CJNE A,#0FFH,DAC_1
MOV DAT_ADL,#00H
DAC_1:
MOV DPTR,#0B000H
MOV A,30H
MOVX @DPTR,A
ACALL PROCESS
SETB EX1
RETI
PROCESS: ;实时处理程序
CLR C
MOV A,30H
SUBB A,MAX
JC Mininum
MOV A,30H
MOV MAX,A
Mininum:MOV A,30H
SUBB A,MIN
JNC EndPro
MOV A,30H
MOV MIN,A
Update: CLR C
MOV A,MAX
SUBB A,MIN
MOV Delta,A
EndPro: 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
ACALL FINISH
NEXT1:
INC R2
SJMP FINDKEY
ACALL FINISH
RET
FINISH:
ACALL DisplayLED
ACALL KS1
JNZ FINISH
RET
DisplayLED: ;显示子程序
MOV R0,#LEDBuf
MOV R1,#6
MOV R2,#00100000B
LOOP:
MOV DPTR,#OUTBIT
MOV A,#0
MOVX @DPTR,A
MOV DPTR,#LEDMap
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
KEYDL: ;键值处理子程序
MOV 06H,R2
CJNE R2,#0AH,PS1
SETB EX0
START_0: ;键为A,执行A/D转换
MOV MAX,#00H
MOV MIN,#0FFH
MOV Delta,#00H
MOV DAT_ADL,#00H
MOV DPTR,#0A000H
MOV A,#00H
MOVX @DPTR,A
RET
PS1: ;键为D,执行D/A转换
CJNE R2,#0DH,PS2
SETB EX1
SJMP START_0
PS2: ;键为B,关中断,暂停
CJNE R2,@0BH,PS3
SJMP PAUSE_0
PS3: ;键为无效值,跳回
AJMP CYCLE
RET
PAUSE_0:
CLR EX0
CLR EX1
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -