📄 adc.lst
字号:
__start:
__text_start:
001B E5CF LDI R28,0x5F
001C E0D4 LDI R29,4
001D BFCD OUT 0x3D,R28
001E BFDE OUT 0x3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD Y+0,R16
0023 2400 CLR R0
0024 E6EF LDI R30,0x6F
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 36EF CPI R30,0x6F
0028 07F1 CPC R31,R17
0029 F011 BEQ 0x002C
002A 9201 ST R0,Z+
002B CFFB RJMP 0x0027
002C 8300 STD Z+0,R16
002D E2E6 LDI R30,0x26
002E E0F0 LDI R31,0
002F E6A0 LDI R26,0x60
0030 E0B0 LDI R27,0
0031 E010 LDI R17,0
0032 33E5 CPI R30,0x35
0033 07F1 CPC R31,R17
0034 F021 BEQ 0x0039
0035 95C8 LPM
0036 9631 ADIW R30,1
0037 920D ST R0,X+
0038 CFF9 RJMP 0x0032
0039 D07E RCALL _main
_exit:
003A CFFF RJMP _exit
FILE: F:\单片机教学\调试程序\ADC\adc-led.c
(0001) //Designed by Alf
(0002) //用于实现AD转换,转换结果由数码管显示,需要闭合SW5、SW6;以及SW8的1脚(AD0),而后旋转AD1电位器即可看到;
(0003) //AD将电位器分得的0~5V电压转换成了0~1023;
(0004) //ICC-AVR application builder : 2005-3-8 下午 04:53:49
(0005) // Target : M8
(0006) // Crystal: 11.059Mhz
(0007)
(0008) #include <iom8v.h>
(0009) #include <macros.h>
(0010)
(0011) //lednum全局变量
(0012) char lednum = 0;
(0013) char lednum1 = 0;
(0014) char lednum2 = 0;
(0015) char lednum3 = 0;
(0016) char lednum4 = 0;
(0017) //码表
(0018) char num[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(0019)
(0020)
(0021) void port_init(void)
(0022) {
(0023) PORTB = 0xFF;
_port_init:
003B EF8F LDI R24,0xFF
003C BB88 OUT 0x18,R24
(0024) DDRB = 0xFF;
003D BB87 OUT 0x17,R24
(0025) PORTC = 0x00; //m103 output only
003E 2422 CLR R2
003F BA25 OUT 0x15,R2
(0026) DDRC = 0x7E;
0040 E78E LDI R24,0x7E
0041 BB84 OUT 0x14,R24
(0027) PORTD = 0x00;
0042 BA22 OUT 0x12,R2
(0028) DDRD = 0xFF;
0043 EF8F LDI R24,0xFF
0044 BB81 OUT 0x11,R24
(0029) }
0045 9508 RET
(0030)
(0031) //TIMER0 initialisation - prescale:1024
(0032) // WGM: Normal
(0033) // desired value: 20mSec
(0034) // actual value: 19.908mSec (0.5%)
(0035) void timer0_init(void)
(0036) {
(0037) TCCR0 = 0x00; //stop
_timer0_init:
0046 2422 CLR R2
0047 BE23 OUT 0x33,R2
(0038) TCNT0 = 0x29; //set count
0048 E289 LDI R24,0x29
0049 BF82 OUT 0x32,R24
(0039) TCCR0 = 0x04; //start timer
004A E084 LDI R24,4
004B BF83 OUT 0x33,R24
(0040) }
004C 9508 RET
_timer0_ovf_isr:
004D 922A ST R2,-Y
004E 938A ST R24,-Y
004F 939A ST R25,-Y
0050 B62F IN R2,0x3F
0051 922A ST R2,-Y
(0041)
(0042) #pragma interrupt_handler timer0_ovf_isr:10
(0043) void timer0_ovf_isr(void)
(0044) {
(0045) TCNT0 = 0x29; //reload counter value
0052 E289 LDI R24,0x29
0053 BF82 OUT 0x32,R24
(0046) TCCR0 = 0x04; //start timer
0054 E084 LDI R24,4
0055 BF83 OUT 0x33,R24
(0047)
(0048) PORTB |= 0x30;
0056 B388 IN R24,0x18
0057 6380 ORI R24,0x30
0058 BB88 OUT 0x18,R24
(0049) PORTC |= 0x30;
0059 B385 IN R24,0x15
005A 6380 ORI R24,0x30
005B BB85 OUT 0x15,R24
(0050) if(lednum == 0) //更新PB4数码管;
005C 90200060 LDS R2,0x60
005E 2022 TST R2
005F F429 BNE 0x0065
(0051) { PORTB &= ~0x10;
0060 98C4 CBI 0x18,4
(0052) PORTD = lednum4;
0061 90200064 LDS R2,0x64
0063 BA22 OUT 0x12,R2
(0053) }
0064 C016 RJMP 0x007B
(0054) else if(lednum ==1) //更新PB5数码管;
0065 91800060 LDS R24,0x60
0067 3081 CPI R24,1
0068 F429 BNE 0x006E
(0055) { PORTB &= ~0x20;
0069 98C5 CBI 0x18,5
(0056) PORTD = lednum3;
006A 90200063 LDS R2,0x63
006C BA22 OUT 0x12,R2
(0057) }
006D C00D RJMP 0x007B
(0058) else if(lednum ==2) //更新PC4数码管;
006E 91800060 LDS R24,0x60
0070 3082 CPI R24,2
0071 F429 BNE 0x0077
(0059) { PORTC &= ~0x10;
0072 98AC CBI 0x15,4
(0060) PORTD = lednum2;
0073 90200062 LDS R2,0x62
0075 BA22 OUT 0x12,R2
(0061) }
0076 C004 RJMP 0x007B
(0062) else //更新PC5数码管;
(0063) { PORTC &= ~0x20;
0077 98AD CBI 0x15,5
(0064) PORTD = lednum1;
0078 90200061 LDS R2,0x61
007A BA22 OUT 0x12,R2
(0065) }
(0066)
(0067) lednum++;
007B 91800060 LDS R24,0x60
007D 5F8F SUBI R24,0xFF
007E 93800060 STS 0x60,R24
0080 C005 RJMP 0x0086
(0068) while(lednum >= 4) lednum = lednum - 4;
0081 91800060 LDS R24,0x60
0083 5084 SUBI R24,4
0084 93800060 STS 0x60,R24
0086 91800060 LDS R24,0x60
0088 3084 CPI R24,4
0089 F7B8 BCC 0x0081
(0069)
(0070) }
008A 9029 LD R2,Y+
008B BE2F OUT 0x3F,R2
008C 9199 LD R25,Y+
008D 9189 LD R24,Y+
008E 9029 LD R2,Y+
008F 9518 RETI
(0071)
(0072) //call this routine to initialise all peripherals
(0073) void init_devices(void)
(0074) {
(0075) //stop errant interrupts until set up
(0076) CLI(); //disable all interrupts
_init_devices:
0090 94F8 BCLR 7
(0077) port_init();
0091 DFA9 RCALL _port_init
(0078) timer0_init();
0092 DFB3 RCALL _timer0_init
(0079)
(0080) MCUCR = 0x00;
0093 2422 CLR R2
0094 BE25 OUT 0x35,R2
(0081) GICR = 0x00;
0095 BE2B OUT 0x3B,R2
(0082) TIMSK = 0x01; //timer interrupt sources
0096 E081 LDI R24,1
0097 BF89 OUT 0x39,R24
(0083) SEI(); //re-enable interrupts
0098 9478 BSET 7
(0084) //all peripherals are now initialised
(0085) }
0099 9508 RET
_delay:
j --> R16
i --> R18
z --> R20
009A D0DF RCALL push_gset1
(0086)
(0087)
(0088)
(0089)
(0090) //自定义函数
(0091) void delay(void)
(0092) {
(0093) unsigned int i,j,z;
(0094) for(i=0;i<10000;i++);
009B 2722 CLR R18
009C 2733 CLR R19
009D C002 RJMP 0x00A0
009E 5F2F SUBI R18,0xFF
009F 4F3F SBCI R19,0xFF
00A0 3120 CPI R18,0x10
00A1 E2E7 LDI R30,0x27
00A2 073E CPC R19,R30
00A3 F3D0 BCS 0x009E
(0095) { for(j=0;j<10000;j++)
00A4 2700 CLR R16
00A5 2711 CLR R17
00A6 C00B RJMP 0x00B2
(0096) { for(z=0;z<100;z++);}
00A7 2744 CLR R20
00A8 2755 CLR R21
00A9 C002 RJMP 0x00AC
00AA 5F4F SUBI R20,0xFF
00AB 4F5F SBCI R21,0xFF
00AC 3644 CPI R20,0x64
00AD E0E0 LDI R30,0
00AE 075E CPC R21,R30
00AF F3D0 BCS 0x00AA
00B0 5F0F SUBI R16,0xFF
00B1 4F1F SBCI R17,0xFF
00B2 3100 CPI R16,0x10
00B3 E2E7 LDI R30,0x27
00B4 071E CPC R17,R30
00B5 F388 BCS 0x00A7
(0097) }
(0098) }
00B6 D0C6 RCALL pop_gset1
00B7 9508 RET
_main:
temp --> R14
num4 --> R22
num3 --> R10
num2 --> R20
num1 --> Y+2
i --> R12
data --> Y+0
00B8 9723 SBIW R28,3
(0099)
(0100) void main(void)
(0101) {
(0102) char i;
(0103) unsigned int data=0,temp;
00B9 2400 CLR R0
00BA 2411 CLR R1
00BB 8219 STD Y+1,R1
00BC 8208 STD Y+0,R0
(0104) char num1=0,num2=0,num3=0,num4=0;
00BD 820A STD Y+2,R0
00BE 2744 CLR R20
00BF 24AA CLR R10
00C0 2766 CLR R22
(0105) init_devices();
00C1 DFCE RCALL _init_devices
(0106)
(0107) for(i=0;i<=9;i++)
00C2 24CC CLR R12
00C3 C00B RJMP 0x00CF
(0108) { lednum1 = num[i];
00C4 E685 LDI R24,0x65
00C5 E090 LDI R25,0
00C6 2DEC MOV R30,R12
00C7 27FF CLR R31
00C8 0FE8 ADD R30,R24
00C9 1FF9 ADC R31,R25
00CA 8020 LDD R2,Z+0
00CB 92200061 STS 0x61,R2
(0109) delay();
00CD DFCC RCALL _delay
00CE 94C3 INC R12
00CF E089 LDI R24,0x9
00D0 158C CP R24,R12
00D1 F790 BCC 0x00C4
(0110) }
(0111)
(0112) lednum1 = num[0];
00D2 90200065 LDS R2,0x65
00D4 92200061 STS 0x61,R2
(0113) lednum2 = num[0];
00D6 92200062 STS 0x62,R2
(0114) lednum3 = num[0];
00D8 92200063 STS 0x63,R2
(0115) lednum4 = num[0];
00DA 92200064 STS 0x64,R2
(0116)
(0117) delay();
00DC DFBD RCALL _delay
(0118) delay();
00DD DFBC RCALL _delay
00DE C06C RJMP 0x014B
(0119) while(1)
(0120) { ADMUX = 0x40; //选择通道零
00DF E480 LDI R24,0x40
00E0 B987 OUT 0x07,R24
(0121) ADCSRA = 0xC7;
00E1 EC87 LDI R24,0xC7
00E2 B986 OUT 0x06,R24
(0122)
(0123) while((ADCSRA | 0x10)==0);
00E3 B186 IN R24,0x06
00E4 6180 ORI R24,0x10
00E5 F3E9 BEQ 0x00E3
(0124) ADCSRA &=~0x10;
00E6 9834 CBI 0x06,4
(0125)
(0126) data = ADCL;
00E7 B024 IN R2,0x04
00E8 2433 CLR R3
00E9 8239 STD Y+1,R3
00EA 8228 STD Y+0,R2
(0127) temp =ADCH<<8;
00EB B0E5 IN R14,0x05
00EC 24FF CLR R15
00ED 2CFE MOV R15,R14
00EE 24EE CLR R14
(0128) data = data +temp;
00EF 0101 MOVW R0,R2
00F0 0C0E ADD R0,R14
00F1 1C1F ADC R1,R15
00F2 8219 STD Y+1,R1
00F3 8208 STD Y+0,R0
(0129)
(0130) num4 = data/1000;
00F4 EE28 LDI R18,0xE8
00F5 E033 LDI R19,3
00F6 0180 MOVW R16,R0
00F7 D058 RCALL div16u
00F8 2F60 MOV R22,R16
(0131) num3 = (data- data/1000*1000)/100;
00F9 EE28 LDI R18,0xE8
00FA E033 LDI R19,3
00FB 8108 LDD R16,Y+0
00FC 8119 LDD R17,Y+1
00FD D052 RCALL div16u
00FE 0198 MOVW R18,R16
00FF EE08 LDI R16,0xE8
0100 E013 LDI R17,3
0101 D068 RCALL empy16s
0102 0118 MOVW R2,R16
0103 8108 LDD R16,Y+0
0104 8119 LDD R17,Y+1
0105 1902 SUB R16,R2
0106 0913 SBC R17,R3
0107 E624 LDI R18,0x64
0108 E030 LDI R19,0
0109 D046 RCALL div16u
010A 2EA0 MOV R10,R16
(0132) num2 = (data-data/100*100)/10;
010B E624 LDI R18,0x64
010C E030 LDI R19,0
010D 8108 LDD R16,Y+0
010E 8119 LDD R17,Y+1
010F D040 RCALL div16u
0110 0198 MOVW R18,R16
0111 E604 LDI R16,0x64
0112 E010 LDI R17,0
0113 D056 RCALL empy16s
0114 0118 MOVW R2,R16
0115 8108 LDD R16,Y+0
0116 8119 LDD R17,Y+1
0117 1902 SUB R16,R2
0118 0913 SBC R17,R3
0119 E02A LDI R18,0xA
011A E030 LDI R19,0
011B D034 RCALL div16u
011C 2F40 MOV R20,R16
(0133) num1= data-data/10*10;
011D E02A LDI R18,0xA
011E E030 LDI R19,0
011F 8108 LDD R16,Y+0
0120 8119 LDD R17,Y+1
0121 D02E RCALL div16u
0122 0198 MOVW R18,R16
0123 E00A LDI R16,0xA
0124 E010 LDI R17,0
0125 D044 RCALL empy16s
0126 8048 LDD R4,Y+0
0127 8059 LDD R5,Y+1
0128 1A40 SUB R4,R16
0129 0A51 SBC R5,R17
012A 824A STD Y+2,R4
(0134)
(0135)
(0136) lednum4 = num[num4];
012B E685 LDI R24,0x65
012C E090 LDI R25,0
012D 2FE6 MOV R30,R22
012E 27FF CLR R31
012F 0FE8 ADD R30,R24
0130 1FF9 ADC R31,R25
0131 8020 LDD R2,Z+0
0132 92200064 STS 0x64,R2
(0137) lednum3 = num[num3];
0134 2DEA MOV R30,R10
0135 27FF CLR R31
0136 0FE8 ADD R30,R24
0137 1FF9 ADC R31,R25
0138 8020 LDD R2,Z+0
0139 92200063 STS 0x63,R2
(0138) lednum2 = num[num2];
013B 2FE4 MOV R30,R20
013C 27FF CLR R31
013D 0FE8 ADD R30,R24
013E 1FF9 ADC R31,R25
013F 8020 LDD R2,Z+0
0140 92200062 STS 0x62,R2
(0139) lednum1 = num[num1];
0142 2DE4 MOV R30,R4
0143 27FF CLR R31
0144 0FE8 ADD R30,R24
0145 1FF9 ADC R31,R25
0146 8020 LDD R2,Z+0
0147 92200061 STS 0x61,R2
(0140)
(0141) ADCSRA |= 0x40;
0149 9A36 SBI 0x06,6
(0142) delay();
014A DF4F RCALL _delay
014B CF93 RJMP 0x00DF
(0143)
(0144) }
(0145) }
FILE: <library>
014C 9623 ADIW R28,3
014D 9508 RET
mod16u:
014E 9468 BSET 6
014F C001 RJMP xdiv16u
div16u:
0150 94E8 BCLR 6
xdiv16u:
0151 92EA ST R14,-Y
0152 92FA ST R15,-Y
0153 938A ST R24,-Y
0154 24EE CLR R14
0155 24FF CLR R15
0156 E180 LDI R24,0x10
0157 0F00 LSL R16
0158 1F11 ROL R17
0159 1CEE ROL R14
015A 1CFF ROL R15
015B 16E2 CP R14,R18
015C 06F3 CPC R15,R19
015D F018 BCS 0x0161
015E 1AE2 SUB R14,R18
015F 0AF3 SBC R15,R19
0160 9503 INC R16
0161 958A DEC R24
0162 F7A1 BNE 0x0157
0163 F416 BRTC 0x0166
0164 2D0E MOV R16,R14
0165 2D1F MOV R17,R15
0166 9189 LD R24,Y+
0167 90F9 LD R15,Y+
0168 90E9 LD R14,Y+
0169 9508 RET
empy16s:
016A 920A ST R0,-Y
016B 921A ST R1,-Y
016C 938A ST R24,-Y
016D 939A ST R25,-Y
016E 9F02 MUL R16,R18
016F 01C0 MOVW R24,R0
0170 9F12 MUL R17,R18
0171 0D90 ADD R25,R0
0172 9F03 MUL R16,R19
0173 0D90 ADD R25,R0
0174 018C MOVW R16,R24
0175 9199 LD R25,Y+
0176 9189 LD R24,Y+
0177 9019 LD R1,Y+
0178 9009 LD R0,Y+
0179 9508 RET
push_gset1:
017A 935A ST R21,-Y
017B 934A ST R20,-Y
017C 9508 RET
pop_gset1:
017D E0E1 LDI R30,1
pop:
017E 9149 LD R20,Y+
017F 9159 LD R21,Y+
0180 FDE0 SBRC R30,0
0181 9508 RET
0182 9169 LD R22,Y+
0183 9179 LD R23,Y+
0184 FDE1 SBRC R30,1
0185 9508 RET
0186 90A9 LD R10,Y+
0187 90B9 LD R11,Y+
0188 FDE2 SBRC R30,2
0189 9508 RET
018A 90C9 LD R12,Y+
018B 90D9 LD R13,Y+
018C FDE3 SBRC R30,3
018D 9508 RET
018E 90E9 LD R14,Y+
018F 90F9 LD R15,Y+
0190 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -