📄 发送,接收,运算,4x4键盘,i2c,.asm
字号:
mov a,66h ; 计算效验码,上面发送位的和,并放到65H
add a,#0b0h
mov 63h,a
mov a,67h
add a,63h
mov 65h,a
;......................................
;MOV A,65h ; 发送效验码65H
MOV SBUF,a
loop202:
jbc ti,next202
ljmp loop202
next202:
ret
;..............................
; //////////////////////////////////发送i区
to_i:
MOV A,#0a9h ; 发送通信头a9
MOV SBUF,a
loop1811:
jbc ti,next1811
ljmp loop1811
next1811:
; ANL A,#0FH
MOV A,#06H ; 发送字节数量06
MOV SBUF,a
loop1911:
jbc ti,next1911
ljmp loop1911
next1911:
MOV A,#03H ; 发送电流标识03
MOV SBUF,a
loop1921:
jbc ti,next1921
ljmp loop1921
next1921:
;*************************************************
MOV A,68h
MOV SBUF,a
loop201:
jbc ti,next201
ljmp loop201
next201:
; ANL A,#0FH
MOV A,69H
MOV SBUF,a
loop211:
jbc ti,next211
ljmp loop211
next211:
;..........................................
mov a,68h ; 计算效验码,上面发送位的和,并放到6cH
add a,#0b2h
mov 6ah,a
mov a,69h
add a,6ah
mov 6ch,a
;...........................................
;MOV A,6ch ; 发送效验码6cH
MOV SBUF,a
loop2022:
jbc ti,next2022
ljmp loop2022
next2022:
ret
;............................................
/* to_i::
MOV A,68h
MOV SBUF,a
loop201:
jbc ti,next201
ljmp loop201
next201:
; ANL A,#0FH
MOV A,69H
MOV SBUF,a
loop211:
jbc ti,next211
ljmp loop211
next211:
ret*/
;..........................................
displayi:
MOV p1,#089H ;千位
ACALL ENABLE
MOV A,50H
MOVC A, @A+DPTR
CALL write2
;...........................................
MOV p1,#08aH ;百位
ACALL ENABLE
MOV A,51H
MOVC A, @A+DPTR
CALL write2
;...........................................
MOV p1,#08cH ;十位
ACALL ENABLE
MOV A,52H
MOVC A, @A+DPTR
CALL write2
;.............................................
MOV p1,#08dH ;个位
ACALL ENABLE
MOV A,53H
MOVC A, @A+DPTR
CALL write2
ret
;//////////////////////////////////////////
;..........................................
displayi_fore:
MOV p1,#089H ;千位
ACALL ENABLE
MOV A,50H
MOVC A, @A+DPTR
CALL write2
ret
;...........................................
displayi_three:
MOV p1,#08aH ;百位
ACALL ENABLE
MOV A,51H
MOVC A, @A+DPTR
CALL write2
ret
;...........................................
displayi_two:
MOV p1,#08cH ;十位
ACALL ENABLE
MOV A,52H
MOVC A, @A+DPTR
CALL write2
ret
;.............................................
displayi_one:
MOV p1,#08dH ;个位
ACALL ENABLE
MOV A,53H
MOVC A, @A+DPTR
CALL write2
ret
; //////////////////////////////////接收区
from_two:
call delay1
setb ren
loop26:
jbc ri,rec
jmp loop26
rec:
mov a,sbuf
cjne a,#0a9h,less ; 先接收通信头a9
;clr ren
;setb ren
loop27:
;call delay1
jbc ri,rec2 ; 直接寻址为1转移,并清该位
jmp loop27
rec2:
;clr ren
mov a,sbuf
cjne a,#06h,less ; 接收字节数06H
loop28:
jbc ri,rec3
jmp loop28
rec3:
mov a,sbuf
cjne a,#02h,less ; 接收电流标识02h
;.........................................................
loop29: ; 接收实际电流的高低8位
jbc ri,rec4
jmp loop29
rec4:
mov a,sbuf
mov 37h,a
loop30:
jbc ri,rec5
jmp loop30
rec5:
mov a,sbuf
mov 36h,a
;..............................................................
loop31: ; 接收电流效验码
jbc ri,rec6
jmp loop31
rec6:
mov a,sbuf
mov 4eh,a
clr ren
;..................................................
mov a,#0b1h ; 检查效接收到的验码是否和所计算的一致,
add a,37h
mov 60h,a
mov a,36h
add a,60h
mov 62h,a
mov a,4eh
cjne a,62h,less
call from_two_2
ret
less:
;call DISPLAY_read_i_ffff
jmp key_start
;.................................................
from_two_2:
mov a,37h
cjne a,#00h,next300_nmul_ok ;判断高8是否为0,不是,检查低8是否为2ch,90h,即检查12CH,190H,判断是否为300,400
mov a,36h
cjne a,#00h,next100_nmul_ok ;判断低8是否为0,不是,检查低8是否为2ch,90h,即检查12CH,190H,判断是否为100,200
mov 55h,#00h
mov 56h,#00h
mov 57h,#00h
mov 58h,#00h
call DISPLAY_read_i
ret
next100_nmul_ok:
mov a,36h
cjne a,#064h,next200_nmul_ok
mov 55h,#00h ;个
mov 56h,#00h ;十
mov 57h,#01h ;百
mov 58h,#00h ;千
call DISPLAY_read_i
ret
next200_nmul_ok:
mov a,36h
cjne a,#0c8h,nmul_ok
mov 55h,#00h ;个
mov 56h,#00h ;十
mov 57h,#02h ;百
mov 58h,#00h ;千
call DISPLAY_read_i
ret
next300_nmul_ok:
mov a,37h
cjne a,#01h,next100_2_nmul_ok
mov a,36h
cjne a,#02ch,next400_mul_ok
mov 55h,#00h ;个
mov 56h,#00h ;十
mov 57h,#03h ;百
mov 58h,#00h ;千
call DISPLAY_read_i
ret
next400_mul_ok:
mov a,36h
cjne a,#090h,nmul_ok
mov 55h,#00h ;个
mov 56h,#00h ;十
mov 57h,#04h ;百
mov 58h,#00h ;千
call DISPLAY_read_i
ret
next100_2_nmul_ok:
mov a,36h
cjne a,#064h,next200_2_nmul_ok
mov 55h,#00h ;个
mov 56h,#00h ;十
mov 57h,#01h ;百
mov 58h,#00h ;千
call DISPLAY_read_i
ret
next200_2_nmul_ok:
mov a,36h
cjne a,#0c8h,nmul_ok
mov 55h,#00h ;个
mov 56h,#00h ;十
mov 57h,#02h ;百
mov 58h,#00h ;千
call DISPLAY_read_i
ret
nmul_ok:
CALL from_two_DATE_i
ret
;..........................
;//////////////////////////////////
Test_loop:
MOV A,37h
MOV SBUF,a
loop181:
jbc ti,next181
ljmp loop181
next181:
; ANL A,#0FH
MOV A,36H
MOV SBUF,a
loop191:
jbc ti,next191
ljmp loop191
next191:
ret
;***************************************
;***************************************
to_count_i:
mov 4ah,50h
mov 4bh,51h
mov 4ch,52h
mov 4dh,53h
call to_count
mov 68h,31h ;高8位
mov 69h,38h
ret
;***************************************
to_count_v:
mov 4ah,3ah
mov 4bh,3bh
mov 4ch,3ch
mov 4dh,3dh
call to_count
mov 66h,31h ;高8位
mov 67h,38h
ret
;*******************************************
to_count:
mov a,4ah ; 千 ;电压十进制转化成十六进制
mov b,#0e8h
mul ab
mov 33h,a
mov 35h,b
mov a,#03h
mov b,4ah
mul ab
add a,35h
mov 32h,a
;................................
mov a,4bh ; 百
mov b,#064h
mul ab
mov 31h,a
mov 30h,b
;................................
mov a,4ch ; 十
mov b,#0ah
mul ab
add a,4dh ; 个
mov 38h,a
;.................................
mov a,38h
add a,31h
mov 35h,a
clr a
mov b,30h
addc a,b
mov 31h,a
mov a,33h
add a,35h
mov 38h,a ;低8位
clr a
mov b,31h
addc a,b
mov 35h,a
mov a,32h
add a,35h
mov 31h,a ;高8位
ret
;*************************************
nmul_to_count_w:
mov a,3ah ;判断电压千位是否为0
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
mov a,56h ;判断电流百位是否为0
cjne a,#00h,compare_over
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,57h ; 电压千位为0,电流千位不为0,显示结果即为
mov b,#0ah
mul ab
mov 6bh,a
mov a,56h
add a,6bh
mov 6bh,a ;电流千位转换成十六进制放在69h
;......................................
mov a,3bh
mov b,6bh ;再乘上电压的百位3bh
mul ab
mov 40h,a
mov 41h,b
CALL to_rather_DATE_w
ret
compare_over: ;电压和电流的千位都为0,但百位都不为0
mov a,3bh
mov b,56h
mul ab
mov 40h,a
mov 41h,b
CALL to_rather_DATE_w
ret
go_on_v:
mov a,57h ;判断电流千位是否为0,已判断电压的千位不为0
cjne a,#00h,mul_i_and_v
mov a,56h
cjne a,#00h,mul_i_no_1_and_v
mov 5ah,#00h ;电压的千位不为0,但电流的百千位都为0,即显示结果为0,
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,#0ah
mul ab
mov 6bh,a
mov a,56h
add a,6bh ;电流百千位转换成十六进制放在6bh
mov 6bh,a ;已判断电流千位不为0
;..................................................................
mov a,69h ;
mov b,6bh
mul ab
mov 40h,a
mov 41h,b
CALL to_rather_DATE_w
ret
mul_i_no_1_and_v: ; 电压千位不为0,电流千位为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,56h ;电流的百位56h x 电压的百千转换成十六进制 69h
mov b,69h
mul ab
mov 40h,a
mov 41h,b
CALL to_rather_DATE_w
ret
/*
; 电压有百千乘上电流的百位
nmul_to_count_w:
mov a,3ah ;判断电压千位是否为0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -