📄 dac.lis
字号:
.module DAC.c
.area text(rom, con, rel)
0000 .dbfile C:\mega8\DAC\DAC.c
0000 .dbfunc e timer1_init _timer1_init fV
.even
0000 _timer1_init::
0000 .dbline -1
0000 .dbline 23
0000 ; /*******************************************/
0000 ; /* 广州天河双龙电子公司 */
0000 ; /* http://www.sl.com.cn */
0000 ; /* 用PWM实现的DAC转换演示程序 */
0000 ; /* 外部中断演示程序 */
0000 ; /* 作者:ntzwq@wx88.net */
0000 ; /* 2002年5月11日 */
0000 ; /* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ */
0000 ; /*******************************************/
0000 ; //使用内部RC振荡,PB6-G,PB7-DP短路块连接
0000 ; //使用INT0/INT1按键改变DAC输出电压大小
0000 ; //可以使用ADC0通道测量DAC的输出电压
0000 ; //演示了使用PC机对MEGA8开发板进行控制的方法
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #define Vref 500//参考电压值
0000 ; #include"uart.h"
0000 ; #include"adc.h"
0000 ; extern unsigned char read_flash(unsigned int add);
0000 ; unsigned int adc_old;
0000 ; //T1初始化程序
0000 ; void timer1_init(void)
0000 ; {
0000 .dbline 24
0000 ; TCCR1B = 0; //stop
0000 2224 clr R2
0002 2EBC out 0x2e,R2
0004 .dbline 25
0004 ; TCNT1H = 0;
0004 2DBC out 0x2d,R2
0006 .dbline 26
0006 ; OCR1A=0;
0006 3324 clr R3
0008 30924B00 sts 74+1,R3
000C 20924A00 sts 74,R2
0010 .dbline 27
0010 ; TCCR1A =(1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
0010 83E8 ldi R24,131
0012 8FBD out 0x2f,R24
0014 .dbline 28
0014 ; TCCR1B =(1<<CS10);//(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0x1A //start Timer
0014 81E0 ldi R24,1
0016 8EBD out 0x2e,R24
0018 .dbline -2
0018 .dbline 29
0018 ; }
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbend
.area vector(rom, abs)
.org 2
0002 0DC0 rjmp _int_isr
.area text(rom, con, rel)
001A .dbfile C:\mega8\DAC\DAC.c
.area vector(rom, abs)
.org 4
0004 0DC0 rjmp _int_isr
.area text(rom, con, rel)
001A .dbfile C:\mega8\DAC\DAC.c
001A .dbfunc e int_isr _int_isr fV
001A ; i -> R20
.even
001A _int_isr::
001A 00D0 rcall push_lset
001C 00D0 rcall push_gset1
001E .dbline -1
001E .dbline 33
001E ; //两个中断向量使用同一个中断处理函数,实现对INT0/INT1按键的处理
001E ; #pragma interrupt_handler int_isr:iv_INT0 int_isr:iv_INT1
001E ; void int_isr(void)
001E ; {
001E .dbline 35
001E ; unsigned char i;
001E ; delay_ms(10);
001E 0AE0 ldi R16,10
0020 10E0 ldi R17,0
0022 00D0 rcall _delay_ms
0024 .dbline 36
0024 ; i=PIND&0x0c;//键盘消抖动
0024 40B3 in R20,0x10
0026 4C70 andi R20,12
0028 .dbline 37
0028 ; if(i==0x0c)
0028 4C30 cpi R20,12
002A 09F4 brne L3
002C .dbline 38
002C ; return;
002C 31C0 rjmp L2
002E L3:
002E .dbline 40
002E ; else
002E ; {
002E .dbline 41
002E ; if (i==0x08)//INT0键按下
002E 4830 cpi R20,8
0030 A1F4 brne L5
0032 .dbline 42
0032 ; {
0032 .dbline 43
0032 ; if(OCR1A<0x3ef)
0032 8AB5 in R24,0x2a
0034 9BB5 in R25,0x2b
0036 8F3E cpi R24,239
0038 E3E0 ldi R30,3
003A 9E07 cpc R25,R30
003C 40F4 brsh L7
003E .dbline 44
003E ; OCR1A+=0x10;//递增
003E 8AB5 in R24,0x2a
0040 9BB5 in R25,0x2b
0042 4096 adiw R24,16
0044 90934B00 sts 74+1,R25
0048 80934A00 sts 74,R24
004C 06C0 rjmp L8
004E L7:
004E .dbline 46
004E ; else
004E ; OCR1A=0x3ff;
004E 8FEF ldi R24,1023
0050 93E0 ldi R25,3
0052 90934B00 sts 74+1,R25
0056 80934A00 sts 74,R24
005A L8:
005A .dbline 47
005A ; }
005A L5:
005A .dbline 48
005A ; if (i==0x04)//INT1键按下
005A 4430 cpi R20,4
005C A9F4 brne L14
005E .dbline 49
005E ; {
005E .dbline 50
005E ; if(OCR1A>0x10)
005E 80E1 ldi R24,16
0060 90E0 ldi R25,0
0062 2AB4 in R2,0x2a
0064 3BB4 in R3,0x2b
0066 8215 cp R24,R2
0068 9305 cpc R25,R3
006A 40F4 brsh L11
006C .dbline 51
006C ; OCR1A-=0x10;//递减
006C 8AB5 in R24,0x2a
006E 9BB5 in R25,0x2b
0070 4097 sbiw R24,16
0072 90934B00 sts 74+1,R25
0076 80934A00 sts 74,R24
007A 06C0 rjmp L14
007C L11:
007C .dbline 53
007C ; else
007C ; OCR1A=0;
007C 2224 clr R2
007E 3324 clr R3
0080 30924B00 sts 74+1,R3
0084 20924A00 sts 74,R2
0088 .dbline 54
0088 ; }
0088 L13:
0088 .dbline 56
0088 L14:
0088 .dbline 55
0088 ; while((PIND&0x0c)!=0x0c)//检查按键释放
0088 80B3 in R24,0x10
008A 8C70 andi R24,12
008C 8C30 cpi R24,12
008E E1F7 brne L13
0090 .dbline 57
0090 ; ;
0090 ; }
0090 .dbline -2
0090 .dbline 58
0090 ; }
0090 L2:
0090 00D0 rcall pop_gset1
0092 00D0 rcall pop_lset
0094 .dbline 0 ; func end
0094 1895 reti
0096 .dbsym r i 20 c
0096 .dbend
0096 .dbfunc e main _main fV
0096 ; temp -> R22,R23
0096 ; i -> R10
.even
0096 _main::
0096 .dbline -1
0096 .dbline 61
0096 ; //MAIN程序
0096 ; void main(void)
0096 ; {
0096 .dbline 64
0096 ; unsigned char i;
0096 ; unsigned int temp;
0096 ; DDRB=(1<<PB1);
0096 82E0 ldi R24,2
0098 87BB out 0x17,R24
009A .dbline 65
009A ; DDRD=0xf0;
009A 80EF ldi R24,240
009C 81BB out 0x11,R24
009E .dbline 66
009E ; PORTD=0xff;
009E 8FEF ldi R24,255
00A0 82BB out 0x12,R24
00A2 .dbline 67
00A2 ; OSCCAL=read_flash(0x1f20);
00A2 00E2 ldi R16,7968
00A4 1FE1 ldi R17,31
00A6 00D0 rcall _read_flash
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -