📄 mega16_ad.lst
字号:
0113 933F PUSH R19
0114 019C MOVW R18,R24
0115 0181 MOVW R16,R2
0116 940E01D0 CALL mod16s
0118 01F8 MOVW R30,R16
0119 913F POP R19
011A 912F POP R18
011B 0FE6 ADD R30,R22
011C 1FF7 ADC R31,R23
011D 8100 LDD R16,0+Z
011E DF96 RCALL _One_smg_display
(0071) Delayus(2000); //调整显示时间和亮度(时间越长亮度越高,但是太长数码管就闪了)
011F ED00 LDI R16,0xD0
0120 E017 LDI R17,7
0121 DF3F RCALL _Delayus
0122 94A3 INC R10
0123 2D8A MOV R24,R10
0124 3086 CPI R24,6
0125 F2C0 BCS 0x00FE
0126 9543 INC R20
0127 3F40 CPI R20,0xF0
0128 F298 BCS 0x00FC
(0072) }
(0073) }
(0074) } 0129 940E021F CALL pop_gset3
012B 9508 RET
_Mega16_ad:
addata --> R20
chl --> R20
012C 940E01FD CALL push_gset1
012E 2F40 MOV R20,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD\MEGA16_AD.C
(0001) /*******************************************
(0002) 文件:MEGA16_AD.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动MEGA16片上自带的AD转换器
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012) #include <AVR_PQ1A.h> //包含自定义常量头文件
(0013) #include "SMG.C" //包含数码管显示函数
(0014)
(0015) /*******************************************
(0016) 函数名称: Mega16_ad
(0017) 功 能: 对指定的通道进行模数转换
(0018) 参 数: chl--指定的通道(本开发板只用了通道0)
(0019) 返回值 : addata--10位数据输出
(0020) /********************************************/
(0021) uint Mega16_ad(uchar chl)
(0022) {
(0023) uint addata;
(0024) DDRA&=~(BIT(PA0)|BIT(PA1)); //转换口设置为输入、无上拉
012F B38A IN R24,P1A
0130 7F8C ANDI R24,0xFC
0131 BB8A OUT P1A,R24
(0025) PORTA&=~(BIT(PA0)|BIT(PA1));
0132 B38B IN R24,P1B
0133 7F8C ANDI R24,0xFC
0134 BB8B OUT P1B,R24
(0026) ADMUX=0; //采用外部参考电压,输出数据右对齐
0135 2422 CLR R2
0136 B827 OUT P07,R2
(0027) ADMUX|=chl; //设置指定的通道
0137 B027 IN R2,P07
0138 2A24 OR R2,R20
0139 B827 OUT P07,R2
(0028) ADCSR=0x80; //采用单次转换,查询模式,2分频
013A E880 LDI R24,0x80
013B B986 OUT P06,R24
(0029) ADCSR|=BIT(ADSC); //启动转换
013C 9A36 SBI P06,6
(0030) while(!(ADCSR&(BIT(ADIF)))); //等待转换结束
013D 9B34 SBIS P06,4
013E CFFE RJMP 0x013D
(0031) addata=ADCL;
013F B144 IN R20,P04
0140 2755 CLR R21
(0032) addata+=ADCH*256;
0141 B125 IN R18,P05
0142 2733 CLR R19
0143 E000 LDI R16,0
0144 E011 LDI R17,1
0145 940E01ED CALL empy16s
0147 0F40 ADD R20,R16
0148 1F51 ADC R21,R17
(0033) return addata;
0149 2F04 MOV R16,R20
014A 2F15 MOV R17,R21
014B 940E0200 CALL pop_gset1
014D 9508 RET
_Num_BCD:
rept --> R20
chr --> Y+0
i --> R22
num --> R10
014E 940E0218 CALL push_gset3
0150 2EA0 MOV R10,R16
0151 9723 SBIW R28,3
(0034) }
(0035) /*******************************************
(0036) 函数名称: Num_BCD
(0037) 功 能: 将一个字节的整数转换成三位BCD码
(0038) 参 数: num--需要转换的整数
(0039) 返回值 : chr--三位BCD码数组指针
(0040) /********************************************/
(0041) uchar* Num_BCD(uchar num)
(0042) {
(0043) uchar i,chr[3];
(0044) uchar *rept;
(0045) rept=&(chr[0]); //返回指针指向BCD码数组
0152 01AE MOVW R20,R28
(0046) for(i=0;i<3;i++)
0153 2766 CLR R22
0154 C014 RJMP 0x0169
(0047) {
(0048) chr[2-i]=num%10; //对10取余数(其实是求模,但是对于正数,取余与求模是相等的)
0155 2E26 MOV R2,R22
0156 2433 CLR R3
0157 E0E2 LDI R30,2
0158 E0F0 LDI R31,0
0159 19E2 SUB R30,R2
015A 09F3 SBC R31,R3
015B 01CE MOVW R24,R28
015C 0FE8 ADD R30,R24
015D 1FF9 ADC R31,R25
015E E01A LDI R17,0xA
015F 2D0A MOV R16,R10
0160 940E01A0 CALL mod8u
0162 8300 STD R16,0+Z
(0049) num/=10; //除以10,为取出下一位做准备
0163 E01A LDI R17,0xA
0164 2D0A MOV R16,R10
0165 940E01A2 CALL div8u
0167 2EA0 MOV R10,R16
0168 9563 INC R22
0169 3063 CPI R22,3
016A F350 BCS 0x0155
(0050) }
(0051) return rept; //返回指针
016B 2F04 MOV R16,R20
016C 2F15 MOV R17,R21
016D 9623 ADIW R28,3
016E 940E021F CALL pop_gset3
0170 9508 RET
_main:
adpt --> R20
ad0 --> Y+0
i --> R22
0171 9723 SBIW R28,3
(0052) }
(0053) /*******************************************
(0054) 函数名称: main
(0055) 功 能: 驱动MEGA16的AD,并在数码管上显示采集值
(0056) 参 数: 无
(0057) 返回值 : 无
(0058) /********************************************/
(0059) void main(void)
(0060) {
(0061) uchar *adpt; //定义一个接受返回指针的指针变量
(0062) uchar i,ad0[3];
(0063) Board_init( ); //初始化开发板
0172 DF1C RCALL _Board_init
0173 C029 RJMP 0x019D
(0064) while(1)
(0065) {
(0066) adpt=Num_BCD(Mega16_ad(0)/4); //启动AD转换通道0,同时将数值转换成BCD码
0174 2700 CLR R16
0175 DFB6 RCALL _Mega16_ad
0176 9516 LSR R17
0177 9507 ROR R16
0178 9516 LSR R17
0179 9507 ROR R16
017A DFD3 RCALL _Num_BCD
017B 01A8 MOVW R20,R16
(0067) for(i=0;i<3;i++) //将转换后的BCD码存入显示数组
017C 2766 CLR R22
017D C00C RJMP 0x018A
(0068) {
(0069) ad0[i]=*(adpt+i);
017E 2FE6 MOV R30,R22
017F 27FF CLR R31
0180 0FE4 ADD R30,R20
0181 1FF5 ADC R31,R21
0182 8020 LDD R2,0+Z
0183 01CE MOVW R24,R28
0184 2FE6 MOV R30,R22
0185 27FF CLR R31
0186 0FE8 ADD R30,R24
0187 1FF9 ADC R31,R25
0188 8220 STD R2,0+Z
0189 9563 INC R22
018A 3063 CPI R22,3
018B F390 BCS 0x017E
(0070) }
(0071) for(i=0;i<3;i++) //显示转换的数值
018C 2766 CLR R22
018D C00D RJMP 0x019B
(0072) {
(0073) One_smg_display(ad0[i],i+1);
018E 2F26 MOV R18,R22
018F 5F2F SUBI R18,0xFF
0190 01CE MOVW R24,R28
0191 2FE6 MOV R30,R22
0192 27FF CLR R31
0193 0FE8 ADD R30,R24
0194 1FF9 ADC R31,R25
0195 8100 LDD R16,0+Z
0196 DF1E RCALL _One_smg_display
(0074) Delayms(2);
0197 E002 LDI R16,2
0198 E010 LDI R17,0
0199 DEDF RCALL _Delayms
019A 9563 INC R22
019B 3063 CPI R22,3
019C F388 BCS 0x018E
019D CFD6 RJMP 0x0174
(0075) }
(0076) }
(0077) }FILE: <library>
019E 9623 ADIW R28,3
019F 9508 RET
mod8u:
01A0 9468 BSET 6
01A1 C001 RJMP xdiv8u
div8u:
01A2 94E8 BCLR 6
xdiv8u:
01A3 932A ST R18,-Y
01A4 92FA ST R15,-Y
01A5 24FF CLR R15
01A6 E028 LDI R18,0x8
01A7 0F00 LSL R16
01A8 1CFF ROL R15
01A9 16F1 CP R15,R17
01AA F010 BCS 0x01AD
01AB 1AF1 SUB R15,R17
01AC 9503 INC R16
01AD 952A DEC R18
01AE F7C1 BNE 0x01A7
01AF F40E BRTC 0x01B1
01B0 2D0F MOV R16,R15
01B1 90F9 LD R15,Y+
01B2 9129 LD R18,Y+
01B3 9508 RET
mod16u:
01B4 9468 BSET 6
01B5 C001 RJMP xdiv16u
div16u:
01B6 94E8 BCLR 6
xdiv16u:
01B7 92EA ST R14,-Y
01B8 92FA ST R15,-Y
01B9 938A ST R24,-Y
01BA 24EE CLR R14
01BB 24FF CLR R15
01BC E180 LDI R24,0x10
01BD 0F00 LSL R16
01BE 1F11 ROL R17
01BF 1CEE ROL R14
01C0 1CFF ROL R15
01C1 16E2 CP R14,R18
01C2 06F3 CPC R15,R19
01C3 F018 BCS 0x01C7
01C4 1AE2 SUB R14,R18
01C5 0AF3 SBC R15,R19
01C6 9503 INC R16
01C7 958A DEC R24
01C8 F7A1 BNE 0x01BD
01C9 F416 BRTC 0x01CC
01CA 2D0E MOV R16,R14
01CB 2D1F MOV R17,R15
01CC 9189 LD R24,Y+
01CD 90F9 LD R15,Y+
01CE 90E9 LD R14,Y+
01CF 9508 RET
mod16s:
01D0 9468 BSET 6
01D1 C001 RJMP 0x01D3
div16s:
01D2 94E8 BCLR 6
01D3 92DA ST R13,-Y
01D4 2ED1 MOV R13,R17
01D5 26D3 EOR R13,R19
01D6 FF17 SBRS R17,7
01D7 C004 RJMP 0x01DC
01D8 9510 COM R17
01D9 9500 COM R16
01DA 5F0F SUBI R16,0xFF
01DB 4F1F SBCI R17,0xFF
01DC FF37 SBRS R19,7
01DD C004 RJMP 0x01E2
01DE 9530 COM R19
01DF 9520 COM R18
01E0 5F2F SUBI R18,0xFF
01E1 4F3F SBCI R19,0xFF
01E2 940E01B7 CALL xdiv16u
01E4 F036 BRTS 0x01EB
01E5 FED7 SBRS R13,7
01E6 C004 RJMP 0x01EB
01E7 9510 COM R17
01E8 9500 COM R16
01E9 5F0F SUBI R16,0xFF
01EA 4F1F SBCI R17,0xFF
01EB 90D9 LD R13,Y+
01EC 9508 RET
empy16s:
01ED 920A ST R0,-Y
01EE 921A ST R1,-Y
01EF 938A ST R24,-Y
01F0 939A ST R25,-Y
01F1 9F02 MUL R16,R18
01F2 01C0 MOVW R24,R0
01F3 9F12 MUL R17,R18
01F4 0D90 ADD R25,R0
01F5 9F03 MUL R16,R19
01F6 0D90 ADD R25,R0
01F7 018C MOVW R16,R24
01F8 9199 LD R25,Y+
01F9 9189 LD R24,Y+
01FA 9019 LD R1,Y+
01FB 9009 LD R0,Y+
01FC 9508 RET
push_gset1:
01FD 935A ST R21,-Y
01FE 934A ST R20,-Y
01FF 9508 RET
pop_gset1:
0200 E0E1 LDI R30,1
pop:
0201 9149 LD R20,Y+
0202 9159 LD R21,Y+
0203 FDE0 SBRC R30,0
0204 9508 RET
0205 9169 LD R22,Y+
0206 9179 LD R23,Y+
0207 FDE1 SBRC R30,1
0208 9508 RET
0209 90A9 LD R10,Y+
020A 90B9 LD R11,Y+
020B FDE2 SBRC R30,2
020C 9508 RET
020D 90C9 LD R12,Y+
020E 90D9 LD R13,Y+
020F FDE3 SBRC R30,3
0210 9508 RET
0211 90E9 LD R14,Y+
0212 90F9 LD R15,Y+
0213 9508 RET
push_gset2:
0214 937A ST R23,-Y
0215 936A ST R22,-Y
0216 940C01FD JMP push_gset1
push_gset3:
0218 92BA ST R11,-Y
0219 92AA ST R10,-Y
021A 940C0214 JMP push_gset2
pop_gset2:
021C E0E2 LDI R30,2
021D 940C0201 JMP pop
pop_gset3:
021F E0E4 LDI R30,4
0220 940C0201 JMP pop
lsl8:
0222 2311 TST R17
0223 F019 BEQ 0x0227
0224 0F00 LSL R16
0225 951A DEC R17
0226 CFFB RJMP lsl8
0227 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -