📄 dac.lst
字号:
__text_start:
__start:
001B E5CF LDI R28,0x5F
001C E0D4 LDI R29,4
001D BFCD OUT P3D,R28
001E BFDE OUT P3E,R29
001F 51C0 SUBI R28,0x10
0020 40D0 SBCI R29,0
0021 EA0A LDI R16,0xAA
0022 8308 STD R16,0+Y
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 R16,0+Z
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 D04C RCALL _main
_exit:
003A CFFF RJMP _exit
FILE: C:\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) extern unsigned char read_flash(unsigned int add);
(0020) unsigned int adc_old;
(0021) //T1初始化程序
(0022) void timer1_init(void)
(0023) {
(0024) TCCR1B = 0; //stop
_timer1_init:
003B 2422 CLR R2
003C BC2E OUT P2E,R2
(0025) TCNT1H = 0;
003D BC2D OUT P2D,R2
(0026) OCR1A=0;
003E 2433 CLR R3
003F 9230004B STS R3,0x4B
0041 9220004A STS R2,0x4A
(0027) TCCR1A =(1<<WGM11)|(1<<WGM10)|(1<<COM1A1);
0043 E883 LDI R24,0x83
0044 BD8F OUT P2F,R24
(0028) TCCR1B =(1<<CS10);//(1<<WGM13)|(1<<WGM12)|(1<<CS10); //0x1A //start Timer
0045 E081 LDI R24,1
0046 BD8E OUT P2E,R24
(0029) }
0047 9508 RET
_int_isr:
i --> R20
0048 D148 RCALL push_lset
0049 D175 RCALL push_gset1
(0030) //两个中断向量使用同一个中断处理函数,实现对INT0/INT1按键的处理
(0031) #pragma interrupt_handler int_isr:iv_INT0 int_isr:iv_INT1
(0032) void int_isr(void)
(0033) {
(0034) unsigned char i;
(0035) delay_ms(10);
004A E00A LDI R16,0xA
004B E010 LDI R17,0
004C D0D7 RCALL _delay_ms
(0036) i=PIND&0x0c;//键盘消抖动
004D B340 IN R20,P10
004E 704C ANDI R20,0xC
(0037) if(i==0x0c)
004F 304C CPI R20,0xC
0050 F409 BNE 0x0052
(0038) return;
0051 C031 RJMP 0x0083
(0039) else
(0040) {
(0041) if (i==0x08)//INT0键按下
0052 3048 CPI R20,0x8
0053 F4A1 BNE 0x0068
(0042) {
(0043) if(OCR1A<0x3ef)
0054 B58A IN R24,P2A
0055 B59B IN R25,P2B
0056 3E8F CPI R24,0xEF
0057 E0E3 LDI R30,3
0058 079E CPC R25,R30
0059 F440 BCC 0x0062
(0044) OCR1A+=0x10;//递增
005A B58A IN R24,P2A
005B B59B IN R25,P2B
005C 9640 ADIW R24,0x10
005D 9390004B STS R25,0x4B
005F 9380004A STS R24,0x4A
0061 C006 RJMP 0x0068
(0045) else
(0046) OCR1A=0x3ff;
0062 EF8F LDI R24,0xFF
0063 E093 LDI R25,3
0064 9390004B STS R25,0x4B
0066 9380004A STS R24,0x4A
(0047) }
(0048) if (i==0x04)//INT1键按下
0068 3044 CPI R20,4
0069 F4A9 BNE 0x007F
(0049) {
(0050) if(OCR1A>0x10)
006A E180 LDI R24,0x10
006B E090 LDI R25,0
006C B42A IN R2,P2A
006D B43B IN R3,P2B
006E 1582 CP R24,R2
006F 0593 CPC R25,R3
0070 F440 BCC 0x0079
(0051) OCR1A-=0x10;//递减
0071 B58A IN R24,P2A
0072 B59B IN R25,P2B
0073 9740 SBIW R24,0x10
0074 9390004B STS R25,0x4B
0076 9380004A STS R24,0x4A
0078 C006 RJMP 0x007F
(0052) else
(0053) OCR1A=0;
0079 2422 CLR R2
007A 2433 CLR R3
007B 9230004B STS R3,0x4B
007D 9220004A STS R2,0x4A
(0054) }
(0055) while((PIND&0x0c)!=0x0c)//检查按键释放
007F B380 IN R24,P10
0080 708C ANDI R24,0xC
0081 308C CPI R24,0xC
0082 F7E1 BNE 0x007F
(0056) ;
(0057) }
(0058) }
0083 D13E RCALL pop_gset1
0084 D123 RCALL pop_lset
0085 9518 RETI
(0059) //MAIN程序
(0060) void main(void)
(0061) {
(0062) unsigned char i;
(0063) unsigned int temp;
(0064) DDRB=(1<<PB1);
_main:
temp --> R22
i --> R10
0086 E082 LDI R24,2
0087 BB87 OUT P17,R24
(0065) DDRD=0xf0;
0088 EF80 LDI R24,0xF0
0089 BB81 OUT P11,R24
(0066) PORTD=0xff;
008A EF8F LDI R24,0xFF
008B BB82 OUT P12,R24
(0067) OSCCAL=read_flash(0x1f20);
008C E200 LDI R16,0x20
008D E11F LDI R17,0x1F
008E D0FD RCALL _read_flash
008F BF01 OUT P31,R16
(0068) adc_mux=0;
0090 2422 CLR R2
0091 92200074 STS R2,_adc_mux
(0069) uart_init();
0093 D07F RCALL _uart_init
(0070) timer1_init();
0094 DFA6 RCALL _timer1_init
(0071) adc_init();
0095 D09B RCALL _adc_init
(0072) GICR = 0xC0;//int0,int1中断使能
0096 EC80 LDI R24,0xC0
0097 BF8B OUT P3B,R24
(0073) SEI();
0098 9478 BSET 7
(0074) adc_rel=0;
0099 2422 CLR R2
009A 2433 CLR R3
009B 92300076 STS R3,_adc_rel+1
009D 92200075 STS R2,_adc_rel
009F C057 RJMP 0x00F7
(0075) //puts("广州天河双龙电子公司");
(0076) //puts("HTTP://WWW.SL.COM.CN");
(0077) //puts("MEGA8开发板DAC测试程序");
(0078) while(1)
(0079) {
(0080) i=getchar();
00A0 D05C RCALL _getchar
00A1 2EA0 MOV R10,R16
(0081) switch (i)
00A2 2D4A MOV R20,R10
00A3 2755 CLR R21
00A4 344D CPI R20,0x4D
00A5 E0E0 LDI R30,0
00A6 075E CPC R21,R30
00A7 F409 BNE 0x00A9
00A8 C03A RJMP 0x00E3
00A9 344F CPI R20,0x4F
00AA E0E0 LDI R30,0
00AB 075E CPC R21,R30
00AC F161 BEQ 0x00D9
00AD 3542 CPI R20,0x52
00AE E0E0 LDI R30,0
00AF 075E CPC R21,R30
00B0 F409 BNE 0x00B2
00B1 C037 RJMP 0x00E9
00B2 3543 CPI R20,0x53
00B3 E0E0 LDI R30,0
00B4 075E CPC R21,R30
00B5 F029 BEQ 0x00BB
00B6 3544 CPI R20,0x54
00B7 E0E0 LDI R30,0
00B8 075E CPC R21,R30
00B9 F029 BEQ 0x00BF
00BA C03C RJMP 0x00F7
(0082) {
(0083) case 'S'://MEGA8 DAC程序ID
(0084) {
(0085) puts("DAC TEST ver1.0");
00BB E600 LDI R16,0x60
00BC E010 LDI R17,0
00BD D043 RCALL _puts
(0086) break;
00BE C038 RJMP 0x00F7
(0087) }
(0088) case 'T'://调节输出电压
(0089) {
(0090) temp=getchar();
00BF D03D RCALL _getchar
00C0 2F60 MOV R22,R16
00C1 2777 CLR R23
(0091) temp=temp<<8;
00C2 2F76 MOV R23,R22
00C3 2766 CLR R22
(0092) temp|=getchar();
00C4 D038 RCALL _getchar
00C5 2E20 MOV R2,R16
00C6 2433 CLR R3
00C7 2962 OR R22,R2
00C8 2973 OR R23,R3
(0093) if (temp<0x400)
00C9 3060 CPI R22,0
00CA E0E4 LDI R30,4
00CB 077E CPC R23,R30
00CC F428 BCC 0x00D2
(0094) OCR1A=temp;
00CD 9370004B STS R23,0x4B
00CF 9360004A STS R22,0x4A
00D1 C025 RJMP 0x00F7
(0095) else
(0096) OCR1A=0x3ff;
00D2 EF8F LDI R24,0xFF
00D3 E093 LDI R25,3
00D4 9390004B STS R25,0x4B
00D6 9380004A STS R24,0x4A
(0097) break;
00D8 C01E RJMP 0x00F7
(0098) }
(0099) case 'O'://读取OCR1A寄存器值
(0100) {
(0101) temp=OCR1A;
00D9 B56A IN R22,P2A
00DA B57B IN R23,P2B
(0102) putchar(temp/256);
00DB 018B MOVW R16,R22
00DC 2F01 MOV R16,R17
00DD 2711 CLR R17
00DE D01A RCALL _putchar
(0103) putchar(temp%256);
00DF 2F06 MOV R16,R22
00E0 7010 ANDI R17,0
00E1 D017 RCALL _putchar
(0104) break;
00E2 C014 RJMP 0x00F7
(0105) }
(0106) case 'M'://设置ADC工作通道
(0107) {
(0108) adc_mux=getchar()&0x03;
00E3 D019 RCALL _getchar
00E4 2F80 MOV R24,R16
00E5 7083 ANDI R24,3
00E6 93800074 STS R24,_adc_mux
(0109) break;
00E8 C00E RJMP 0x00F7
(0110) }
(0111) case 'R'://读取ADC通道及ADC转换结果
(0112) {
(0113) putchar(adc_mux);
00E9 91000074 LDS R16,_adc_mux
00EB D00D RCALL _putchar
(0114) putchar(adc_old/256);
00EC 91000070 LDS R16,_adc_old
00EE 91100071 LDS R17,_adc_old+1
00F0 2F01 MOV R16,R17
00F1 2711 CLR R17
00F2 D006 RCALL _putchar
(0115) putchar(adc_old%256);
00F3 91000070 LDS R16,_adc_old
00F5 7010 ANDI R17,0
00F6 D002 RCALL _putchar
00F7 CFA8 RJMP 0x00A0
(0116) }
(0117) }
(0118) }
(0119) }
00F8 9508 RET
FILE: C:\mega8\DAC\uart.c
(0001) /******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* RS232通信驱动程序 */
(0005) /* 作者:ntzwq@wx88.net */
(0006) /* 2002年5月11日 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -