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

📄 smg.lst

📁 AVR单片机开发版资料测试程序里的源程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0043 E5CF      LDI	R28,0x5F
    0044 E0D4      LDI	R29,4
    0045 BFCD      OUT	P3D,R28
    0046 BFDE      OUT	P3E,R29
    0047 51C0      SUBI	R28,0x10
    0048 40D0      SBCI	R29,0
    0049 EA0A      LDI	R16,0xAA
    004A 8308      STD	R16,0+Y
    004B 2400      CLR	R0
    004C E6E0      LDI	R30,0x60
    004D E0F0      LDI	R31,0
    004E E010      LDI	R17,0
    004F 36E0      CPI	R30,0x60
    0050 07F1      CPC	R31,R17
    0051 F011      BEQ	0x0054
    0052 9201      ST	R0,Z+
    0053 CFFB      RJMP	0x004F
    0054 8300      STD	R16,0+Z
    0055 E8E6      LDI	R30,0x86
    0056 E0F0      LDI	R31,0
    0057 E6A0      LDI	R26,0x60
    0058 E0B0      LDI	R27,0
    0059 E010      LDI	R17,0
    005A 38E6      CPI	R30,0x86
    005B 07F1      CPC	R31,R17
    005C F021      BEQ	0x0061
    005D 95C8      LPM
    005E 9631      ADIW	R30,1
    005F 920D      ST	R0,X+
    0060 CFF9      RJMP	0x005A
    0061 940E012F  CALL	_main
_exit:
    0063 CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    0064 940E01A2  CALL	push_gset2
    0066 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晶振下,通过软件仿真反复实验得到的数值
    0067 E005      LDI	R16,5
    0068 E010      LDI	R17,0
    0069 019B      MOVW	R18,R22
    006A 940E017B  CALL	empy16s
    006C 01B8      MOVW	R22,R16
    006D 9576      LSR	R23
    006E 9567      ROR	R22
    006F 9576      LSR	R23
    0070 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    0071 2744      CLR	R20
    0072 2755      CLR	R21
    0073 C002      RJMP	0x0076
    0074 5F4F      SUBI	R20,0xFF
    0075 4F5F      SBCI	R21,0xFF
    0076 1746      CP	R20,R22
    0077 0757      CPC	R21,R23
    0078 F3D8      BCS	0x0074
(0032) }
    0079 940E01AA  CALL	pop_gset2
    007B 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    007C 940E01A2  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++)
    007E 2744      CLR	R20
    007F 2755      CLR	R21
    0080 C00B      RJMP	0x008C
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    0081 2766      CLR	R22
    0082 2777      CLR	R23
    0083 C002      RJMP	0x0086
    0084 5F6F      SUBI	R22,0xFF
    0085 4F7F      SBCI	R23,0xFF
    0086 3765      CPI	R22,0x75
    0087 E0E4      LDI	R30,4
    0088 077E      CPC	R23,R30
    0089 F3D0      BCS	0x0084
    008A 5F4F      SUBI	R20,0xFF
    008B 4F5F      SBCI	R21,0xFF
    008C 1740      CP	R20,R16
    008D 0751      CPC	R21,R17
    008E F390      BCS	0x0081
(0044) }
    008F 940E01AA  CALL	pop_gset2
    0091 9508      RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    0092 EF8F      LDI	R24,0xFF
    0093 BB8A      OUT	P1A,R24
(0054) 	DDRB=0xFF;
    0094 BB87      OUT	P17,R24
(0055) 	DDRC=0xFF;
    0095 BB84      OUT	P14,R24
(0056) 	DDRD=0xFF;
    0096 BB81      OUT	P11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    0097 2422      CLR	R2
    0098 B82D      OUT	P0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    0099 9ADE      SBI	P1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    009A 98AE      CBI	P15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    009B 98D9      CBI	P1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    009C BB88      OUT	P18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    009D 9ADA      SBI	P1B,2
(0065)  	Delayus(5);		
    009E E005      LDI	R16,5
    009F E010      LDI	R17,0
    00A0 DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    00A1 98DA      CBI	P1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    00A2 2422      CLR	R2
    00A3 BA28      OUT	P18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    00A4 9ADB      SBI	P1B,3
(0070)  	Delayus(50);			  
    00A5 E302      LDI	R16,0x32
    00A6 E010      LDI	R17,0
    00A7 DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    00A8 98DB      CBI	P1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    00A9 EF8F      LDI	R24,0xFF
    00AA BB88      OUT	P18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    00AB 9ADC      SBI	P1B,4
(0075)  	Delayus(50);				   
    00AC E302      LDI	R16,0x32
    00AD E010      LDI	R17,0
    00AE DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    00AF 98DC      CBI	P1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    00B0 EF8F      LDI	R24,0xFF
    00B1 BB82      OUT	P12,R24
(0079) 	PORTA|=BIT(PA7);
    00B2 9ADF      SBI	P1B,7
(0080) 	Delayus(50);
    00B3 E302      LDI	R16,0x32
    00B4 E010      LDI	R17,0
    00B5 DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    00B6 98DF      CBI	P1B,7
(0082) 
(0083) 	
(0084) }
    00B7 9508      RET
_One_smg_display:
  number               --> R20
  data                 --> R22
    00B8 940E01A2  CALL	push_gset2
    00BA 2F42      MOV	R20,R18
    00BB 2F60      MOV	R22,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\2_SMG\SMG.C
(0001) /*******************************************
(0002)   文件:SMG.C
(0003)   环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10 
(0004)   硬件:ATMEGA16芯片
(0005)   日期:2006年12月10日 
(0006)   功能:驱动开发板上的数码管,滚动显示1、2、3、4、5、6
(0007)   备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h>			//包含型号头文件
(0010) #include <macros.h>			//包含"位"操作头文件
(0011) #include <stdio.h>			//标准输入输出头文件
(0012) #include <AVR_PQ1A.h>		//包含自定义常量头文件
(0013) 
(0014) #pragma data:code 
(0015) const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
(0016) 		   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0017) 
(0018) /*******************************************
(0019) 函数名称: One_smg_display
(0020) 功    能: 指定的数码管显示指定的内容
(0021) 参    数: data--显示的内容(0-15)
(0022) 	  	  number--指定的数码管(1-6)
(0023) 返回值  : 无
(0024) /********************************************/
(0025) void One_smg_display(uchar data,uchar number)
(0026) { 
(0027)  PORTB|=0x3F;			   //输出位选
    00BC B388      IN	R24,P18
    00BD 638F      ORI	R24,0x3F
    00BE BB88      OUT	P18,R24
(0028)  PORTA|=BIT(BITLK);		   //更新位选
    00BF 9ADC      SBI	P1B,4
(0029)  Delayus(50);			   //调整时序
    00C0 E302      LDI	R16,0x32
    00C1 E010      LDI	R17,0
    00C2 DFA1      RCALL	_Delayus
(0030)  PORTA&=~BIT(BITLK);	   //锁存位选
    00C3 98DC      CBI	P1B,4
(0031) 
(0032)  PORTB=SEGMENT[data];	   //输出段选
    00C4 E082      LDI	R24,2
    00C5 9F86      MUL	R24,R22
    00C6 01F0      MOVW	R30,R0
    00C7 E680      LDI	R24,0x60
    00C8 E090      LDI	R25,0
    00C9 0FE8      ADD	R30,R24
    00CA 1FF9      ADC	R31,R25
    00CB 9005      LD	R0,R0
    00CC 9014      LD	R1,R1
    00CD 01F0      MOVW	R30,R0
    00CE BBE8      OUT	P18,R30
(0033)  PORTA|=BIT(SEGLK);		   //更新段选
    00CF 9ADB      SBI	P1B,3
(0034)  Delayus(50);			   //调整时序
    00D0 E302      LDI	R16,0x32
    00D1 E010      LDI	R17,0
    00D2 DF91      RCALL	_Delayus
(0035)  PORTA&=~BIT(SEGLK);	   //锁存段选
    00D3 98DB      CBI	P1B,3
(0036)  
(0037)  number=~BIT(number-1);	   //调整位选(指定时是1~6,而操作的时候是0~5)
    00D4 2F14      MOV	R17,R20
    00D5 5011      SUBI	R17,1
    00D6 E001      LDI	R16,1
    00D7 940E01C9  CALL	lsl8
    00D9 2F40      MOV	R20,R16
    00DA 9540      COM	R20
(0038)  PORTB=number;			   //输出位选
    00DB BB48      OUT	P18,R20
(0039)  PORTA|=BIT(BITLK);		   //更新位选
    00DC 9ADC      SBI	P1B,4
(0040)  Delayus(50);				   //调整时序
    00DD E302      LDI	R16,0x32
    00DE E010      LDI	R17,0
    00DF DF84      RCALL	_Delayus
(0041)  PORTA&=~BIT(BITLK);	   //锁存位选
    00E0 98DC      CBI	P1B,4
(0042) }
    00E1 940E01AA  CALL	pop_gset2
    00E3 9508      RET
_All_smg_display:

⌨️ 快捷键说明

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