📄 ad.s
字号:
.module AD.C
.area text(rom, con, rel)
.dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 22
; // **************************************************************
; // *** 广 州 天 河 双 龙 电 子 公 司 ***
; // *** http://www.sl.com.cn ***
; // *** 实验:ADC转换 ***
; // *** 作者:zxy@sl.com.cn ***
; // *** 2006年3月28日 ***
; // *** 目标MCU:MEGA169 晶振:内部(INT)8MHZ ***
; // **************************************************************
; //用跳线短接J3的ADC2,调节可变电阻R7,LED显示将发生变化
; #include <iom169v.h>
; #include <macros.h>
; #define Vref 3212//参考电压值,注意不同环境下的Vref不相同
;
; 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转换结果
;
; //ADC初始化
; void adc_init(void)
; {
.dbline 23
; ADCSRA = 0x00; //设置前,先关闭ADC
clr R2
sts 122,R2
.dbline 24
; ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC1
ldi R24,65
sts 124,R24
.dbline 25
; ACSR =(1<<ACD);//关闭模拟比较器,禁止位P148
ldi R24,128
out 0x30,R24
.dbline 26
; ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//ADC时钟64分频
ldi R24,207
sts 122,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 76
jmp _adc_isr
.area text(rom, con, rel)
.dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.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 34
; }
;
; //ADC完成中断
; #pragma interrupt_handler adc_isr:20
; //AD 中断
;
; void adc_isr(void)
; {
.dbline 36
;
; adc_rel = ADC&0x3ff;
lds R24,120
lds R25,120+1
andi R25,3
sts _adc_rel+1,R25
sts _adc_rel,R24
.dbline 38
; //ADMUX =(1<<REFS0)|(1<<MUX0);
; ADCSRA|=(1<<ADSC);//启动AD转换
lds R24,122
ori R24,64
sts 122,R24
.dbline -2
L2:
.dbline 0 ; func end
ld R24,y+
out 0x3f,R24
ld R25,y+
ld R24,y+
reti
.dbend
.dbfunc e ADCtoBCD _ADCtoBCD fV
; i -> R12
; temp -> R10,R11
.even
_ADCtoBCD::
xcall push_xgsetF03C
movw R10,R16
.dbline -1
.dbline 43
; }
;
; //ADC结果转换成电压值
; void ADCtoBCD(unsigned int temp)
; {
.dbline 45
; unsigned char i;
; temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/1024);//ADC结果转换成电压值
movw R2,R10
clr R4
clr R5
ldi R20,140
ldi R21,12
ldi R22,0
ldi R23,0
st -y,R5
st -y,R4
st -y,R3
st -y,R2
movw R16,R20
movw R18,R22
xcall empy32u
ldi R24,10
ldi R25,0
st -y,R24
xcall lsr32
movw R10,R16
.dbline 46
; for(i=0;i<4;i++)
clr R12
xjmp L7
L4:
.dbline 47
; {
.dbline 48
; led_buff[i]=seg_table[temp%10];//结果存入显示缓存
ldi R18,10
ldi R19,0
movw R16,R10
xcall mod16u
movw R30,R16
ldi R24,<_seg_table
ldi R25,>_seg_table
add R30,R24
adc R31,R25
lpm R2,Z
ldi R24,<_led_buff
ldi R25,>_led_buff
mov R30,R12
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 49
; temp=temp/10;
ldi R18,10
ldi R19,0
movw R16,R10
xcall div16u
movw R10,R16
.dbline 50
; }
L5:
.dbline 46
inc R12
L7:
.dbline 46
mov R24,R12
cpi R24,4
brlo L4
X0:
.dbline 51
; led_buff[3]&=0x7f;
lds R24,_led_buff+3
andi R24,127
sts _led_buff+3,R24
.dbline -2
L3:
.dbline 0 ; func end
xjmp pop_xgsetF03C
.dbsym r i 12 c
.dbsym r temp 10 i
.dbend
.dbfunc e main _main fV
; adc_old -> R10,R11
.even
_main::
.dbline -1
.dbline 55
; }
;
; void main(void)
; {
.dbline 57
; unsigned int adc_old;
; adc_init();//AD初始化
xcall _adc_init
.dbline 59
;
; DDRE=0xff;//E口初始化
ldi R24,255
out 0xd,R24
.dbline 60
; PORTE=0xff;//E口初始化
out 0xe,R24
.dbline 61
; DDRB|=0xf0;//B口初始化
in R24,0x4
ori R24,240
out 0x4,R24
.dbline 62
; PORTB|=0xf0;//B口初始化
in R24,0x5
ori R24,240
out 0x5,R24
.dbline 63
; SEI();//使能全局中断
sei
xjmp L11
L10:
.dbline 65
; while(1)
; {
.dbline 66
; if(adc_old!=adc_rel)
lds R2,_adc_rel
lds R3,_adc_rel+1
cp R10,R2
cpc R11,R3
breq L13
X1:
.dbline 67
; {
.dbline 68
; adc_old=adc_rel; //AD转换结果
movw R10,R2
.dbline 69
; ADCtoBCD(adc_old);//进制转换
movw R16,R2
xcall _ADCtoBCD
.dbline 70
; }
L13:
.dbline 71
; display(); //显示函数
xcall _display
.dbline 73
;
; }
L11:
.dbline 64
xjmp L10
X2:
.dbline -2
L9:
.dbline 0 ; func end
ret
.dbsym r adc_old 10 i
.dbend
.area bss(ram, con, rel)
.dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
_adc_rel::
.blkb 2
.dbsym e adc_rel _adc_rel i
; }
;
;
;
;
;
;
;
;
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -