📄 adc.s
字号:
.module ADC.c
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\ADC\ADC.c
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 15
; //使用内部RC振荡,PB6-G,PB7-DP短路块连接
; //使用INT0/INT1按键切换ADC通道
; #include <iom48v.h>
; #include <macros.h>
; #define osccal 0x9A//内部RC校正常数
; #define Vref 500//参考电压值
; extern const unsigned char seg_table[16];
; extern unsigned char led_buff[4];
; extern void delay_ms(unsigned int time);
; extern void display(void);
; unsigned int adc_rel;//AD转换结果
; unsigned char adc_mux;//AD通道
; //ADC初始化
; void adc_init(void)
; {
.dbline 16
; DDRC=0x00;
clr R2
out 0x7,R2
.dbline 17
; PORTC=0x00;
out 0x8,R2
.dbline 18
; ADCSRA = 0x00; //设置前,先关闭ADC
sts 122,R2
.dbline 19
; ADMUX =(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准,单端输入口为ADC0
lds R24,_adc_mux
andi R24,15
ori R24,64
sts 124,R24
.dbline 20
; ACSR =(1<<ACD);//关闭模拟比较器,禁止位P148
ldi R24,128
out 0x30,R24
.dbline 21
; ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
ldi R24,206
sts 122,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 42
rjmp _adc_isr
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\ADC\ADC.c
.dbfunc e adc_isr _adc_isr fV
.even
_adc_isr::
st -y,R24
st -y,R25
in R24,0x3f
st -y,R24
.dbline -1
.dbline 26
; }
; //ADC完成中断
; #pragma interrupt_handler adc_isr:22
; void adc_isr(void)
; {
.dbline 27
; adc_rel=ADC&0x3ff;
lds R24,120
lds R25,120+1
andi R25,3
sts _adc_rel+1,R25
sts _adc_rel,R24
.dbline 28
; ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
lds R24,_adc_mux
andi R24,15
ori R24,64
sts 124,R24
.dbline 29
; ADCSRA|=(1<<ADSC);//启动AD转换
lds R24,122
ori R24,64
sts 122,R24
.dbline -2
L2:
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e ADCtoBCD _ADCtoBCD fV
; i -> R10
; temp -> R12,R13
.even
_ADCtoBCD::
rcall push_gset4
movw R12,R16
.dbline -1
.dbline 33
; }
; //ADC结果转换成电压值
; void ADCtoBCD(unsigned int temp)
; {
.dbline 35
; unsigned char i;
; temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
movw R2,R12
clr R4
clr R5
ldi R20,244
ldi R21,1
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
rcall empy32u
ldi R20,255
ldi R21,3
ldi R22,0
ldi R23,0
st -y,R23
st -y,R22
st -y,R21
st -y,R20
rcall div32u
movw R12,R16
.dbline 36
; for(i=0;i<4;i++)
clr R10
rjmp L7
L4:
.dbline 37
.dbline 38
ldi R18,10
ldi R19,0
movw R16,R12
rcall mod16u
movw R30,R16
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
lpm R30,Z
ldi R24,<_led_buff
ldi R25,>_led_buff
mov R26,R10
clr R27
add R26,R24
adc R27,R25
st x,R30
.dbline 39
ldi R18,10
ldi R19,0
movw R16,R12
rcall div16u
movw R12,R16
.dbline 40
L5:
.dbline 36
inc R10
L7:
.dbline 36
mov R24,R10
cpi R24,4
brlo L4
.dbline 41
; {
; led_buff[i]=seg_table[temp%10];
; temp=temp/10;
; }
; led_buff[2]&=0x7f;
lds R24,_led_buff+2
andi R24,127
sts _led_buff+2,R24
.dbline -2
L3:
rcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r i 10 c
.dbsym r temp 12 i
.dbend
.dbfunc e main _main fV
; adc_old -> R22,R23
; i -> R20
.even
_main::
.dbline -1
.dbline 45
; }
; //MAIN程序
; void main(void)
; {
.dbline 48
; unsigned char i;
; unsigned int adc_old;
; DDRD=0xf0;
ldi R24,240
out 0xa,R24
.dbline 49
; PORTD=0xff;
ldi R24,255
out 0xb,R24
.dbline 50
; OSCCAL=osccal;//校正振荡频率
ldi R24,154
sts 102,R24
.dbline 51
; adc_mux=0;
clr R2
sts _adc_mux,R2
.dbline 52
; adc_init();
rcall _adc_init
.dbline 53
; SEI();//使能全局中断
sei
.dbline 55
;
; for(i=0;i<4;i++)
clr R20
rjmp L13
L10:
.dbline 56
.dbline 57
ldi R24,<_led_buff
ldi R25,>_led_buff
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldi R26,<_seg_table+8
ldi R27,>_seg_table+8
st -y,R31
st -y,R30
movw R30,R26
lpm R26,Z
ld R30,y+
ld R31,y+
std z+0,R26
.dbline 58
L11:
.dbline 55
inc R20
L13:
.dbline 55
cpi R20,4
brlo L10
.dbline 59
; {
; led_buff[i]=seg_table[8];
; }
; for(i=0;i<100;i++)
clr R20
rjmp L18
L15:
.dbline 60
rcall _display
L16:
.dbline 59
inc R20
L18:
.dbline 59
cpi R20,100
brlo L15
.dbline 62
; display();
;
; adc_old=0;
clr R22
clr R23
.dbline 63
; adc_rel=0;
clr R2
clr R3
sts _adc_rel+1,R3
sts _adc_rel,R2
rjmp L20
L19:
.dbline 65
; while(1)
; {
.dbline 66
; if(adc_old!=adc_rel)
lds R2,_adc_rel
lds R3,_adc_rel+1
cp R22,R2
cpc R23,R3
breq L22
.dbline 67
; {
.dbline 68
; adc_old=adc_rel;
movw R22,R2
.dbline 69
; ADCtoBCD(adc_old);
movw R16,R2
rcall _ADCtoBCD
.dbline 70
; }
L22:
.dbline 71
; display();
rcall _display
.dbline 73
;
; i=PIND&0x0c;//判断按键
in R20,0x9
andi R20,12
.dbline 74
; if(i!=0x0c)
cpi R20,12
brne X1
rjmp L24
X1:
.dbline 75
; {
.dbline 76
; display();//按键消抖
rcall _display
.dbline 77
; if(i==(PIND&0x0c))
in R24,0x9
andi R24,12
cp R20,R24
breq X2
rjmp L26
X2:
.dbline 78
; {
.dbline 79
; CLI();
cli
.dbline 80
; adc_rel=0;
clr R2
clr R3
sts _adc_rel+1,R3
sts _adc_rel,R2
.dbline 81
; adc_old=0;
clr R22
clr R23
.dbline 82
; if (i==0x08)//INT0键按下
cpi R20,8
brne L28
.dbline 83
; {
.dbline 84
; if(adc_mux<3)
lds R24,_adc_mux
cpi R24,3
brsh L30
.dbline 85
; adc_mux++;//递增
subi R24,255 ; addi 1
sts _adc_mux,R24
rjmp L31
L30:
.dbline 87
; else
; adc_mux=0;
clr R2
sts _adc_mux,R2
L31:
.dbline 88
; }
L28:
.dbline 89
; if (i==0x04)//INT1键按下
cpi R20,4
brne L32
.dbline 90
; {
.dbline 91
; if(adc_mux>0)
clr R2
lds R3,_adc_mux
cp R2,R3
brsh L34
.dbline 92
; adc_mux--;//递减
mov R24,R3
subi R24,1
sts _adc_mux,R24
rjmp L35
L34:
.dbline 94
; else
; adc_mux=3;
ldi R24,3
sts _adc_mux,R24
L35:
.dbline 95
; }
L32:
.dbline 96
; led_buff[0]=seg_table[adc_mux];
ldi R24,<_seg_table
ldi R25,>_seg_table
lds R30,_adc_mux
clr R31
add R30,R24
adc R31,R25
lpm R30,Z
sts _led_buff,R30
.dbline 97
; led_buff[1]=0xbf;//-
ldi R24,191
sts _led_buff+1,R24
.dbline 98
; led_buff[2]=0b10001001;//h
ldi R24,137
sts _led_buff+2,R24
.dbline 99
; led_buff[3]=0b11000110;//C
ldi R24,198
sts _led_buff+3,R24
rjmp L40
L39:
.dbline 101
rcall _display
L40:
.dbline 100
; while((PIND&0x0c)!=0x0c)//检查按键释放
in R24,0x9
andi R24,12
cpi R24,12
brne L39
.dbline 102
; display();
; SEI();
sei
.dbline 103
; }
L26:
.dbline 104
; }
L24:
.dbline 107
L20:
.dbline 64
rjmp L19
X0:
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbsym r adc_old 22 i
.dbsym r i 20 c
.dbend
.area bss(ram, con, rel)
.dbfile C:\调试程序\mega48\ADC\ADC.c
_adc_mux::
.blkb 1
.dbsym e adc_mux _adc_mux c
_adc_rel::
.blkb 2
.dbsym e adc_rel _adc_rel i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -