📄 发送,接收,运算,4x4键盘,i2c,.asm
字号:
cjne a,#00h,go_on_v
mov a,3bh ;判断电压百位是否为0
cjne a,#00h,go_on_i_compare
jmp display_0w
go_on_i_compare:
mov a,57h ;判断电流百位是否为0
cjne a,#00h,nmul_w
display_0w: ;电压和电流的百位都为0,结果直接显示0
mov 5ah,#00h
mov 5bh,#00h
mov 5ch,#00h
mov 5dh,#00h
call DISPLAY_to_count_w
ret
;.......................................
nmul_w:
mov a,3bh ; 电压,电流千位都为0,显示结果即为,电压的百位和电流的百位相乘,即3bh x 57h,
mov b,57h
mul ab
mov 40h,a
mov 41h,b
CALL to_rather_DATE_w
ret
go_on_v:
mov a,57h ;判断电流百位是否为0
cjne a,#00h,mul_i_and_v
mov 5ah,#00h ;电压的千位不为0,但电流的百位为0,即显示结果为0,电流最大值为400
mov 5bh,#00h
mov 5ch,#00h
mov 5dh,#00h
call DISPLAY_to_count_w
ret
mul_i_and_v: ;电压的千位不为0,电流的百位也不为0,即显示结果如下
mov a,3ah
mov b,#0ah
mul ab
mov 69h,a
mov a,3bh
add a,69h ;电压百千位转换成十六进制放在69h
mov 69h,a ;已判断电压千位不为0
;......................................................
mov a,57h
mov b,69h
mul ab ;再乘上电压的百位3bh
mov 40h,a
mov 41h,b
CALL to_rather_DATE_w
ret*/
;**************************************
;////////////////////////////////////////////////
to_rather_DATE_w: ;将功率的16进制转化成十进制显示
; MOV 40H,69H ;低8位
; MOV 41H,6bH ;高8位
; MOV 40H,#0ffH ;低8位
; MOV 41H,#0efH ;高8位
CALL H16_D10
MOV 5dH,D1
MOV 5cH,D2
MOV 5bH,D3
MOV 5aH,D4
CALL DISPLAY_to_count_w
ret
;***********************************************
;**********************************************接收显示转换
from_two_DATE_i: ;将读回电流的16进制转化成十进制显示
;MOV 40H,#00H ; 低8位
; MOV 41H,#08H ; 高8位
MOV 40H,36H ; 低8位
MOV 41H,37H ; 高8位
CALL H16_D10
MOV 55H,D1 ;个
MOV 56H,D2 ;十
MOV 57H,D3 ;百
MOV 58H,D4 ;千
CALL DISPLAY_read_i
ret
;................................................
DISPLAY_read_i :
MOV p1,#0c1H ;千位
ACALL ENABLE
MOV A,58H
MOVC A, @A+DPTR
CALL write2
;......................
MOV p1,#0c2H ;百位
ACALL ENABLE
MOV A,57H
MOVC A, @A+DPTR
CALL write2
;..........................
MOV p1,#0c4H ;十位
ACALL ENABLE
MOV A,56H
MOVC A, @A+DPTR
CALL write2
;..........................
MOV p1,#0c5H ;个位
ACALL ENABLE
MOV A,55H
MOVC A, @A+DPTR
CALL write2
ret
;****************************************************
DISPLAY_read_i_ffff :
MOV p1,#0c1H ;千位
ACALL ENABLE
MOV A,#0bH
MOVC A, @A+DPTR
CALL write2
;......................
MOV p1,#0c2H ;百位
ACALL ENABLE
MOV A,#0bH
MOVC A, @A+DPTR
CALL write2
;..........................
MOV p1,#0c4H ;十位
ACALL ENABLE
MOV A,#0bH
MOVC A, @A+DPTR
CALL write2
;..........................
MOV p1,#0c5H ;个位
ACALL ENABLE
MOV A,#0bH
MOVC A, @A+DPTR
CALL write2
ret
;////////////////////////////////////////////////////
;************************************************
DISPLAY_to_count_w :
MOV p1,#0c9H ;千位
ACALL ENABLE
MOV A,5aH
MOVC A, @A+DPTR
CALL write2
;......................
MOV p1,#0caH ;百位
ACALL ENABLE
MOV A,5bH
MOVC A, @A+DPTR
CALL write2
;..........................
MOV p1,#0cbH ;十位
ACALL ENABLE
MOV A,5cH
MOVC A, @A+DPTR
CALL write2
;..........................
MOV p1,#0cdH ;个位
ACALL ENABLE
MOV A,5dH
MOVC A, @A+DPTR
CALL write2
ret
;............................
;//////////////////////////////
ENABLE:
CLR RS ;写指令 , 以下为液晶显示子程序
CLR RW
CLR E
ACALL DELAY
SETB E
RET
DELAY:
MOV p1,#0FFH
CLR RS
SETB RW
CLR E
NOP
NOP
NOP
SETB E
JB p1.7,delay ;忙检测
RET
write2: ;写数据
mov p1,a
SETB RS
CLR RW
CLR E
NOP
JB p1.7,$
SETB E
lcall delay1
ret
;/////////////////////////////////////////////////////
;....................................................
;////////////////////////////////////////////////////
STA:SETB VSDA ;启动I2C总线, 软件包
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSDA
NOP
NOP
NOP
NOP
CLR VSCL
RET
;*************************
STOP:
CLR VSDA ;停止I2C总线数据传送
SETB VSCL
NOP
NOP
NOP
NOP
SETB VSDA
NOP
NOP
NOP
NOP
CLR VSDA
CLR VSCL
RET
MACK:
CLR VSDA ;发送应答位
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
SETB VSDA
RET
MNACK:
SETB VSDA ;发送非应答位
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
RET
CACK: SETB VSDA ;应答位检查
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0
CEND: CLR VSCL
RET
WRBYT:MOV R0,#08H ;向VSDA线上发送1个数据字节
WLP: RLC A
JC WR1
AJMP WR0
WLP1: DJNZ R0,WLP
RET
WR1: SETB VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1
WR0: CLR VSDA
SETB VSCL
NOP
NOP
NOP
NOP
CLR VSCL
AJMP WLP1
RDBYT: MOV R0,#08H ;从VSDA线上读取1个数据字节
RLP: SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
WRNBYT: MOV R3,NUMBYT ;虚拟I2C总线发送N个字节数据
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
RDNBYT: MOV R3, NUMBYT ;模拟I2C总线接收n个 ;字节数据
LCALL STA
MOV A,SLA
LCALL WRBYT
LCALL CACK
JB F0,RDNBYT
RDN: MOV R1,#MRD
RDN1: LCALL RDBYT
MOV @R1,A
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK: LCALL MACK
INC R1
SJMP RDN1
;////////////////////////////////////////////////////
;....................................................
;////////////////////////////////////////////////////
H16_D10:
push psw
;MOV 41H,TDATA_h
;MOV 40H,TDATA_l
MOV 44H,#10H
MOV 45H,#27H
CALL DIV16
MOV D5,40H
MOV 40H,42H
MOV 41H,43H
MOV 44H,#0E8H
MOV 45H,#03H
CALL DIV16
MOV D4,40H
H16_D101:
;MOV 42H,TDATA_L
;MOV 43H,TDATA_h
MOV 40H,42H
MOV 41H,43H
MOV 44H,#64H
MOV 45H,#00H
CALL DIV16
MOV D3,40H
MOV 40H,42H
MOV 41H,43H
MOV 44H,#0AH
MOV 45H,#00H
CALL DIV16
MOV D2,40H
MOV D1,42H
mov f0,c
mov 66h,f0
mov 66h,a
pop psw
RET
;十六进制除法运算
;输入:被除数放在40H,41H,除数放在内44H,45H,商放在40H,41H,余数放在42H,43H,
DIV16:
PUSH PSW
setb rs0
MOV R0,#40H
MOV A,@R0
JNZ LOP0
INC R0
MOV A,@R0
JNZ LOP0
CLR A
MOV 42H,A
MOV 43H,A
RET
LOP0:MOV R0,#44H
MOV A,@R0
JNZ LOP1
INC R0
MOV A,@R0
JNZ LOP1
RET
LOP1:CLR A
MOV 42H,A
MOV 43H,A
MOV R2,#10H
LOP2:CLR C
MOV R3,#04H
MOV R0,#40H
LOP3:MOV A,@R0
RLC A
MOV @R0,A
INC R0
DJNZ R3,LOP3
MOV R0,#42H
MOV R1,#44H
MOV A,@R0
CLR C
SUBB A,@R1
MOV 48H,A
INC R0
INC R1
MOV A,@R0
SUBB A,@R1
MOV 49H,A
JC LOP4
MOV R0,#42H
MOV R1,#48H
MOV A,@R1
MOV @R0,A
INC R0
INC R1
MOV A,@R1
MOV @R0,A
MOV A,40H
INC A
MOV 40H,A
LOP4:DJNZ R2,LOP2
pop PSW
RET
;..................................
;/////////////////////////////////
DELAY2: ;40ms延时去抖动子程序8*FA*2=4ms
MOV R5,#08H
L7: MOV R6,#0FAH ;250
L8: DJNZ R6,L8
DJNZ R5,L7
RET
delay1:
mov r5,#250 ;液晶显示刷新速度
d9: mov r6,#250
d8: djnz r6,d8
djnz r5,d9
ret
/*delay100us:
mov r5,#5
djnz r5,$
ret
DELAY_10MS:
mov r6,#100
tt2:
mov r5,#50
djnz r5,$
djnz r6,tt2
ret*/
tab: db '0','1','2','3','4','5','6','7','8','9','.','F','W','V','A'
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -