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

📄 usbd12.lst

📁 AVR16单片机USB通信程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
__text_start:
__start:
    006F E5CF      LDI	R28,0x5F
    0070 E0D4      LDI	R29,4
    0071 BFCD      OUT	P3D,R28
    0072 BFDE      OUT	P3E,R29
    0073 51C0      SUBI	R28,0x10
    0074 40D0      SBCI	R29,0
    0075 EA0A      LDI	R16,0xAA
    0076 8308      STD	R16,0+Y
    0077 2400      CLR	R0
    0078 ECEA      LDI	R30,0xCA
    0079 E0F0      LDI	R31,0
    007A E011      LDI	R17,1
    007B 33E0      CPI	R30,0x30
    007C 07F1      CPC	R31,R17
    007D F011      BEQ	0x0080
    007E 9201      ST	R0,Z+
    007F CFFB      RJMP	0x007B
    0080 8300      STD	R16,0+Z
    0081 E7E4      LDI	R30,0x74
    0082 E0F0      LDI	R31,0
    0083 E6A0      LDI	R26,0x60
    0084 E0B0      LDI	R27,0
    0085 E010      LDI	R17,0
    0086 3DEE      CPI	R30,0xDE
    0087 07F1      CPC	R31,R17
    0088 F021      BEQ	0x008D
    0089 95C8      LPM
    008A 9631      ADIW	R30,1
    008B 920D      ST	R0,X+
    008C CFF9      RJMP	0x0086
    008D 940E06E3  CALL	_main
_exit:
    008F CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    0090 940E0758  CALL	push_gset2
    0092 01B8      MOVW	R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002)   文件:AVR_PQ1A.H
(0003)   功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005) 
(0006) #include <iom16v.h>			//包含型号头文件
(0007) #include <macros.h>			//包含"位"操作头文件
(0008) 
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012) 
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2	//LED锁存器控制端
(0015) #define SEGLK PA3	//数码管段选锁存器控制端
(0016) #define BITLK PA4	//数码管位选锁存器控制端
(0017) 
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功    能: 延时指定微秒(8M晶振)
(0024) 参    数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值  : 无
(0026) /********************************************/
(0027) void Delayus(uint US)		  
(0028) {
(0029)  uint i;
(0030)  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0093 E005      LDI	R16,5
    0094 E010      LDI	R17,0
    0095 019B      MOVW	R18,R22
    0096 940E0703  CALL	empy16s
    0098 01B8      MOVW	R22,R16
    0099 9576      LSR	R23
    009A 9567      ROR	R22
    009B 9576      LSR	R23
    009C 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    009D 2744      CLR	R20
    009E 2755      CLR	R21
    009F C002      RJMP	0x00A2
    00A0 5F4F      SUBI	R20,0xFF
    00A1 4F5F      SBCI	R21,0xFF
    00A2 1746      CP	R20,R22
    00A3 0757      CPC	R21,R23
    00A4 F3D8      BCS	0x00A0
(0032) }
    00A5 940E0760  CALL	pop_gset2
    00A7 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    00A8 940E0758  CALL	push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功    能: 延时指定毫秒(8M晶振)
(0036) 参    数: MS--延时的毫秒数
(0037) 返回值  : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)		  
(0040) {
(0041)  uint i,j;
(0042)  for( i=0;i<MS;i++)
    00AA 2744      CLR	R20
    00AB 2755      CLR	R21
    00AC C00B      RJMP	0x00B8
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    00AD 2766      CLR	R22
    00AE 2777      CLR	R23
    00AF C002      RJMP	0x00B2
    00B0 5F6F      SUBI	R22,0xFF
    00B1 4F7F      SBCI	R23,0xFF
    00B2 3765      CPI	R22,0x75
    00B3 E0E4      LDI	R30,4
    00B4 077E      CPC	R23,R30
    00B5 F3D0      BCS	0x00B0
    00B6 5F4F      SUBI	R20,0xFF
    00B7 4F5F      SBCI	R21,0xFF
    00B8 1740      CP	R20,R16
    00B9 0751      CPC	R21,R17
    00BA F390      BCS	0x00AD
(0044) }
    00BB 940E0760  CALL	pop_gset2
    00BD 9508      RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    00BE EF8F      LDI	R24,0xFF
    00BF BB8A      OUT	P1A,R24
(0054) 	DDRB=0xFF;
    00C0 BB87      OUT	P17,R24
(0055) 	DDRC=0xFF;
    00C1 BB84      OUT	P14,R24
(0056) 	DDRD=0xFF;
    00C2 BB81      OUT	P11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    00C3 2422      CLR	R2
    00C4 B82D      OUT	P0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    00C5 9ADE      SBI	P1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    00C6 98AE      CBI	P15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    00C7 98D9      CBI	P1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    00C8 BB88      OUT	P18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    00C9 9ADA      SBI	P1B,2
(0065)  	Delayus(5);		
    00CA E005      LDI	R16,5
    00CB E010      LDI	R17,0
    00CC DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    00CD 98DA      CBI	P1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    00CE 2422      CLR	R2
    00CF BA28      OUT	P18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    00D0 9ADB      SBI	P1B,3
(0070)  	Delayus(50);			  
    00D1 E302      LDI	R16,0x32
    00D2 E010      LDI	R17,0
    00D3 DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    00D4 98DB      CBI	P1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    00D5 EF8F      LDI	R24,0xFF
    00D6 BB88      OUT	P18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    00D7 9ADC      SBI	P1B,4
(0075)  	Delayus(50);				   
    00D8 E302      LDI	R16,0x32
    00D9 E010      LDI	R17,0
    00DA DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    00DB 98DC      CBI	P1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    00DC EF8F      LDI	R24,0xFF
    00DD BB82      OUT	P12,R24
(0079) 	PORTA|=BIT(PA7);
    00DE 9ADF      SBI	P1B,7
(0080) 	Delayus(50);
    00DF E302      LDI	R16,0x32
    00E0 E010      LDI	R17,0
    00E1 DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    00E2 98DF      CBI	P1B,7
(0082) 
(0083) 	
(0084) }
    00E3 9508      RET
_One_led:
  i                    --> Y+1
  light                --> R22
  number               --> R20
    00E4 940E0758  CALL	push_gset2
    00E6 2F62      MOV	R22,R18
    00E7 2F40      MOV	R20,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB\LED.C
(0001) /*******************************************
(0002)   文件:LED.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:驱动开发板上的LED。1. 流水灯 2.闪烁指定的LED
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #include <stdio.h>			//标准输入输出头文件
(0012) 
(0013) /*******************************************
(0014) 函数名称: One_led
(0015) 功    能: 点亮或者熄灭指定的LED
(0016) 参    数: number--指定的LED
(0017) 	  	  light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
(0018) 返回值  : 无
(0019) /********************************************/
(0020) void One_led(uchar number,uchar light)
(0021) {uchar i;
(0022)  if(light==TRUE)		   //点亮操作
    00E8 3061      CPI	R22,1
    00E9 F479      BNE	0x00F9
(0023)  {
(0024)   PORTB&=~BIT(number);	   //输出数据
    00EA E001      LDI	R16,1
    00EB 2F14      MOV	R17,R20
    00EC 940E076F  CALL	lsl8
    00EE 2E20      MOV	R2,R16
    00EF 9420      COM	R2
    00F0 B238      IN	R3,P18
    00F1 2032      AND	R3,R2
    00F2 BA38      OUT	P18,R3
(0025)   PORTA|=BIT(LEDLK);	   //更新数据
    00F3 9ADA      SBI	P1B,2
(0026)   Delayms(5);			   //调整时序
    00F4 E005      LDI	R16,5
    00F5 E010      LDI	R17,0
    00F6 DFB1      RCALL	_Delayms
(0027)   PORTA&=~BIT(LEDLK);	   //锁存数据
    00F7 98DA      CBI	P1B,2
(0028)  }
    00F8 C00C      RJMP	0x0105
(0029)  else
(0030)  {
(0031)   PORTB|=BIT(number);	   //输出数据
    00F9 E001      LDI	R16,1
    00FA 2F14      MOV	R17,R20
    00FB 940E076F  CALL	lsl8
    00FD B228      IN	R2,P18
    00FE 2A20      OR	R2,R16
    00FF BA28      OUT	P18,R2
(0032)   PORTA|=BIT(LEDLK);	   //更新数据
    0100 9ADA      SBI	P1B,2
(0033)   Delayms(5);			   //调整时序
    0101 E005      LDI	R16,5
    0102 E010      LDI	R17,0
    0103 DFA4      RCALL	_Delayms
(0034)   PORTA&=~BIT(LEDLK);	   //锁存数据
    0104 98DA      CBI	P1B,2
(0035)  }
(0036) }
    0105 940E0760  CALL	pop_gset2
    0107 9508      RET
_All_led:
  light                --> R20
    0108 940E0741  CALL	push_gset1
    010A 2F40      MOV	R20,R16
(0037) /*******************************************
(0038) 函数名称: All_led
(0039) 功    能: 点亮或者熄灭全部LED
(0040) 参    数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
(0041) 返回值  : 无
(0042) /********************************************/
(0043) void All_led(uchar light)
(0044) {
(0045)  if(light)
    010B 2344      TST	R20
    010C F049      BEQ	0x0116
(0046)  {
(0047)   PORTB&=~ALLLED;
    010D B388      IN	R24,P18
    010E 7080      ANDI	R24,0
    010F BB88      OUT	P18,R24
(0048)   PORTA|=BIT(LEDLK);
    0110 9ADA      SBI	P1B,2
(0049)   Delayms(5);
    0111 E005      LDI	R16,5
    0112 E010      LDI	R17,0
    0113 DF94      RCALL	_Delayms
(0050)   PORTA&=~BIT(LEDLK);
    0114 98DA      CBI	P1B,2
(0051)  }
    0115 C008      RJMP	0x011E
(0052)  else
(0053)  {
(0054)   PORTB|=ALLLED;
    0116 B388      IN	R24,P18
    0117 6F8F      ORI	R24,0xFF
    0118 BB88      OUT	P18,R24
(0055)   PORTA|=BIT(LEDLK);
    0119 9ADA      SBI	P1B,2
(0056)   Delayms(5);
    011A E005      LDI	R16,5
    011B E010      LDI	R17,0
    011C DF8B      RCALL	_Delayms
(0057)   PORTA&=~BIT(LEDLK);
    011D 98DA      CBI	P1B,2
(0058)  }
(0059) }
    011E 940E0744  CALL	pop_gset1
    0120 9508      RET
_Flow_LED:
  i                    --> R20
  MS                   --> R22
    0121 940E0758  CALL	push_gset2
    0123 2F60      MOV	R22,R16
(0060) /*******************************************
(0061) 函数名称: Flow_led
(0062) 功    能: 流水灯(循环一次)
(0063) 参    数: MS--点亮相邻LED的时间间隔
(0064) 返回值  : 无
(0065) /********************************************/
(0066) void Flow_LED(uchar MS)
(0067) {
(0068)  uchar i;
(0069)  for(i=0;i<8;i++)
    0124 2744      CLR	R20
    0125 C009      RJMP	0x012F
(0070)  {
(0071)   All_led(FALSE);	//全部熄灭
    0126 2700      CLR	R16
    0127 DFE0      RCALL	_All_led
(0072)   One_led(i,TRUE);	//点亮指定的LED
    0128 E021      LDI	R18,1
    0129 2F04      MOV	R16,R20
    012A DFB9      RCALL	_One_led
(0073)   Delayms(MS);		//延时指定的时间
    012B 2F06      MOV	R16,R22
    012C 2711      CLR	R17
    012D DF7A      RCALL	_Delayms
    012E 9543      INC	R20
    012F 3048      CPI	R20,0x8
    0130 F3A8      BCS	0x0126
(0074)  } 
(0075) }
    0131 940E0760  CALL	pop_gset2
    0133 9508      RET
_Flash_LED:
  MS                   --> R22
  number               --> R20
    0134 940E0758  CALL	push_gset2
    0136 2F62      MOV	R22,R18
    0137 2F40      MOV	R20,R16
(0076) /*******************************************
(0077) 函数名称: Flash_led
(0078) 功    能: 闪烁指定的LED(循环一次)
(0079) 参    数: number--指定的LED
(0080) 	  	  MS--LED闪烁的时间间隔
(0081) 返回值  : 无
(0082) /********************************************/
(0083) void Flash_LED(uchar number,uchar MS)
(0084) {
(0085)  One_led(number,TRUE);		//点亮指定的LED
    0138 E021      LDI	R18,1
    0139 2F04      MOV	R16,R20
    013A DFA9      RCALL	_One_led
(0086)  Delayms(MS);				//延时指定的时间
    013B 2F06      MOV	R16,R22
    013C 2711      CLR	R17
    013D DF6A      RCALL	_Delayms

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -