⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ad_temp_pro.asm

📁 汇编的自定义宏指令的使用和AD数值的处理
💻 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 + -