📄 adc.lst
字号:
__text_start:
__start:
0024 EFCF LDI R28,0xFF
0025 E0D2 LDI R29,2
0026 BFCD OUT 0x3D,R28
0027 BFDE OUT 0x3E,R29
0028 51C0 SUBI R28,0x10
0029 40D0 SBCI R29,0
002A EA0A LDI R16,0xAA
002B 8308 STD Y+0,R16
002C 2400 CLR R0
002D E0E4 LDI R30,4
002E E0F1 LDI R31,1
002F E011 LDI R17,1
0030 30E7 CPI R30,7
0031 07F1 CPC R31,R17
0032 F011 BEQ 0x0035
0033 9201 ST R0,Z+
0034 CFFB RJMP 0x0030
0035 8300 STD Z+0,R16
0036 E4E4 LDI R30,0x44
0037 E0F0 LDI R31,0
0038 E0A0 LDI R26,0
0039 E0B1 LDI R27,1
003A E010 LDI R17,0
003B 34E8 CPI R30,0x48
003C 07F1 CPC R31,R17
003D F021 BEQ 0x0042
003E 95C8 LPM
003F 9631 ADIW R30,1
0040 920D ST R0,X+
0041 CFF9 RJMP 0x003B
0042 D06C RCALL _main
_exit:
0043 CFFF RJMP _exit
FILE: C:\调试程序\mega48\ADC\ADC.c
(0001) //使用内部RC振荡,PB6-G,PB7-DP短路块连接
(0002) //使用INT0/INT1按键切换ADC通道
(0003) #include <iom48v.h>
(0004) #include <macros.h>
(0005) #define osccal 0x9A//内部RC校正常数
(0006) #define Vref 500//参考电压值
(0007) extern const unsigned char seg_table[16];
(0008) extern unsigned char led_buff[4];
(0009) extern void delay_ms(unsigned int time);
(0010) extern void display(void);
(0011) unsigned int adc_rel;//AD转换结果
(0012) unsigned char adc_mux;//AD通道
(0013) //ADC初始化
(0014) void adc_init(void)
(0015) {
(0016) DDRC=0x00;
_adc_init:
0044 2422 CLR R2
0045 B827 OUT 0x07,R2
(0017) PORTC=0x00;
0046 B828 OUT 0x08,R2
(0018) ADCSRA = 0x00; //设置前,先关闭ADC
0047 9220007A STS 0x7A,R2
(0019) ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准,单端输入口为ADC0
0049 91800104 LDS R24,adc_mux
004B 708F ANDI R24,0xF
004C 6480 ORI R24,0x40
004D 9380007C STS 0x7C,R24
(0020) ACSR =(1<<ACD);//关闭模拟比较器,禁止位P148
004F E880 LDI R24,0x80
0050 BF80 OUT 0x30,R24
(0021) ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
0051 EC8E LDI R24,0xCE
0052 9380007A STS 0x7A,R24
0054 9508 RET
_adc_isr:
0055 938A ST R24,-Y
0056 939A ST R25,-Y
0057 B78F IN R24,0x3F
0058 938A ST R24,-Y
(0022) }
(0023) //ADC完成中断
(0024) #pragma interrupt_handler adc_isr:22
(0025) void adc_isr(void)
(0026) {
(0027) adc_rel=ADC&0x3ff;
0059 91800078 LDS R24,0x78
005B 91900079 LDS R25,0x79
005D 7093 ANDI R25,3
005E 93900106 STS adc_rel+1,R25
0060 93800105 STS adc_rel,R24
(0028) ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
0062 91800104 LDS R24,adc_mux
0064 708F ANDI R24,0xF
0065 6480 ORI R24,0x40
0066 9380007C STS 0x7C,R24
(0029) ADCSRA|=(1<<ADSC);//启动AD转换
0068 9180007A LDS R24,0x7A
006A 6480 ORI R24,0x40
006B 9380007A STS 0x7A,R24
006D 9189 LD R24,Y+
006E BF8F OUT 0x3F,R24
006F 9199 LD R25,Y+
0070 9189 LD R24,Y+
0071 9518 RETI
_ADCtoBCD:
i --> R10
temp --> R12
0072 D1BC RCALL push_gset4
0073 0168 MOVW R12,R16
(0030) }
(0031) //ADC结果转换成电压值
(0032) void ADCtoBCD(unsigned int temp)
(0033) {
(0034) unsigned char i;
(0035) temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
0074 0116 MOVW R2,R12
0075 2444 CLR R4
0076 2455 CLR R5
0077 EF44 LDI R20,0xF4
0078 E051 LDI R21,1
0079 E060 LDI R22,0
007A E070 LDI R23,0
007B 925A ST R5,-Y
007C 924A ST R4,-Y
007D 923A ST R3,-Y
007E 922A ST R2,-Y
007F 018A MOVW R16,R20
0080 019B MOVW R18,R22
0081 D17D RCALL empy32s
0082 EF4F LDI R20,0xFF
0083 E053 LDI R21,3
0084 E060 LDI R22,0
0085 E070 LDI R23,0
0086 937A ST R23,-Y
0087 936A ST R22,-Y
0088 935A ST R21,-Y
0089 934A ST R20,-Y
008A D103 RCALL div32u
008B 0168 MOVW R12,R16
(0036) for(i=0;i<4;i++)
008C 24AA CLR R10
008D C017 RJMP 0x00A5
(0037) {
(0038) led_buff[i]=seg_table[temp%10];
008E E02A LDI R18,0xA
008F E030 LDI R19,0
0090 0186 MOVW R16,R12
0091 D0E0 RCALL mod16u
0092 01F8 MOVW R30,R16
0093 E384 LDI R24,0x34
0094 E090 LDI R25,0
0095 0FE8 ADD R30,R24
0096 1FF9 ADC R31,R25
0097 91E4 LPM R30,0(Z)
0098 E080 LDI R24,0
0099 E091 LDI R25,1
009A 2DAA MOV R26,R10
009B 27BB CLR R27
009C 0FA8 ADD R26,R24
009D 1FB9 ADC R27,R25
009E 93EC ST R30,0(X)
(0039) temp=temp/10;
009F E02A LDI R18,0xA
00A0 E030 LDI R19,0
00A1 0186 MOVW R16,R12
00A2 D0D1 RCALL div16u
00A3 0168 MOVW R12,R16
00A4 94A3 INC R10
00A5 2D8A MOV R24,R10
00A6 3084 CPI R24,4
00A7 F330 BCS 0x008E
(0040) }
(0041) led_buff[2]&=0x7f;
00A8 91800102 LDS R24,led_buff+2
00AA 778F ANDI R24,0x7F
00AB 93800102 STS led_buff+2,R24
00AD D17D RCALL pop_gset4
00AE 9508 RET
(0042) }
(0043) //MAIN程序
(0044) void main(void)
(0045) {
(0046) unsigned char i;
(0047) unsigned int adc_old;
(0048) DDRD=0xf0;
_main:
adc_old --> R22
i --> R20
00AF EF80 LDI R24,0xF0
00B0 B98A OUT 0x0A,R24
(0049) PORTD=0xff;
00B1 EF8F LDI R24,0xFF
00B2 B98B OUT 0x0B,R24
(0050) OSCCAL=osccal;//校正振荡频率
00B3 E98A LDI R24,0x9A
00B4 93800066 STS 0x66,R24
(0051) adc_mux=0;
00B6 2422 CLR R2
00B7 92200104 STS adc_mux,R2
(0052) adc_init();
00B9 DF8A RCALL _adc_init
(0053) SEI();//使能全局中断
00BA 9478 BSET 7
(0054)
(0055) for(i=0;i<4;i++)
00BB 2744 CLR R20
00BC C010 RJMP 0x00CD
(0056) {
(0057) led_buff[i]=seg_table[8];
00BD E080 LDI R24,0
00BE E091 LDI R25,1
00BF 2FE4 MOV R30,R20
00C0 27FF CLR R31
00C1 0FE8 ADD R30,R24
00C2 1FF9 ADC R31,R25
00C3 E3AC LDI R26,0x3C
00C4 E0B0 LDI R27,0
00C5 93FA ST R31,-Y
00C6 93EA ST R30,-Y
00C7 01FD MOVW R30,R26
00C8 91A4 LPM R26,0(Z)
00C9 91E9 LD R30,Y+
00CA 91F9 LD R31,Y+
00CB 83A0 STD Z+0,R26
00CC 9543 INC R20
00CD 3044 CPI R20,4
00CE F370 BCS 0x00BD
(0058) }
(0059) for(i=0;i<100;i++)
00CF 2744 CLR R20
00D0 C002 RJMP 0x00D3
(0060) display();
00D1 D078 RCALL _display
00D2 9543 INC R20
00D3 3644 CPI R20,0x64
00D4 F3E0 BCS 0x00D1
(0061)
(0062) adc_old=0;
00D5 2766 CLR R22
00D6 2777 CLR R23
(0063) adc_rel=0;
00D7 2422 CLR R2
00D8 2433 CLR R3
00D9 92300106 STS adc_rel+1,R3
00DB 92200105 STS adc_rel,R2
00DD C055 RJMP 0x0133
(0064) while(1)
(0065) {
(0066) if(adc_old!=adc_rel)
00DE 90200105 LDS R2,adc_rel
00E0 90300106 LDS R3,adc_rel+1
00E2 1562 CP R22,R2
00E3 0573 CPC R23,R3
00E4 F019 BEQ 0x00E8
(0067) {
(0068) adc_old=adc_rel;
00E5 01B1 MOVW R22,R2
(0069) ADCtoBCD(adc_old);
00E6 0181 MOVW R16,R2
00E7 DF8A RCALL _ADCtoBCD
(0070) }
(0071) display();
00E8 D061 RCALL _display
(0072)
(0073) i=PIND&0x0c;//判断按键
00E9 B149 IN R20,0x09
00EA 704C ANDI R20,0xC
(0074) if(i!=0x0c)
00EB 304C CPI R20,0xC
00EC F409 BNE 0x00EE
00ED C045 RJMP 0x0133
(0075) {
(0076) display();//按键消抖
00EE D05B RCALL _display
(0077) if(i==(PIND&0x0c))
00EF B189 IN R24,0x09
00F0 708C ANDI R24,0xC
00F1 1748 CP R20,R24
00F2 F009 BEQ 0x00F4
00F3 C03F RJMP 0x0133
(0078) {
(0079) CLI();
00F4 94F8 BCLR 7
(0080) adc_rel=0;
00F5 2422 CLR R2
00F6 2433 CLR R3
00F7 92300106 STS adc_rel+1,R3
00F9 92200105 STS adc_rel,R2
(0081) adc_old=0;
00FB 2766 CLR R22
00FC 2777 CLR R23
(0082) if (i==0x08)//INT0键按下
00FD 3048 CPI R20,0x8
00FE F459 BNE 0x010A
(0083) {
(0084) if(adc_mux<3)
00FF 91800104 LDS R24,adc_mux
0101 3083 CPI R24,3
0102 F420 BCC 0x0107
(0085) adc_mux++;//递增
0103 5F8F SUBI R24,0xFF
0104 93800104 STS adc_mux,R24
0106 C003 RJMP 0x010A
(0086) else
(0087) adc_mux=0;
0107 2422 CLR R2
0108 92200104 STS adc_mux,R2
(0088) }
(0089) if (i==0x04)//INT1键按下
010A 3044 CPI R20,4
010B F469 BNE 0x0119
(0090) {
(0091) if(adc_mux>0)
010C 2422 CLR R2
010D 90300104 LDS R3,adc_mux
010F 1423 CP R2,R3
0110 F428 BCC 0x0116
(0092) adc_mux--;//递减
0111 2D83 MOV R24,R3
0112 5081 SUBI R24,1
0113 93800104 STS adc_mux,R24
0115 C003 RJMP 0x0119
(0093) else
(0094) adc_mux=3;
0116 E083 LDI R24,3
0117 93800104 STS adc_mux,R24
(0095) }
(0096) led_buff[0]=seg_table[adc_mux];
0119 E384 LDI R24,0x34
011A E090 LDI R25,0
011B 91E00104 LDS R30,adc_mux
011D 27FF CLR R31
011E 0FE8 ADD R30,R24
011F 1FF9 ADC R31,R25
0120 91E4 LPM R30,0(Z)
0121 93E00100 STS led_buff,R30
(0097) led_buff[1]=0xbf;//-
0123 EB8F LDI R24,0xBF
0124 93800101 STS led_buff+1,R24
(0098) led_buff[2]=0b10001001;//h
0126 E889 LDI R24,0x89
0127 93800102 STS led_buff+2,R24
(0099) led_buff[3]=0b11000110;//C
0129 EC86 LDI R24,0xC6
012A 93800103 STS led_buff+3,R24
012C C001 RJMP 0x012E
(0100) while((PIND&0x0c)!=0x0c)//检查按键释放
(0101) display();
012D D01C RCALL _display
012E B189 IN R24,0x09
012F 708C ANDI R24,0xC
0130 308C CPI R24,0xC
0131 F7D9 BNE 0x012D
(0102) SEI();
0132 9478 BSET 7
0133 CFAA RJMP 0x00DE
0134 9508 RET
FILE: C:\调试程序\mega48\ADC\numled.c
(0001) #include<iom48v.h>
(0002) const unsigned char seg_table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
(0003) 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
(0004) unsigned char led_buff[4]={0,0,0,0};
(0005) /* 微秒级延时程序 */
(0006) void delay_us(int time)
(0007) {
(0008) do
(0009) {
(0010) time--;
_delay_us:
time --> R16
0135 5001 SUBI R16,1
0136 4010 SBCI R17,0
(0011) }
(0012) while (time>1);
0137 E081 LDI R24,1
0138 E090 LDI R25,0
0139 1780 CP R24,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -