📄 ad_temp_pro.asm
字号:
;**************************************;*********
;input: AD的数据:AD_Data_Hi,AD_Data_low
;function:AD值所对应的温度值
;output: 温度寄存器b_room_temp,0下标志f_delow_0C
;**************************************;*********
;自定义宏
;**************************************;*********
sub2r macro t_h,t_l,t0_h,t0_l,temp1,temp2,f_a ;2位数相减的决对值 |T-T0|=
cjae2 t_h,t_l,t0_h,t0_l,loop1 ;先判断是T大还是T0大?
;
b0bclr f_a ;
;T<T0 ;
mov a,t0_h ;T0-T=
sub a,t_h ;先高位相减
mov temp1,a ;得到高位差值
mov a,t0_l ;
sub a,t_l ;
mov temp2,a ;得到低位数的差值
b0bts1 fc ;
decms temp1 ;
nop ;
jmp loop2 ;
;T>=T0 ;
loop1: ;
b0bset f_a ;T-T0=
mov a,t_h ;
sub a,t0_h ;先高位相减
mov temp1,a ;得到高位差值
mov a,t_l ;
sub a,t0_l ;
mov temp2,a ;得到低位数的差值
b0bts1 fc ;
decms temp1 ;
nop ;
loop2: ;
endm ;
;;**************************************;*********
;
CJA2 MACRO Reg1_H,Reg1_L,Reg2_H,Reg2_L,Addr_Above
MOV A,Reg2_H ;
SUB A,Reg1_H ;
B0BTS1 FC ;
JMP_RET Addr_Above ;
B0BTS1 FZ ;
JMP $+5 ;
MOV A,Reg2_L ;
SUB A,Reg1_L ;
B0BTS1 FC ;
JMP_RET Addr_Above ;
ENDM ;
;---------------------------------------;
CJB2 MACRO Reg1_H,Reg1_L,Reg2_H,Reg2_L,Addr_Below
;
MOV A,Reg1_H ;
SUB A,Reg2_H ;
B0BTS1 FC ;
JMP_RET Addr_Below ;
B0BTS1 FZ ;
JMP $+5 ;
MOV A,Reg1_L ;
SUB A,Reg2_L ;
B0BTS1 FC ;
JMP_RET Addr_Below ;
ENDM ;
;;**************************************;***************;
; ↑
; 自定义宏结束
;;**************************************;***************;***************
;Rhino notice ;
;此模块要和自定义的宏一起copy过去就可以直接使用。 ;
;从f_0_a中可以看出表中的值是增减关系; ;
;当f_0_a=1时,为递减 ;
;当f_0_a=0时,为递增 ;
;在check_t0,check_t1里各放一个断点,可智增减,若 ;
;在不同的时间会分别进入两个断点,则表中的数值有误, ;
;
;功能:查得ad值所对应的温度值 ;
;input:ad值 ;
;过程:寻找ad值所对应的温度值 ;
;output:温度值 ;
;;**************************************;***************;***************;
.data ;
b_ad_tab ds 1 ;
;
temp_buf ds 1 ;-------;
f_0_a equ temp_buf.0 ;
f_incms_tab equ temp_buf.1 ;
;-------;
temp_h0 ds 1 ;存放表的值
temp_l0 ds 1 ;
temp_h1 ds 1 ;存放表的值的下一个
temp_l1 ds 1 ;
;
temp_1 ds 1 ;
temp_2 ds 1 ;
.code
;;**************************************;*********
;
;程序入口
;;**************************************;*********
ad_temp_pro: ;
b0bclr f_temp_time ;清进入处理程序时间标志位
;---------------------------------------;
;---------------------------------------;查表
check_tab: ;
mov a,b_ad_tab ;
b0mov y,#temp_tab$m ;
b0mov z,#temp_tab$l ;
;
mov a,b_ad_tab ;给行数
b0add z,a ;
b0bts0 fc ;
incms y ;
movc ;
mov temp_l0,a ;低8位存放在temp_l0中
mov_ temp_h0,r ;高4位存放在temp_h0中
incms z ;
jmp $+2 ;
incms y ;
movc ;
mov temp_l1,a ;低8位存放在temp_l1中
mov_ temp_h1,r ;高8位存放在temp_l1中
;---------------------------------------;
;---------------------------------------;比较查得的表中的值谁大谁小!!
; |t0-t1|=t 两数相减的决对值 ;
;
;if(t0>t1) ;
; f_0_a=1; ;
;else f_0_a=0; 从此可以看出是增减关系 ;
;---------------------------------------;-------------------------------;
;采用了自定义宏
sub2r temp_h0,temp_l0,temp_h1,temp_l1,temp_1,temp_2,f_0_a ;
;-----------------------------------------------------------------------; t0 **** t1
; ↑
b0bts1 f_0_a ;先看一下是t0>t1吗? ; |
jmp check_t1 ; ; ad值在这个位置(夹在t0\t1之间)吗?
; ;
check_t0: ;ad>t0就要向下查表 ;t0>t1
b0bclr f_incms_tab ; ;
cja2 AD_Data_Hi,AD_Data_low,temp_h0,temp_l0,no_between ;f_incms_tab 是看要向上查还是向下查?
b0bset f_incms_tab ;
cjb2 AD_Data_Hi,AD_Data_low,temp_h1,temp_l1,no_between ;要得到t0>ad>t1
jmp ad_betwin_tab ; ;
check_t1: ;ad<t1就要向上查表 ;t0<t1
b0bclr f_incms_tab ; ;
cjb2 AD_Data_Hi,AD_Data_low,temp_h0,temp_l0,no_between ;要得到t0<ad<t1
b0bset f_incms_tab ;
cja2 AD_Data_Hi,AD_Data_low,temp_h1,temp_l1,no_between ;
jmp ad_betwin_tab ; ;
;---------------------------------------;-------------------------------;
no_between: ;查得AD值不是在中间 ;
b0bts0 f_incms_tab ;
incms b_ad_tab ;向下查
nop ;
b0bts1 f_incms_tab ;
decms b_ad_tab ;向上查
nop ;
mov_ b_room_temp,b_ad_tab ;
;
jmp ad_temp_30 ;
;;**********************************************;********
DW 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff
DW 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff
;;**********************************************;********
;---------------------------------------;满足条件 ---t0--ad--t1-- 的排列组合
ad_betwin_tab: ;
;此时是解决精确度的问题,看AD值更趋近于t0还是t1.
mov_ b_room_temp,b_ad_tab ;
b0bclr fc ;
rrcm temp_1 ;
rrcm temp_2 ;将t/2 加到比较小的值去,看AD值是趋近,若ad小于加进去的值,
b0bts1 f_0_a ;
jmp add_t0 ;t0小
jmp add_t1 ;t1小
add_t0: ;
add_ temp_2,temp_l0 ;低位相加,有进位就响高加!
b0bts0 fc ;
incms temp_1 ;若ad小于加进去的值,
nop ;
add_ temp_1,temp_h0 ;t
cja2 temp_1,temp_2,AD_Data_Hi,AD_Data_low,ad_temp_30
incms b_room_temp ;
nop ;
jmp ad_temp_30 ;
add_t1: ;
add_ temp_2,temp_l1 ;低位相加,有进位就响高加!
b0bts0 fc ;
incms temp_1 ;若ad小于加进去的值,
nop ;
add_ temp_1,temp_h1 ;t
cjb2 temp_1,temp_2,AD_Data_Hi,AD_Data_low,ad_temp_30
incms b_room_temp ;
nop ;
jmp ad_temp_30 ;
;;**********************************************;********
;判断所得到的温度数据是在零下or零上?
;;**************************************;****************
ad_temp_30: ;
mov a,b_ad_tab ;查表值
sub a,#109 ;
b0bts1 fc ;
jmp $+3 ;
mov_ b_ad_tab,#50 ;
;
cjae_ b_room_temp,#10,ad_temp_40 ;
b0bset f_delow_0C ;
mov a,#10 ;
sub a,b_room_temp ;显示零下的温度!
mov b_room_temp,a ;
jmp exit_ad_temp ;
;
ad_temp_40: ;
;
b0bclr f_delow_0C ;零和零上温度!
mov a,b_room_temp ;
sub a,#10 ;
mov b_room_temp,a ;
;;**************************************;****************
;
;程序出口
;;**************************************;****************
exit_ad_temp: ;
ret ;
;;**************************************;****************
DW 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff
DW 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff 0xffff
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -