⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dac.lst

📁 Atmega8实例程序之-DAC的应用(SL-MEGA8开发板)
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -