📄 dac.s
字号:
.module dac.c
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 14
; //使用内部RC振荡,PB6-G,PB7-DP短路块连接
; //使用INT0/INT1按键改变DAC输出电压大小
; //可以使用ADC0通道测量DAC的输出电压
; //演示了使用PC机对MEGA8开发板进行控制的方法
; #include <iom48v.h>
; #include <macros.h>
; #define osccal 0x9A//内部RC校正常数
; #define Vref 500//参考电压值
; #include"uart.h"
; #include"adc.h"
; unsigned int adc_old;
; //T1初始化程序
; void timer1_init(void)
; {
.dbline 15
; TCCR1B = 0; //stop
clr R2
sts 129,R2
.dbline 16
; TCNT1H = 0;
sts 133,R2
.dbline 17
; OCR1A=0;
clr R3
sts 136+1,R3
sts 136,R2
.dbline 18
; TCCR1A =(1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
ldi R24,131
sts 128,R24
.dbline 19
; TCCR1B =(1<<CS10);//(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0x1A //start Timer
ldi R24,1
sts 129,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 2
rjmp _int_isr
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
.area vector(rom, abs)
.org 4
rjmp _int_isr
.area text(rom, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
.dbfunc e int_isr _int_isr fV
; i -> R20
.even
_int_isr::
rcall push_lset
rcall push_gset1
.dbline -1
.dbline 24
; }
; //两个中断向量使用同一个中断处理函数,实现对INT0/INT1按键的处理
; #pragma interrupt_handler int_isr:2 int_isr:3
; void int_isr(void)
; {
.dbline 26
; unsigned char i;
; delay_ms(10);
ldi R16,10
ldi R17,0
rcall _delay_ms
.dbline 27
; i=PIND&0x0c;//键盘消抖动
in R20,0x9
andi R20,12
.dbline 28
; if(i==0x0c)
cpi R20,12
brne L3
.dbline 29
; return;
rjmp L2
L3:
.dbline 31
; else
; {
.dbline 32
; if (i==0x08)//INT0键按下
cpi R20,8
brne L5
.dbline 33
; {
.dbline 34
; if(OCR1A<0x3ef)
lds R24,136
lds R25,136+1
cpi R24,239
ldi R30,3
cpc R25,R30
brsh L7
.dbline 35
; OCR1A+=0x10;//递增
lds R24,136
lds R25,136+1
adiw R24,16
sts 136+1,R25
sts 136,R24
rjmp L8
L7:
.dbline 37
; else
; OCR1A=0x3ff;
ldi R24,1023
ldi R25,3
sts 136+1,R25
sts 136,R24
L8:
.dbline 38
; }
L5:
.dbline 39
; if (i==0x04)//INT1键按下
cpi R20,4
brne L14
.dbline 40
; {
.dbline 41
; if(OCR1A>0x10)
ldi R24,16
ldi R25,0
lds R2,136
lds R3,136+1
cp R24,R2
cpc R25,R3
brsh L11
.dbline 42
; OCR1A-=0x10;//递减
lds R24,136
lds R25,136+1
sbiw R24,16
sts 136+1,R25
sts 136,R24
rjmp L14
L11:
.dbline 44
; else
; OCR1A=0;
clr R2
clr R3
sts 136+1,R3
sts 136,R2
.dbline 45
; }
L13:
.dbline 47
L14:
.dbline 46
; while((PIND&0x0c)!=0x0c)//检查按键释放
in R24,0x9
andi R24,12
cpi R24,12
brne L13
.dbline 48
; ;
; }
.dbline -2
L2:
rcall pop_gset1
rcall pop_lset
.dbline 0 ; func end
reti
.dbsym r i 20 c
.dbend
.dbfunc e main _main fV
; temp -> R22,R23
; i -> R10
.even
_main::
.dbline -1
.dbline 52
; }
; //MAIN程序
; void main(void)
; {
.dbline 55
; unsigned char i;
; unsigned int temp;
; DDRB=(1<<PB1); //置输出比较oc1a为高电平
ldi R24,2
out 0x4,R24
.dbline 56
; DDRD=0xf0;
ldi R24,240
out 0xa,R24
.dbline 57
; PORTD=0xff;
ldi R24,255
out 0xb,R24
.dbline 58
; OSCCAL=osccal;
ldi R24,154
sts 102,R24
.dbline 59
; adc_mux=0;
clr R2
sts _adc_mux,R2
.dbline 60
; uart_init();
rcall _uart_init
.dbline 61
; timer1_init();
rcall _timer1_init
.dbline 62
; adc_init();
rcall _adc_init
.dbline 64
; //GICR = 0xC0;//int0,int1中断使能
; SEI();
sei
.dbline 65
; EIMSK=3;
ldi R24,3
out 0x1d,R24
.dbline 67
; // EICRA=0;
; adc_rel=0;
clr R2
clr R3
sts _adc_rel+1,R3
sts _adc_rel,R2
.dbline 68
; puts("广州天河双龙电子公司");
ldi R16,<L17
ldi R17,>L17
rcall _puts
.dbline 69
; puts("HTTP://WWW.SL.COM.CN");
ldi R16,<L18
ldi R17,>L18
rcall _puts
.dbline 70
; puts("MEGA48开发板DAC测试程序");
ldi R16,<L19
ldi R17,>L19
rcall _puts
rjmp L21
L20:
.dbline 73
;
; while(1)
; {
.dbline 74
; i=getchar();
rcall _getchar
mov R10,R16
.dbline 75
; switch (i)
mov R20,R10
clr R21
cpi R20,77
ldi R30,0
cpc R21,R30
brne X2
rjmp L32
X2:
cpi R20,79
ldi R30,0
cpc R21,R30
breq L31
cpi R20,82
ldi R30,0
cpc R21,R30
brne X3
rjmp L33
X3:
cpi R20,83
ldi R30,0
cpc R21,R30
breq L26
cpi R20,84
ldi R30,0
cpc R21,R30
breq L28
rjmp L23
X0:
.dbline 76
; {
L26:
.dbline 78
; case 'S'://MEGA8 DAC程序ID
; {
.dbline 79
; puts("DAC TEST ver1.0");
ldi R16,<L27
ldi R17,>L27
rcall _puts
.dbline 80
; break;
rjmp L24
L28:
.dbline 83
; }
; case 'T'://调节输出电压
; {
.dbline 84
; temp=getchar();
rcall _getchar
mov R22,R16
clr R23
.dbline 85
; temp=temp<<8;
mov R23,R22
clr R22
.dbline 86
; temp|=getchar();
rcall _getchar
mov R2,R16
clr R3
or R22,R2
or R23,R3
.dbline 87
; if (temp<0x400)
cpi R22,0
ldi R30,4
cpc R23,R30
brsh L29
.dbline 88
; OCR1A=temp;
sts 136+1,R23
sts 136,R22
rjmp L24
L29:
.dbline 90
; else
; OCR1A=0x3ff;
ldi R24,1023
ldi R25,3
sts 136+1,R25
sts 136,R24
.dbline 91
; break;
rjmp L24
L31:
.dbline 94
; }
; case 'O'://读取OCR1A寄存器值
; {
.dbline 95
; temp=OCR1A;
lds R22,136
lds R23,136+1
.dbline 96
; putchar(temp/256);
movw R16,R22
mov R16,R17
clr R17
rcall _putchar
.dbline 97
; putchar(temp%256);
mov R16,R22
andi R17,0
rcall _putchar
.dbline 98
; break;
rjmp L24
L32:
.dbline 101
; }
; case 'M'://设置ADC工作通道
; {
.dbline 102
; adc_mux=getchar()&0x03;
rcall _getchar
mov R24,R16
andi R24,3
sts _adc_mux,R24
.dbline 103
; break;
rjmp L24
L33:
.dbline 106
; }
; case 'R'://读取ADC通道及ADC转换结果
; {
.dbline 107
; putchar(adc_mux);
lds R16,_adc_mux
rcall _putchar
.dbline 108
; putchar(adc_old/256);
lds R16,_adc_old
lds R17,_adc_old+1
mov R16,R17
clr R17
rcall _putchar
.dbline 109
; putchar(adc_old%256);
lds R16,_adc_old
andi R17,0
rcall _putchar
.dbline 110
; }
.dbline 111
; }
L23:
L24:
.dbline 112
L21:
.dbline 72
rjmp L20
X1:
.dbline -2
L16:
.dbline 0 ; func end
ret
.dbsym r temp 22 i
.dbsym r i 10 c
.dbend
.area bss(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
_adc_old::
.blkb 2
.dbsym e adc_old _adc_old i
.area data(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
L27:
.blkb 16
.area idata
.byte 'D,'A,'C,32,'T,'E,'S,'T,32,'v,'e,'r,49,46,48,0
.area data(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
L19:
.blkb 24
.area idata
.byte 'M,'E,'G,'A,52,56,191,170,183,162,176,229,'D,'A,'C,178
.byte 226,202,212,179,204,208,242,0
.area data(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
L18:
.blkb 21
.area idata
.byte 'H,'T,'T,'P,58,47,47,'W,'W,'W,46,'S,'L,46,'C,'O
.byte 'M,46,'C,'N,0
.area data(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
L17:
.blkb 21
.area idata
.byte 185,227,214,221,204,236,186,211,203,171,193,250,181,231,215,211
.byte 185,171,203,190,0
.area data(ram, con, rel)
.dbfile C:\调试程序\mega48\DAC\dac.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -