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

📄 adsub.s

📁 要用到开发工具SD-H08
💻 S
字号:
	.module ADsub.c
	.area text
;            tmp -> 0,X
;        channel -> 3,X
_advalue::
	ais #-1
	tsx
; /*-----------------------------------------------------*
; *文件描述:本文件包含了A/D转换的3个子函数,分别为:       *  
; *(1)advalue:获取1路A/D转换结果                         *
; *   unsigned char advalue(unsigned char channel)       *
; *(2)admid:获取中值滤波后的A/D转换结果                  *
; *   unsigned char admid(unsigned char channel)         *
; *(3)adave:获取均值滤波后的A/D转换结果                  *
; *   unsigned char adave(unsigned char n,               *
; *   unsigned char channel)                             *
; *-------------《嵌入式应用技术基础教程》--------------*/
; //[以下为子程序源代码]
; //[包含头文件]
; #include "GP32C.H"
; #define COCOBit  7           //转换完成标志位
; /*advalue:1路A/D转换函数-------------------------------*
; *功能:获取通道channel的A/D转换结果                     *
; *参数:channel=通道号                                   *
; *返回:该通道的A/D转换结果                              *
; *-----------------------------------------------------*/ 
; unsigned char advalue(unsigned char channel)
;   { 
;    //选取通道号ADCH4-ADCH0=00000-00111
; 	unsigned char tmp;
; 	channel&=0b00011111;
	lda 3,X
	and #31
	sta 3,X
; 	tmp=ADSCR&0b11100000;
	lda 0x3c
	and #-32
	sta ,X
; 	tmp=tmp|channel;//通道号选0;其他位不变。
	ora 3,X
	sta ,X
; 	ADSCR=tmp;
	sta 0x3c
	bra L3
L2:
; 	//取A/D转换结果	 
;  	while(1)
;  	   if((ADSCR&(1<<COCOBit))!=0)
	brclr #7,0x3c,L5
;           {
;           tmp=ADR; break;
	lda 0x3d
	sta ,X
	bra L4
L5:
L3:
	bra L2
L4:
;           }//接受数据
; 	return  tmp;
	lda ,X
L1:
	ais #1
	.dbline 0 ; func end
	rts
;              k -> 0,X
;            tmp -> 1,X
;              i -> 2,X
;              j -> 3,X
;        channel -> 6,X
_admid::
	ais #-4
	tsx
;   }
; /*admid:1路A/D转换函数(中值滤波)-----------------------*
; *功能:获取通道channel中值滤波后的A/D转换结果           *
; *参数:channel=通道号                                   *
; *返回:该通道中值滤波后的A/D转换结果                    *
; *-----------------------------------------------------*/ 
; unsigned char admid(unsigned char channel) 
;   {
;      unsigned char i,j,k,tmp;
;      //调用程序,取三次A/D转换结果
;      i=advalue(channel);
	lda 6,X
	psha
	jsr _advalue
	ais #1
	tsx
	sta *__r1
	sta 2,X
;      j=advalue(channel);
	lda 6,X
	psha
	jsr _advalue
	ais #1
	tsx
	sta *__r1
	sta 3,X
;      k=advalue(channel);
	lda 6,X
	psha
	jsr _advalue
	ais #1
	tsx
	sta *__r1
	sta ,X
;      //从三次A/D转换结果中取中值
;      if (i>j) 
	lda 2,X
	cmp 3,X
	bls L8
;          { 
;          tmp=i; i=j; j=tmp; 
	sta 1,X
	lda 3,X
	sta 2,X
	lda 1,X
	sta 3,X
;          }
L8:
;      if (k>=j)
	lda ,X
	cmp 3,X
	blo L10
;            tmp=j;
	lda 3,X
	sta 1,X
	bra L11
L10:
;      else
;            if (k>=i)  tmp=k;
	lda ,X
	cmp 2,X
	blo L12
	sta 1,X
	bra L13
L12:
;            else       tmp=i;
	lda 2,X
	sta 1,X
L13:
L11:
;      return tmp;//返回
	lda 1,X
L7:
	ais #4
	.dbline 0 ; func end
	rts
;              j -> 0,X
;              i -> 2,X
;        channel -> 6,X
;              n -> 5,X
_adave::
	ais #-3
	tsx
;  }
; /*adave:1路A/D转换函数(均值滤波)-----------------------*
; *功能:对通道channel的A/D转换结果求n次平均值            *
; *参数:n=平均次数,channel=通道号                       *
; *返回:该通道均值滤波后的A/D转换结果                    *
; *-----------------------------------------------------*/ 
; unsigned char adave(unsigned char n,unsigned char channel) 
;   {
;      //求n次A/D转换的平均值
;      unsigned char i;
;      unsigned int j;
;      j=0;
	clr 1,X
	clr ,X
;      for (i=0;i<n;i++)         
	clr 2,X
	bra L18
L15:
	lda 6,X
	psha
	jsr _admid
	ais #1
	tsx
	sta *__r1
	clr *__r0
	lda 1,X
	add *__r1
	sta 1,X
	lda ,X
	adc *__r0
	sta ,X
L16:
	inc 2,X
L18:
	lda 2,X
	cmp 5,X
	blo L15
;        j+=admid(channel);
;      j=j/n;
	clr *__r0
	lda 5,X
	sta *__r1
	lda 1,X
	sta *__rlo
	lda ,X
	sta *__rhi
	lda *__r1
	psha
	lda *__r0
	psha
	jsr __divmod16u
	ais #2
	lda *__rhi
	sta ,X
	lda *__rlo
	sta 1,X
;      return (unsigned char)j;
L14:
	ais #3
	.dbline 0 ; func end
	rts

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -