📄 adsub.lis
字号:
.module ADsub.c
.area text
; tmp -> 0,X
; channel -> 3,X
0000 _advalue::
0000 A7FF ais #-1
0002 95 tsx
0003 ; /*-----------------------------------------------------*
0003 ; *文件描述:本文件包含了A/D转换的3个子函数,分别为: *
0003 ; *(1)advalue:获取1路A/D转换结果 *
0003 ; * unsigned char advalue(unsigned char channel) *
0003 ; *(2)admid:获取中值滤波后的A/D转换结果 *
0003 ; * unsigned char admid(unsigned char channel) *
0003 ; *(3)adave:获取均值滤波后的A/D转换结果 *
0003 ; * unsigned char adave(unsigned char n, *
0003 ; * unsigned char channel) *
0003 ; *-------------《嵌入式应用技术基础教程》--------------*/
0003 ; //[以下为子程序源代码]
0003 ; //[包含头文件]
0003 ; #include "GP32C.H"
0003 ; #define COCOBit 7 //转换完成标志位
0003 ; /*advalue:1路A/D转换函数-------------------------------*
0003 ; *功能:获取通道channel的A/D转换结果 *
0003 ; *参数:channel=通道号 *
0003 ; *返回:该通道的A/D转换结果 *
0003 ; *-----------------------------------------------------*/
0003 ; unsigned char advalue(unsigned char channel)
0003 ; {
0003 ; //选取通道号ADCH4-ADCH0=00000-00111
0003 ; unsigned char tmp;
0003 ; channel&=0b00011111;
0003 E603 lda 3,X
0005 A41F and #31
0007 E703 sta 3,X
0009 ; tmp=ADSCR&0b11100000;
0009 B63C lda 0x3c
000B A4E0 and #-32
000D F7 sta ,X
000E ; tmp=tmp|channel;//通道号选0;其他位不变。
000E EA03 ora 3,X
0010 F7 sta ,X
0011 ; ADSCR=tmp;
0011 B73C sta 0x3c
0013 2008 bra L3
0015 L2:
0015 ; //取A/D转换结果
0015 ; while(1)
0015 ; if((ADSCR&(1<<COCOBit))!=0)
0015 0F3C05 brclr #7,0x3c,L5
0018 ; {
0018 ; tmp=ADR; break;
0018 B63D lda 0x3d
001A F7 sta ,X
001B 2002 bra L4
001D L5:
001D L3:
001D 20F6 bra L2
001F L4:
001F ; }//接受数据
001F ; return tmp;
001F F6 lda ,X
0020 L1:
0020 A701 ais #1
0022 .dbline 0 ; func end
0022 81 rts
0023 ; k -> 0,X
0023 ; tmp -> 1,X
0023 ; i -> 2,X
0023 ; j -> 3,X
0023 ; channel -> 6,X
0023 _admid::
0023 A7FC ais #-4
0025 95 tsx
0026 ; }
0026 ; /*admid:1路A/D转换函数(中值滤波)-----------------------*
0026 ; *功能:获取通道channel中值滤波后的A/D转换结果 *
0026 ; *参数:channel=通道号 *
0026 ; *返回:该通道中值滤波后的A/D转换结果 *
0026 ; *-----------------------------------------------------*/
0026 ; unsigned char admid(unsigned char channel)
0026 ; {
0026 ; unsigned char i,j,k,tmp;
0026 ; //调用程序,取三次A/D转换结果
0026 ; i=advalue(channel);
0026 E606 lda 6,X
0028 87 psha
0029 CD0000 jsr _advalue
002C A701 ais #1
002E 95 tsx
002F B700 sta *__r1
0031 E702 sta 2,X
0033 ; j=advalue(channel);
0033 E606 lda 6,X
0035 87 psha
0036 CD0000 jsr _advalue
0039 A701 ais #1
003B 95 tsx
003C B700 sta *__r1
003E E703 sta 3,X
0040 ; k=advalue(channel);
0040 E606 lda 6,X
0042 87 psha
0043 CD0000 jsr _advalue
0046 A701 ais #1
0048 95 tsx
0049 B700 sta *__r1
004B F7 sta ,X
004C ; //从三次A/D转换结果中取中值
004C ; if (i>j)
004C E602 lda 2,X
004E E103 cmp 3,X
0050 230A bls L8
0052 ; {
0052 ; tmp=i; i=j; j=tmp;
0052 E701 sta 1,X
0054 E603 lda 3,X
0056 E702 sta 2,X
0058 E601 lda 1,X
005A E703 sta 3,X
005C ; }
005C L8:
005C ; if (k>=j)
005C F6 lda ,X
005D E103 cmp 3,X
005F 2506 blo L10
0061 ; tmp=j;
0061 E603 lda 3,X
0063 E701 sta 1,X
0065 200D bra L11
0067 L10:
0067 ; else
0067 ; if (k>=i) tmp=k;
0067 F6 lda ,X
0068 E102 cmp 2,X
006A 2504 blo L12
006C E701 sta 1,X
006E 2004 bra L13
0070 L12:
0070 ; else tmp=i;
0070 E602 lda 2,X
0072 E701 sta 1,X
0074 L13:
0074 L11:
0074 ; return tmp;//返回
0074 E601 lda 1,X
0076 L7:
0076 A704 ais #4
0078 .dbline 0 ; func end
0078 81 rts
0079 ; j -> 0,X
0079 ; i -> 2,X
0079 ; channel -> 6,X
0079 ; n -> 5,X
0079 _adave::
0079 A7FD ais #-3
007B 95 tsx
007C ; }
007C ; /*adave:1路A/D转换函数(均值滤波)-----------------------*
007C ; *功能:对通道channel的A/D转换结果求n次平均值 *
007C ; *参数:n=平均次数,channel=通道号 *
007C ; *返回:该通道均值滤波后的A/D转换结果 *
007C ; *-----------------------------------------------------*/
007C ; unsigned char adave(unsigned char n,unsigned char channel)
007C ; {
007C ; //求n次A/D转换的平均值
007C ; unsigned char i;
007C ; unsigned int j;
007C ; j=0;
007C 6F01 clr 1,X
007E 7F clr ,X
007F ; for (i=0;i<n;i++)
007F 6F02 clr 2,X
0081 2019 bra L18
0083 L15:
0083 E606 lda 6,X
0085 87 psha
0086 CD0023 jsr _admid
0089 A701 ais #1
008B 95 tsx
008C B700 sta *__r1
008E 3F00 clr *__r0
0090 E601 lda 1,X
0092 BB00 add *__r1
0094 E701 sta 1,X
0096 F6 lda ,X
0097 B900 adc *__r0
0099 F7 sta ,X
009A L16:
009A 6C02 inc 2,X
009C L18:
009C E602 lda 2,X
009E E105 cmp 5,X
00A0 25E1 blo L15
00A2 ; j+=admid(channel);
00A2 ; j=j/n;
00A2 3F00 clr *__r0
00A4 E605 lda 5,X
00A6 B700 sta *__r1
00A8 E601 lda 1,X
00AA B700 sta *__rlo
00AC F6 lda ,X
00AD B700 sta *__rhi
00AF B600 lda *__r1
00B1 87 psha
00B2 B600 lda *__r0
00B4 87 psha
00B5 CD0000 jsr __divmod16u
00B8 A702 ais #2
00BA B600 lda *__rhi
00BC F7 sta ,X
00BD B600 lda *__rlo
00BF E701 sta 1,X
00C1 ; return (unsigned char)j;
00C1 L14:
00C1 A703 ais #3
00C3 .dbline 0 ; func end
00C3 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -