📄 ad_8key.asm
字号:
;**********************
;电压AD转换显示程序
;MCU~AT89C52
;3月2日 12:081终稿
;**********************
LED1 EQU 30H ;定义变量
LED2 EQU 31H
LED3 EQU 32H
VOLT EQU 33H
CODE_KEY EQU 34H
KEYNUM EQU 38H
SCAN_KEY_FIRST_SIGN BIT 20H.0 ;第一次扫键有效标志位
EOC BIT P3.0
TAMP1 EQU 35H
TAMP2 EQU 36H
TAMP3 EQU 37H
;********************
;AD转换子程序
;********************
ORG 0030H
AJMP MAIN
;调用初始化子程序
MAIN:
LCALL INIT_VARIABLE;
LCALL AD_CHD
CALL MUL21
CALL DIV31
CALL BCDC
MOV TAMP1,#100
CIRCLE:
CALL DISP
mov A,P2
XRL A,#0FFH
JNZ KEY_HANDLE
DJNZ TAMP1,CIRCLE
KEY_HANDLE:
CALL SCAN_KEY ;扫键子程序
MOV A,CODE_KEY
JZ MAIN
CALL HASKEY_HANDLE ;调用键值处理子程序
AJMP MAIN
;******************
;AD转换子程序
;******************
AD_CHD:
CLR P3.1
MOV DPTR,#07FF8H ;A/D转换初始化
; SETB P3.1
; CLR P3.1
MOVX @DPTR,A
NOP
NOP
NOP
NOP
JNB EOC,$
; CLR P3.1
MOVX A,@DPTR
NOP
NOP
NOP
MOV VOLT,A
; SETB P3.1
RET
MUL21:
MOV R3,#0F4H
MOV R2,#01H
MOV R7,VOLT
MOV A,R3
MOV B,R7
MUL AB
MOV R5,B
MOV R6,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R5
MOV R5,A
CLR A
ADDC A,B
MOV R4,A
RET
DIV31:
CLR C
MOV R7,#0FFH
MOV A,R4
SUBB A,R7
JC DV30
SETB OV ;商溢出
RET
DV30: MOV R2,#10H ;求R4R5R6/R7→R5R6
DM23: CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R4,A
INC R6
DM24: DJNZ R2,DM23
MOV A,R4 ;四舍五入
ADD A,R4
JC DM25
SUBB A,R7
JC DM26
DM25: INC R6
MOV A,R6
JNZ DM26
INC R5
DM26: CLR OV
RET ;商在R5R6中
BCDC: ;双字节16进制数转BCD码
MOV R0,#3
MOV R1,#32H
LOOP:
MOV A,R5
SWAP A
ANL A,#0FH ;取R6高四位
MOV B,#10
DIV AB
SWAP A
XCH A,R5
ANL A,#0FH
XCH A,B
SWAP A
ORL A,B ;余数作高四位与R6低四位拼成字节
MOV B,#10
DIV AB
ORL A,R5
MOV R5,A
MOV A,B
SWAP A
MOV B,A
MOV A,R6
SWAP A
ANL A,#0FH
ORL A,B
MOV B,#10
DIV AB
SWAP A
XCH A,R6
ANL A,#0FH
XCH A,B
SWAP A
ORL A,B
MOV B,#10
DIV AB
ORL A,R6
MOV R6,A
MOV @R1,B
DEC R1
DJNZ R0,LOOP
RET
;****************
;显示子程序
;***************
DISP:
MOV R0,#25H
MOV A,#0
MOV @R0,LED3 ;显示第0位
SWAP A
XCHD A,@R0
MOV P1,A
CALL DELAY3ms
MOV A,#1
MOV @R0,LED2
SWAP A
XCHD A,@R0 ;显示第1位
MOV P1,A
CALL DELAY3ms
MOV A,#2
MOV @R0,LED1 ;显示第2位
SWAP A
XCHD A,@R0
MOV P1,A
CALL DELAY3ms
RET
;**********************
;初始化子程序
;**********************
INIT_VARIABLE:
MOV A,#0
MOV B,A
MOV 20H,A
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV 33H,A
MOV 34H,A
MOV 35H,A
MOV 36H,A
MOV 37H,A
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
RET
;****************
;键值扫描子程序
;****************
SCAN_KEY:
CLR A
MOV CODE_KEY,A
MOV A,P2
XRL A,#0FFH
JZ SCAN_KEY_END ;无键按下,退出
MOV R0,#0FEH
SCAN_KEY_CIRCLE:
INC CODE_KEY
; MOV A,CODE_KEY
MOV A,P2
XRL A,R0
JZ KEY_NOTREMBLE ;有键按下,去抖动
SCAN_KEY_INC:
MOV A,R0
RL A
MOV R0,A
CJNE R0,#0FEH,SCAN_KEY_CIRCLE
MOV CODE_KEY,#0
AJMP SCAN_KEY_END
KEY_NOTREMBLE:
MOV A,CODE_KEY
JB SCAN_KEY_FIRST_SIGN,SAVE_CODE_KEY ;如果是第一次按键,去抖动,如果是第二次按键,保存键值
SETB SCAN_KEY_FIRST_SIGN ;设第一次扫键标志位
MOV B,CODE_KEY
LCALL DELAY10ms
MOV R0,#0FEH ;循环变量赋初值
MOV R1,P2
MOV CODE_KEY,#0
AJMP SCAN_KEY_CIRCLE ;再次扫键
SAVE_CODE_KEY: ;去抖动
XRL A,B
JZ IFAEQUALB
MOV CODE_KEY,#0
AJMP SCAN_KEY_END
IFAEQUALB:
MOV R1,#0
WAIT_KEY_OFF:
MOV A,P2
XRL A,#0FFH
JZ SCAN_KEY_END ;等待按键释放
LCALL DELAY10ms
INC R1
CJNE R1,#0FFH,WAIT_KEY_OFF
SCAN_KEY_END:
CLR A ;清键值
MOV B,A
MOV R0,A
MOV R1,A
MOV A,CODE_KEY
RET
;**************************
;键值处理子程序
;**************************
HASKEY_HANDLE:
DEC CODE_KEY
MOV R1,#245
MOV R0,#25H
MOV @R0,#0
HASKEY_JUGUE:
MOV A,CODE_KEY
XRL A,@R0
JZ DISP_KEY
INC @R0
CJNE @R0,#8,HASKEY_JUGUE
AJMP HASKEY_HANDLE_END
DISP_KEY:
MOV KEYNUM,@R0
DISP_KEYNUM:
MOV A,KEYNUM
MOV @R0,0 ;显示第0位
SWAP A
XCHD A,@R0
MOV P1,A
CALL DELAY10ms
DJNZ R1,DISP_KEYNUM
MOV R0,#0
MOV R1,#0
MOV CODE_KEY,#0
MOV KEYNUM,#0
HASKEY_HANDLE_END:
RET
;********************
;延时子程序
;********************
DELAY10ms: ;延时10ms
MOV TAMP2,#20 ;TAMP2,TAMP3
DL:
MOV TAMP3,#250
DJNZ TAMP3,$
DJNZ TAMP2,DL
RET
DELAY3ms:
MOV TAMP2,#07H
DELAY3ms_LOOP:
MOV TAMP3,#0dFH
DJNZ TAMP3,$
DJNZ TAMP2,DELAY3ms_LOOP
RET
ENDOFFILE:
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -