⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_8key.asm

📁 用三位数码管显示
💻 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 + -