📄 voltage-meter.asm
字号:
$MOD841
CHAN EQU 0
CSEG ;?
SP0 EQU 50H
CLK81 EQU P3.5
DAT81 EQU P3.3
KEY EQU P3.2
NUM0 EQU 30H ;设置了一组存储单元
NUM1 EQU 31H
NUM2 EQU 32H
NUM3 EQU 33H
;--------------------------------------
ORG 0000H
LJMP MAIN
ORG 0003H ;t0中断程序入口
LJMP SERVE1
ORG 0033H ;adci转换结束中断
LJMP SERVE2
ORG 0060H
MAIN: MOV R0,#0FFH
CLR A
QING: MOV @R0,A
DJNZ R0,QING
MOV SP,#SP0
LCALL YS ;why调延时?
;---------------------------------------
LCALL INI8281
LCALL INI841
LJMP AGAIN
;---------------------------------------
INI841: MOV ADCCON1,#0A8H ;启动adc,内参,分频为8,信号选择位为2,
MOV ADCCON2,#CHAN ;控制转换模式和通道选择,选通道0
MOV ADCCON3,#07H
SETB EA ;中断设置
SETB EX0 ;开外部中断0
SETB PADC ;adc中断优先
CLR PX0
RET
;----------------------------------------
INI8281:SETB CLK81
SETB DAT81
MOV A,#12H
LCALL WTO81
MOV A,#80H
LCALL WTO81
RET
;----------------------------------------
AGAIN: ;LCALL DELAY1 ;
SETB ADCCON2.4 ;触发单步转换
LJMP AGAIN ;等待中断,此时adc还未能中断了
SERVE1: SETB EADC ;开adc中断
RETI ;返回等待adc中断
SERVE2: MOV R0,ADCDATAL ;将转换的结果放入寄存器中
MOV R1,ADCDATAH
LCALL CHULI
LCALL XIANSHI
RETI
;--------------------------------------
;MOV R0,ADCDATAL
;MOV R1,ADCDATAH
CHULI: MOV R3,#00H ;
MOV R2,#28H
LCALL CHENGJI
MOV NUM0,R6
MOV R1,41H
MOV R0,40H
MOV R3,#00H
MOV R2,#0AH
LCALL CHENGJI
MOV NUM1,R6
MOV R1,41H
MOV R0,40H
MOV R3,#00H
MOV R2,#0AH
LCALL CHENGJI
MOV NUM2,R6
MOV R1,41H
MOV R0,40H
MOV R3,#00H
MOV R2,#0AH
LCALL CHENGJI
MOV NUM3,R6
RET
;-------------------------------------------------
CHENGJI:MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
;--------------
MOV A,R2
MOV B,R0
MUL AB ;28*adcdatal?
MOV 40H,A ;其结果低8位放入40h
MOV 41H,B ;高8位放入41h
;----------------
MOV A,R3
MOV B,R0 ;00*adcdatal?
MUL AB
MOV 42H,B ;高8位放入42h
CLR C ;清进位
ADDC A,41H ;
MOV 41H,A
JNC NEXT1 ;c不为0,跳转
INC 42H
;------------------
NEXT1: MOV A,R2 ;
MOV B,R1
MUL AB
CLR C
ADDC A,41H
MOV 41H,A
MOV A,B
ADDC A,42H
MOV 42H,A
JNC NEXT2
INC 43H
;--------------------
NEXT2: MOV A,R3
MOV B,R1
MUL AB
CLR C
ADDC A,42H
MOV 42H,A
MOV A,B
ADDC A,43H
MOV 43H,A
;---------------------
MOV R7,43H
MOV R6,42H
MOV R5,41H
MOV R4,40H
RET
;-------------------------------------------------
XIANSHI:MOV A,#00H
LCALL WTO81
MOV A,#7FH ;点亮第一位小数点
LCALL WTO81
;--------------------------------------------------
MOV R1,NUM0 ;在第一位显示num0
MOV R0,#00H
LCALL ZHU_XIANSHI
;-------------------------------------
MOV R1,NUM1
MOV R0,#10H
LCALL ZHU_XIANSHI
;-------------------------------------
MOV R1,NUM2
MOV R0,#20H
LCALL ZHU_XIANSHI
;---------------------------------------
MOV R1,NUM3
MOV R0,#30H
LCALL ZHU_XIANSHI
RET
;------------------------------------------
ZHU_XIANSHI: MOV A,#15H ;hex译码器
LCALL WTO81
MOV A,R1 ;r1可以代替很多numn
ORL A,R0 ;r0代表显示位数,显示num
LCALL WTO81
RET
;基本都要的程序----------------------------------------
WTO81: MOV R6,#08H
WAT: CLR CLK81
LCALL DELAY
SETB CLK81
JB DAT81,WAT
CLR CLK81
LCALL DELAY
SETB CLK81
JNB DAT81,$
WTB81: RLC A
MOV DAT81,C
CLR CLK81
LCALL DELAY
SETB CLK81
LCALL DELAY
LCALL DELAY
DJNZ R6,WTB81
SETB DAT81
RET
;----------------------------------------------
DELAY: NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;-----------------------------------------------
DELAY1: MOV R7,#200
DLY1: MOV R5,#55
DLY2: MOV R6,#50
DJNZ R6,$
DJNZ R5,DLY2
DJNZ R7,DLY1
RET
;-------------------------------------------------
YS: MOV R5,#00H
MOV R4,#50H
YS1: DJNZ R5,$
DJNZ R4,YS1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -