用单片机实现温度远程显示 第7页
d_43: mov a,td_n
cjne a,#0,d_40
mov td_n,#7
d_42: dec yd_n100
mov a,yd_n100
cjne a,#9h,d_41
mov yd_n100,#0fh
ajmp d_41
d_40: dec td_n
d_41: mov a,yd_n100
lcall send_order
JNZ d_42
mov disp_buf+5,yd_n100
mov a,td_n
lcall ascii_bcd
jnz d_43
mov disp_buf+4,td_n
acall mov_to_disp
mov a,#100 ;2秒钟定时设定
add a,time_20ms
ajmp d_3
;----------------------------------
d_10: cjne a,time_20ms,d_30
mov a,yd_n100
lcall send_order
jnz d_30
mov a,td_n
lcall ascii_bcd
jnz d_30
acall mov_to_disp
mov a,#100
add a,time_20ms
d_30:ajmp d_3
;----------------------------------
mov_to_disp:mov disp_buf,r1
mov disp_buf+1,r2
mov disp_buf+2,r3
mov disp_buf+3,r4
ret
chuhao: mov r1,#1eh ;初始化等待提示
mov r2,#22h
mov r3,#21h
mov r4,#1fh
mov disp_buf+4,#21h
mov disp_buf+5,#20h
acall mov_to_disp
mov a,#75
add a,time_20ms
cjne a,time_20ms,$
mov wdt,#0
clear_wdt
mov a,#75
add a,time_20ms
cjne a,time_20ms,$
ret
end
2、数据转换子模块(rand_data.a51)
;-----------2-------rand_data.a51----------------
name rand_data
extrn idata (rec_buf)
public ascii_bcd
prog SEGMENT CODE ;定义代码段
byte_buff segment data ;定义字节数据段1
byte_buffI segment idata ;定义字节数据段2
bit_buff segment data bitaddressable ;定义位寻址区字节数据段
rseg prog
using 0
;-------------------------------------
ASCII_BCD:mov b,#8 ;计算该通道数据偏移首地址
mul ab
add a,#5
mov r0,#rec_buf
add a,r0
mov b,a
mov r0,a
acall ascii4_bcd3
mov a,b ;还原小数位数
add a,#7
mov r0,a
acall ascii_bin
mov r6,a ;小数位数暂存在R6中
mov a,r5
jz asc_oK
mov a,dpl
cpl a
clr c
inc a
mov dpl,a
mov a,dph
cpl a
addc a,#0
mov dph,a
jnz asc_b
asc_0: mov a,dpl
dec a
jnz asc_b
mov r1,#0fh
mov r2,#0fh
mov r3,#0fh
mov r4,#0fh
mov a,#0fh
ajmp asc_out
asc_b: mov r1,dpl ;为负数处理
mov r2,dph
acall bin_bcd
mov a,b ;还原小数位数
add a,#7
mov r0,a
acall ascii_bin
mov r6,a ;小数位数暂存r6
acall bcd2_bcd1
mov a,r4
dec a
jnz asc_100 ;数据小于-199.9时显示-199.9
mov r4,#23h
ajmp asc_sw
asc_100:mov r4,#23h
mov r3,#9
mov r2,#19h
mov r1,#9
ajmp asc_sw_1
asc_ok: acall bcd2_bcd1 ;正常数据处理程序
asc_sw: mov a,r4 ;清除有效位前面的0
jnz asc_sw_1
mov r4,#1ch
mov a,r3
jnz asc_sw_1
mov r3,#1ch
asc_sw_1:clr a
asc_out:ret
;------------每字节两位BCD码转换为每字节一位BCD码子程序
;入口:r3=个位及十位BCD码,r4=百位及千位BCD码,r6=小数位数
;出口:r1=个位BCD码,r2=十位BCD码,r3=百位BCD码,r4=千位BCD码
bcd2_bcd1:mov a,r3 ;个位及十位BCD数处理
anl a,#0fh
mov r1,a
mov a,r3
anl a,#0f0h
swap a
mov r2,a
mov a,r4 ;百位及千位BCD数处理
anl a,#0fh
mov r3,a
mov a,r4
anl a,#0f0h
swap a
mov r4,a
mov a,r6 ;加入小数点信息
jz bcd2_out
add a,#ar1
mov r0,a
mov a,@r0
add a,#10h
mov @r0,a
bcd2_out:ret
;---------------ASCii4_BCD3转换子程序
;入口:r0=四字节ASCII码首地址
;出口:r5,r4,r3从高至低依次存放BCD码(r3,r4各存2位,r5存1位)
ascii4_bcd3:acall ascii4_bin2
mov dpl,r1
mov dph,r2
acall bin_bcd
ret
;---------------BIN_BCD转换子程序
;入口:r1=BIN低字节,r2=BIN高字节 共2字节
;出口:r3=低2位BCD码,r4=高2位BCD码,r5=可能的最高位BCD码
bin_bcd:PUSH ACC
PUSH PSW
mov r3,#0 ;BCD单元清0
mov r4,#0
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] 下一页