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

📄 dac.lst

📁 双龙公司开发版源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -