📄 adsub.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 + -