📄 dac.lst
字号:
__text_start:
__start:
001B E5CF LDI R28,0x5F
001C E0D4 LDI R29,4
001D BFCD OUT 0x3D,R28
001E BFDE OUT 0x3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD Y+0,R16
0023 2400 CLR R0
0024 E7E0 LDI R30,0x70
0025 E0F0 LDI R31,0
0026 E010 LDI R17,0
0027 37E7 CPI R30,0x77
0028 07F1 CPC R31,R17
0029 F011 BEQ 0x002C
002A 9201 ST R0,Z+
002B CFFB RJMP 0x0027
002C 8300 STD Z+0,R16
002D E2E6 LDI R30,0x26
002E E0F0 LDI R31,0
002F E6A0 LDI R26,0x60
0030 E0B0 LDI R27,0
0031 E010 LDI R17,0
0032 33E6 CPI R30,0x36
0033 07F1 CPC R31,R17
0034 F021 BEQ 0x0039
0035 95C8 LPM
0036 9631 ADIW R30,1
0037 920D ST R0,X+
0038 CFF9 RJMP 0x0032
0039 D042 RCALL _main
_exit:
003A CFFF RJMP _exit
FILE: E:\icc\iccavr\mega8\mega8\DAC\DAC.c
(0001) /*******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* 用PWM实现的DAC转换演示程序 */
(0005) /* 外部中断演示程序 */
(0006) /* 作者:ntzwq@wx88.net */
(0007) /* 2002年5月11日 */
(0008) /* 目标MCU:MEGA8 晶振:内部RC(INT) 8MHZ */
(0009) /*******************************************/
(0010) //使用内部RC振荡,PB6-G,PB7-DP短路块连接
(0011) //使用INT0/INT1按键改变DAC输出电压大小
(0012) //可以使用ADC0通道测量DAC的输出电压
(0013) //演示了使用PC机对MEGA8开发板进行控制的方法
(0014) #include <iom8v.h>
(0015) #include <macros.h>
(0016) #define Vref 500//参考电压值
(0017) #include"uart.h"
(0018) #include"adc.h"
(0019) #define osc_address 0x1ff0
(0020) extern unsigned char read_flash(unsigned int add);
(0021) unsigned int adc_old;
(0022) //T1初始化程序
(0023) void timer1_init(void)
(0024) {
(0025) TCCR1B = 0; //stop
_timer1_init:
003B 2422 CLR R2
003C BC2E OUT 0x2E,R2
(0026) TCNT1H = 0;
003D BC2D OUT 0x2D,R2
(0027) OCR1A=0;
003E 2433 CLR R3
003F BC3B OUT 0x2B,R3
0040 BC2A OUT 0x2A,R2
(0028) TCCR1A =(1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
0041 E883 LDI R24,0x83
0042 BD8F OUT 0x2F,R24
(0029) TCCR1B =(1<<CS10);//(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0x1A //start Timer
0043 E081 LDI R24,1
0044 BD8E OUT 0x2E,R24
(0030) }
0045 9508 RET
_int_isr:
i --> R20
0046 D151 RCALL push_lset
0047 D139 RCALL push_gset1
(0031) //两个中断向量使用同一个中断处理函数,实现对INT0/INT1按键的处理
(0032) #pragma interrupt_handler int_isr:iv_INT0 int_isr:iv_INT1
(0033) void int_isr(void)
(0034) {
(0035) unsigned char i;
(0036) delay_ms(10);
0048 E00A LDI R16,0xA
0049 E010 LDI R17,0
004A D0C9 RCALL _delay_ms
(0037) i=PIND&0x0c;//键盘消抖动
004B B340 IN R20,0x10
004C 704C ANDI R20,0xC
(0038) if(i==0x0c)
004D 304C CPI R20,0xC
004E F409 BNE 0x0050
(0039) return;
004F C029 RJMP 0x0079
(0040) else
(0041) {
(0042) if (i==0x08)//INT0键按下
0050 3048 CPI R20,0x8
0051 F481 BNE 0x0062
(0043) {
(0044) if(OCR1A<0x3ef)
0052 B58A IN R24,0x2A
0053 B59B IN R25,0x2B
0054 3E8F CPI R24,0xEF
0055 E0E3 LDI R30,3
0056 079E CPC R25,R30
0057 F430 BCC 0x005E
(0045) OCR1A+=0x10;//递增
0058 B58A IN R24,0x2A
0059 B59B IN R25,0x2B
005A 9640 ADIW R24,0x10
005B BD9B OUT 0x2B,R25
005C BD8A OUT 0x2A,R24
005D C004 RJMP 0x0062
(0046) else
(0047) OCR1A=0x3ff;
005E EF8F LDI R24,0xFF
005F E093 LDI R25,3
0060 BD9B OUT 0x2B,R25
0061 BD8A OUT 0x2A,R24
(0048) }
(0049) if (i==0x04)//INT1键按下
0062 3044 CPI R20,4
0063 F489 BNE 0x0075
(0050) {
(0051) if(OCR1A>0x10)
0064 E180 LDI R24,0x10
0065 E090 LDI R25,0
0066 B42A IN R2,0x2A
0067 B43B IN R3,0x2B
0068 1582 CP R24,R2
0069 0593 CPC R25,R3
006A F430 BCC 0x0071
(0052) OCR1A-=0x10;//递减
006B B58A IN R24,0x2A
006C B59B IN R25,0x2B
006D 9740 SBIW R24,0x10
006E BD9B OUT 0x2B,R25
006F BD8A OUT 0x2A,R24
0070 C004 RJMP 0x0075
(0053) else
(0054) OCR1A=0;
0071 2422 CLR R2
0072 2433 CLR R3
0073 BC3B OUT 0x2B,R3
0074 BC2A OUT 0x2A,R2
(0055) }
(0056) while((PIND&0x0c)!=0x0c)//检查按键释放
0075 B380 IN R24,0x10
0076 708C ANDI R24,0xC
0077 308C CPI R24,0xC
0078 F7E1 BNE 0x0075
(0057) ;
(0058) }
(0059) }
0079 D10A RCALL pop_gset1
007A D134 RCALL pop_lset
007B 9518 RETI
(0060) //MAIN程序
(0061) void main(void)
(0062) {
(0063) unsigned char i;
(0064) unsigned int temp;
(0065) DDRB=(1<<PB1);
_main:
temp --> R22
i --> R10
007C E082 LDI R24,2
007D BB87 OUT 0x17,R24
(0066) DDRD=0xf0;
007E EF80 LDI R24,0xF0
007F BB81 OUT 0x11,R24
(0067) PORTD=0xff;
0080 EF8F LDI R24,0xFF
0081 BB82 OUT 0x12,R24
(0068) OSCCAL=read_flash(osc_address);
0082 EF00 LDI R16,0xF0
0083 E11F LDI R17,0x1F
0084 D0F7 RCALL _read_flash
0085 BF01 OUT 0x31,R16
(0069) adc_mux=0;
0086 2422 CLR R2
0087 92200074 STS _adc_mux,R2
(0070) uart_init();
0089 D079 RCALL _uart_init
(0071) timer1_init();
008A DFB0 RCALL _timer1_init
(0072) adc_init();
008B D095 RCALL _adc_init
(0073) GICR = 0xC0;//int0,int1中断使能
008C EC80 LDI R24,0xC0
008D BF8B OUT 0x3B,R24
(0074) SEI();
008E 9478 BSET 7
(0075) adc_rel=0;
008F 2422 CLR R2
0090 2433 CLR R3
0091 92300076 STS _adc_rel+1,R3
0093 92200075 STS _adc_rel,R2
0095 C051 RJMP 0x00E7
(0076) //puts("广州天河双龙电子公司");
(0077) //puts("HTTP://WWW.SL.COM.CN");
(0078) //puts("MEGA8开发板DAC测试程序");
(0079) while(1)
(0080) {
(0081) i=getchar();
0096 D056 RCALL _getchar
0097 2EA0 MOV R10,R16
(0082) switch (i)
0098 2D4A MOV R20,R10
0099 2755 CLR R21
009A 344D CPI R20,0x4D
009B E0E0 LDI R30,0
009C 075E CPC R21,R30
009D F1A9 BEQ 0x00D3
009E 344F CPI R20,0x4F
009F E0E0 LDI R30,0
00A0 075E CPC R21,R30
00A1 F139 BEQ 0x00C9
00A2 3542 CPI R20,0x52
00A3 E0E0 LDI R30,0
00A4 075E CPC R21,R30
00A5 F199 BEQ 0x00D9
00A6 3543 CPI R20,0x53
00A7 E0E0 LDI R30,0
00A8 075E CPC R21,R30
00A9 F029 BEQ 0x00AF
00AA 3544 CPI R20,0x54
00AB E0E0 LDI R30,0
00AC 075E CPC R21,R30
00AD F029 BEQ 0x00B3
00AE C038 RJMP 0x00E7
(0083) {
(0084) case 'S'://MEGA8 DAC程序ID
(0085) {
(0086) puts("DAC TEST ver1.0");
00AF E600 LDI R16,0x60
00B0 E010 LDI R17,0
00B1 D03F RCALL _puts
(0087) break;
00B2 C034 RJMP 0x00E7
(0088) }
(0089) case 'T'://调节输出电压
(0090) {
(0091) temp=getchar();
00B3 D039 RCALL _getchar
00B4 2F60 MOV R22,R16
00B5 2777 CLR R23
(0092) temp=temp<<8;
00B6 2F76 MOV R23,R22
00B7 2766 CLR R22
(0093) temp|=getchar();
00B8 D034 RCALL _getchar
00B9 2E20 MOV R2,R16
00BA 2433 CLR R3
00BB 2962 OR R22,R2
00BC 2973 OR R23,R3
(0094) if (temp<0x400)
00BD 3060 CPI R22,0
00BE E0E4 LDI R30,4
00BF 077E CPC R23,R30
00C0 F418 BCC 0x00C4
(0095) OCR1A=temp;
00C1 BD7B OUT 0x2B,R23
00C2 BD6A OUT 0x2A,R22
00C3 C023 RJMP 0x00E7
(0096) else
(0097) OCR1A=0x3ff;
00C4 EF8F LDI R24,0xFF
00C5 E093 LDI R25,3
00C6 BD9B OUT 0x2B,R25
00C7 BD8A OUT 0x2A,R24
(0098) break;
00C8 C01E RJMP 0x00E7
(0099) }
(0100) case 'O'://读取OCR1A寄存器值
(0101) {
(0102) temp=OCR1A;
00C9 B56A IN R22,0x2A
00CA B57B IN R23,0x2B
(0103) putchar(temp/256);
00CB 018B MOVW R16,R22
00CC 2F01 MOV R16,R17
00CD 2711 CLR R17
00CE D01A RCALL _putchar
(0104) putchar(temp%256);
00CF 2F06 MOV R16,R22
00D0 7010 ANDI R17,0
00D1 D017 RCALL _putchar
(0105) break;
00D2 C014 RJMP 0x00E7
(0106) }
(0107) case 'M'://设置ADC工作通道
(0108) {
(0109) adc_mux=getchar()&0x03;
00D3 D019 RCALL _getchar
00D4 2F80 MOV R24,R16
00D5 7083 ANDI R24,3
00D6 93800074 STS _adc_mux,R24
(0110) break;
00D8 C00E RJMP 0x00E7
(0111) }
(0112) case 'R'://读取ADC通道及ADC转换结果
(0113) {
(0114) putchar(adc_mux);
00D9 91000074 LDS R16,_adc_mux
00DB D00D RCALL _putchar
(0115) putchar(adc_old/256);
00DC 91000070 LDS R16,_adc_old
00DE 91100071 LDS R17,_adc_old+1
00E0 2F01 MOV R16,R17
00E1 2711 CLR R17
00E2 D006 RCALL _putchar
(0116) putchar(adc_old%256);
00E3 91000070 LDS R16,_adc_old
00E5 7010 ANDI R17,0
00E6 D002 RCALL _putchar
00E7 CFAE RJMP 0x0096
(0117) }
(0118) }
(0119) }
(0120) }
00E8 9508 RET
FILE: E:\icc\iccavr\mega8\mega8\DAC\uart.c
(0001) /******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* RS232通信驱动程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月11日 */
(0007) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -