📄 ad.lis
字号:
.module AD.C
.area text(rom, con, rel)
0000 .dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
0000 .dbfunc e adc_init _adc_init fV
.even
0000 _adc_init::
0000 .dbline -1
0000 .dbline 22
0000 ; // **************************************************************
0000 ; // *** 广 州 天 河 双 龙 电 子 公 司 ***
0000 ; // *** http://www.sl.com.cn ***
0000 ; // *** 实验:ADC转换 ***
0000 ; // *** 作者:zxy@sl.com.cn ***
0000 ; // *** 2006年3月28日 ***
0000 ; // *** 目标MCU:MEGA169 晶振:内部(INT)8MHZ ***
0000 ; // **************************************************************
0000 ; //用跳线短接J3的ADC2,调节可变电阻R7,LED显示将发生变化
0000 ; #include <iom169v.h>
0000 ; #include <macros.h>
0000 ; #define Vref 3212//参考电压值,注意不同环境下的Vref不相同
0000 ;
0000 ; extern const unsigned char seg_table[16];
0000 ; extern unsigned char led_buff[4];
0000 ; extern void delay_ms(unsigned int time);
0000 ; extern void display(void);
0000 ; unsigned int adc_rel;//AD转换结果
0000 ;
0000 ; //ADC初始化
0000 ; void adc_init(void)
0000 ; {
0000 .dbline 23
0000 ; ADCSRA = 0x00; //设置前,先关闭ADC
0000 2224 clr R2
0002 20927A00 sts 122,R2
0006 .dbline 24
0006 ; ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC1
0006 81E4 ldi R24,65
0008 80937C00 sts 124,R24
000C .dbline 25
000C ; ACSR =(1<<ACD);//关闭模拟比较器,禁止位P148
000C 80E8 ldi R24,128
000E 80BF out 0x30,R24
0010 .dbline 26
0010 ; ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//ADC时钟64分频
0010 8FEC ldi R24,207
0012 80937A00 sts 122,R24
0016 .dbline -2
0016 L1:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbend
.area vector(rom, abs)
.org 76
004C 0C940C00 jmp _adc_isr
.area text(rom, con, rel)
0018 .dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
0018 .dbfunc e adc_isr _adc_isr fV
.even
0018 _adc_isr::
0018 8A93 st -y,R24
001A 9A93 st -y,R25
001C 8FB7 in R24,0x3f
001E 8A93 st -y,R24
0020 .dbline -1
0020 .dbline 34
0020 ; }
0020 ;
0020 ; //ADC完成中断
0020 ; #pragma interrupt_handler adc_isr:20
0020 ; //AD 中断
0020 ;
0020 ; void adc_isr(void)
0020 ; {
0020 .dbline 36
0020 ;
0020 ; adc_rel = ADC&0x3ff;
0020 80917800 lds R24,120
0024 90917900 lds R25,120+1
0028 9370 andi R25,3
002A 90930100 sts _adc_rel+1,R25
002E 80930000 sts _adc_rel,R24
0032 .dbline 38
0032 ; //ADMUX =(1<<REFS0)|(1<<MUX0);
0032 ; ADCSRA|=(1<<ADSC);//启动AD转换
0032 80917A00 lds R24,122
0036 8064 ori R24,64
0038 80937A00 sts 122,R24
003C .dbline -2
003C L2:
003C .dbline 0 ; func end
003C 8991 ld R24,y+
003E 8FBF out 0x3f,R24
0040 9991 ld R25,y+
0042 8991 ld R24,y+
0044 1895 reti
0046 .dbend
0046 .dbfunc e ADCtoBCD _ADCtoBCD fV
0046 ; i -> R12
0046 ; temp -> R10,R11
.even
0046 _ADCtoBCD::
0046 0E940000 xcall push_xgsetF03C
004A 5801 movw R10,R16
004C .dbline -1
004C .dbline 43
004C ; }
004C ;
004C ; //ADC结果转换成电压值
004C ; void ADCtoBCD(unsigned int temp)
004C ; {
004C .dbline 45
004C ; unsigned char i;
004C ; temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/1024);//ADC结果转换成电压值
004C 1501 movw R2,R10
004E 4424 clr R4
0050 5524 clr R5
0052 4CE8 ldi R20,140
0054 5CE0 ldi R21,12
0056 60E0 ldi R22,0
0058 70E0 ldi R23,0
005A 5A92 st -y,R5
005C 4A92 st -y,R4
005E 3A92 st -y,R3
0060 2A92 st -y,R2
0062 8A01 movw R16,R20
0064 9B01 movw R18,R22
0066 0E940000 xcall empy32u
006A 8AE0 ldi R24,10
006C 90E0 ldi R25,0
006E 8A93 st -y,R24
0070 0E940000 xcall lsr32
0074 5801 movw R10,R16
0076 .dbline 46
0076 ; for(i=0;i<4;i++)
0076 CC24 clr R12
0078 19C0 xjmp L7
007A L4:
007A .dbline 47
007A ; {
007A .dbline 48
007A ; led_buff[i]=seg_table[temp%10];//结果存入显示缓存
007A 2AE0 ldi R18,10
007C 30E0 ldi R19,0
007E 8501 movw R16,R10
0080 0E940000 xcall mod16u
0084 F801 movw R30,R16
0086 80E0 ldi R24,<_seg_table
0088 90E0 ldi R25,>_seg_table
008A E80F add R30,R24
008C F91F adc R31,R25
008E 2490 lpm R2,Z
0090 80E0 ldi R24,<_led_buff
0092 90E0 ldi R25,>_led_buff
0094 EC2D mov R30,R12
0096 FF27 clr R31
0098 E80F add R30,R24
009A F91F adc R31,R25
009C 2082 std z+0,R2
009E .dbline 49
009E ; temp=temp/10;
009E 2AE0 ldi R18,10
00A0 30E0 ldi R19,0
00A2 8501 movw R16,R10
00A4 0E940000 xcall div16u
00A8 5801 movw R10,R16
00AA .dbline 50
00AA ; }
00AA L5:
00AA .dbline 46
00AA C394 inc R12
00AC L7:
00AC .dbline 46
00AC 8C2D mov R24,R12
00AE 8430 cpi R24,4
00B0 20F3 brlo L4
00B2 X0:
00B2 .dbline 51
00B2 ; led_buff[3]&=0x7f;
00B2 80910300 lds R24,_led_buff+3
00B6 8F77 andi R24,127
00B8 80930300 sts _led_buff+3,R24
00BC .dbline -2
00BC L3:
00BC .dbline 0 ; func end
00BC 0C940000 xjmp pop_xgsetF03C
00C0 .dbsym r i 12 c
00C0 .dbsym r temp 10 i
00C0 .dbend
00C0 .dbfunc e main _main fV
00C0 ; adc_old -> R10,R11
.even
00C0 _main::
00C0 .dbline -1
00C0 .dbline 55
00C0 ; }
00C0 ;
00C0 ; void main(void)
00C0 ; {
00C0 .dbline 57
00C0 ; unsigned int adc_old;
00C0 ; adc_init();//AD初始化
00C0 9FDF xcall _adc_init
00C2 .dbline 59
00C2 ;
00C2 ; DDRE=0xff;//E口初始化
00C2 8FEF ldi R24,255
00C4 8DB9 out 0xd,R24
00C6 .dbline 60
00C6 ; PORTE=0xff;//E口初始化
00C6 8EB9 out 0xe,R24
00C8 .dbline 61
00C8 ; DDRB|=0xf0;//B口初始化
00C8 84B1 in R24,0x4
00CA 806F ori R24,240
00CC 84B9 out 0x4,R24
00CE .dbline 62
00CE ; PORTB|=0xf0;//B口初始化
00CE 85B1 in R24,0x5
00D0 806F ori R24,240
00D2 85B9 out 0x5,R24
00D4 .dbline 63
00D4 ; SEI();//使能全局中断
00D4 7894 sei
00D6 0CC0 xjmp L11
00D8 L10:
00D8 .dbline 65
00D8 ; while(1)
00D8 ; {
00D8 .dbline 66
00D8 ; if(adc_old!=adc_rel)
00D8 20900000 lds R2,_adc_rel
00DC 30900100 lds R3,_adc_rel+1
00E0 A214 cp R10,R2
00E2 B304 cpc R11,R3
00E4 19F0 breq L13
00E6 X1:
00E6 .dbline 67
00E6 ; {
00E6 .dbline 68
00E6 ; adc_old=adc_rel; //AD转换结果
00E6 5101 movw R10,R2
00E8 .dbline 69
00E8 ; ADCtoBCD(adc_old);//进制转换
00E8 8101 movw R16,R2
00EA ADDF xcall _ADCtoBCD
00EC .dbline 70
00EC ; }
00EC L13:
00EC .dbline 71
00EC ; display(); //显示函数
00EC 0E940000 xcall _display
00F0 .dbline 73
00F0 ;
00F0 ; }
00F0 L11:
00F0 .dbline 64
00F0 F3CF xjmp L10
00F2 X2:
00F2 .dbline -2
00F2 L9:
00F2 .dbline 0 ; func end
00F2 0895 ret
00F4 .dbsym r adc_old 10 i
00F4 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
0000 _adc_rel::
0000 .blkb 2
0002 .dbsym e adc_rel _adc_rel i
0002 ; }
0002 ;
0002 ;
0002 ;
0002 ;
0002 ;
0002 ;
0002 ;
0002 ;
0002 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -