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

📄 mega16_ad.lst

📁 AVR16单片机集成10位AD程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
__start:
__text_start:
    0040 E5CF      LDI	R28,0x5F
    0041 E0D4      LDI	R29,4
    0042 BFCD      OUT	P3D,R28
    0043 BFDE      OUT	P3E,R29
    0044 51C0      SUBI	R28,0x10
    0045 40D0      SBCI	R29,0
    0046 EA0A      LDI	R16,0xAA
    0047 8308      STD	R16,0+Y
    0048 2400      CLR	R0
    0049 E6E0      LDI	R30,0x60
    004A E0F0      LDI	R31,0
    004B E010      LDI	R17,0
    004C 36E0      CPI	R30,0x60
    004D 07F1      CPC	R31,R17
    004E F011      BEQ	0x0051
    004F 9201      ST	R0,Z+
    0050 CFFB      RJMP	0x004C
    0051 8300      STD	R16,0+Z
    0052 E8E0      LDI	R30,0x80
    0053 E0F0      LDI	R31,0
    0054 E6A0      LDI	R26,0x60
    0055 E0B0      LDI	R27,0
    0056 E010      LDI	R17,0
    0057 38E0      CPI	R30,0x80
    0058 07F1      CPC	R31,R17
    0059 F021      BEQ	0x005E
    005A 95C8      LPM
    005B 9631      ADIW	R30,1
    005C 920D      ST	R0,X+
    005D CFF9      RJMP	0x0057
    005E 940E0171  CALL	_main
_exit:
    0060 CFFF      RJMP	_exit
_Delayus:
  i                    --> R20
  US                   --> R22
    0061 940E0214  CALL	push_gset2
    0063 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晶振下,通过软件仿真反复实验得到的数值
    0064 E005      LDI	R16,5
    0065 E010      LDI	R17,0
    0066 019B      MOVW	R18,R22
    0067 940E01ED  CALL	empy16s
    0069 01B8      MOVW	R22,R16
    006A 9576      LSR	R23
    006B 9567      ROR	R22
    006C 9576      LSR	R23
    006D 9567      ROR	R22
(0031)  for( i=0;i<US;i++); 
    006E 2744      CLR	R20
    006F 2755      CLR	R21
    0070 C002      RJMP	0x0073
    0071 5F4F      SUBI	R20,0xFF
    0072 4F5F      SBCI	R21,0xFF
    0073 1746      CP	R20,R22
    0074 0757      CPC	R21,R23
    0075 F3D8      BCS	0x0071
(0032) }
    0076 940E021C  CALL	pop_gset2
    0078 9508      RET
_Delayms:
  i                    --> R20
  j                    --> R22
  MS                   --> R16
    0079 940E0214  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++)
    007B 2744      CLR	R20
    007C 2755      CLR	R21
    007D C00B      RJMP	0x0089
(0043)  for(j=0;j<1141;j++);	//1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
    007E 2766      CLR	R22
    007F 2777      CLR	R23
    0080 C002      RJMP	0x0083
    0081 5F6F      SUBI	R22,0xFF
    0082 4F7F      SBCI	R23,0xFF
    0083 3765      CPI	R22,0x75
    0084 E0E4      LDI	R30,4
    0085 077E      CPC	R23,R30
    0086 F3D0      BCS	0x0081
    0087 5F4F      SUBI	R20,0xFF
    0088 4F5F      SBCI	R21,0xFF
    0089 1740      CP	R20,R16
    008A 0751      CPC	R21,R17
    008B F390      BCS	0x007E
(0044) }
    008C 940E021C  CALL	pop_gset2
    008E 9508      RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功    能: 初始化实验板,关闭全部功能
(0048) 参    数: 无
(0049) 返回值  : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) 	DDRA=0xFF;	//将四个IO口全部配置为输出
_Board_init:
    008F EF8F      LDI	R24,0xFF
    0090 BB8A      OUT	P1A,R24
(0054) 	DDRB=0xFF;
    0091 BB87      OUT	P17,R24
(0055) 	DDRC=0xFF;
    0092 BB84      OUT	P14,R24
(0056) 	DDRD=0xFF;
    0093 BB81      OUT	P11,R24
(0057) 
(0058) 	SPCR=0x00;	//还原SPI口,使其为正常端口	
    0094 2422      CLR	R2
    0095 B82D      OUT	P0D,R2
(0059) 
(0060) 	PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
    0096 9ADE      SBI	P1B,6
(0061) 	PORTC&=~BIT(PC6);	  //(RELAY)初始化继电器为常闭连接状态	
    0097 98AE      CBI	P15,6
(0062) 	PORTA&=~BIT(PA1);	//关闭SPI总线DA
    0098 98D9      CBI	P1B,1
(0063) 	PORTB=0xFF;	//关闭LED
    0099 BB88      OUT	P18,R24
(0064) 	PORTA|=BIT(LEDLK);	//锁存数据,使LED熄灭
    009A 9ADA      SBI	P1B,2
(0065)  	Delayus(5);		
    009B E005      LDI	R16,5
    009C E010      LDI	R17,0
    009D DFC3      RCALL	_Delayus
(0066)  	PORTA&=~BIT(LEDLK);
    009E 98DA      CBI	P1B,2
(0067) 	
(0068) 	PORTB=0x00;	   //输出段选
    009F 2422      CLR	R2
    00A0 BA28      OUT	P18,R2
(0069)  	PORTA|=BIT(SEGLK);		  
    00A1 9ADB      SBI	P1B,3
(0070)  	Delayus(50);			  
    00A2 E302      LDI	R16,0x32
    00A3 E010      LDI	R17,0
    00A4 DFBC      RCALL	_Delayus
(0071)  	PORTA&=~BIT(SEGLK);	    
    00A5 98DB      CBI	P1B,3
(0072)  	
(0073)  	PORTB=0xFF;	   //输出位选
    00A6 EF8F      LDI	R24,0xFF
    00A7 BB88      OUT	P18,R24
(0074)  	PORTA|=BIT(BITLK);		   
    00A8 9ADC      SBI	P1B,4
(0075)  	Delayus(50);				   
    00A9 E302      LDI	R16,0x32
    00AA E010      LDI	R17,0
    00AB DFB5      RCALL	_Delayus
(0076)  	PORTA&=~BIT(BITLK);	   
    00AC 98DC      CBI	P1B,4
(0077) 	
(0078) 	PORTD=0xFF;
    00AD EF8F      LDI	R24,0xFF
    00AE BB82      OUT	P12,R24
(0079) 	PORTA|=BIT(PA7);
    00AF 9ADF      SBI	P1B,7
(0080) 	Delayus(50);
    00B0 E302      LDI	R16,0x32
    00B1 E010      LDI	R17,0
    00B2 DFAE      RCALL	_Delayus
(0081) 	PORTA&=~BIT(PA7);
    00B3 98DF      CBI	P1B,7
(0082) 
(0083) 	
(0084) }
    00B4 9508      RET
_One_smg_display:
  number               --> R20
  data                 --> R22
    00B5 940E0214  CALL	push_gset2
    00B7 2F42      MOV	R20,R18
    00B8 2F60      MOV	R22,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD\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) 
(0013) #pragma data:code 
(0014) const SEGMENT[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
(0015) 		   0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0016) 
(0017) /*******************************************
(0018) 函数名称: One_smg_display
(0019) 功    能: 指定的数码管显示指定的内容
(0020) 参    数: data--显示的内容(0-15)
(0021) 	  	  number--指定的数码管(1-6)
(0022) 返回值  : 无
(0023) /********************************************/
(0024) void One_smg_display(uchar data,uchar number)
(0025) { 
(0026)  PORTB|=0x3F;			   //输出位选
    00B9 B388      IN	R24,P18
    00BA 638F      ORI	R24,0x3F
    00BB BB88      OUT	P18,R24
(0027)  PORTA|=BIT(BITLK);		   //更新位选
    00BC 9ADC      SBI	P1B,4
(0028)  Delayus(50);			   //调整时序
    00BD E302      LDI	R16,0x32
    00BE E010      LDI	R17,0
    00BF DFA1      RCALL	_Delayus
(0029)  PORTA&=~BIT(BITLK);	   //锁存位选
    00C0 98DC      CBI	P1B,4
(0030) 
(0031)  PORTB=SEGMENT[data];	   //输出段选
    00C1 E082      LDI	R24,2
    00C2 9F86      MUL	R24,R22
    00C3 01F0      MOVW	R30,R0
    00C4 E680      LDI	R24,0x60
    00C5 E090      LDI	R25,0
    00C6 0FE8      ADD	R30,R24
    00C7 1FF9      ADC	R31,R25
    00C8 9005      LD	R0,R0
    00C9 9014      LD	R1,R1
    00CA 01F0      MOVW	R30,R0
    00CB BBE8      OUT	P18,R30
(0032)  PORTA|=BIT(SEGLK);		   //更新段选
    00CC 9ADB      SBI	P1B,3
(0033)  Delayus(50);			   //调整时序
    00CD E302      LDI	R16,0x32
    00CE E010      LDI	R17,0
    00CF DF91      RCALL	_Delayus
(0034)  PORTA&=~BIT(SEGLK);	   //锁存段选
    00D0 98DB      CBI	P1B,3
(0035)  
(0036)  number=~BIT(number-1);	   //调整位选(指定时是1~6,而操作的时候是0~5)
    00D1 2F14      MOV	R17,R20
    00D2 5011      SUBI	R17,1
    00D3 E001      LDI	R16,1
    00D4 940E0222  CALL	lsl8
    00D6 2F40      MOV	R20,R16
    00D7 9540      COM	R20
(0037)  PORTB=number;			   //输出位选
    00D8 BB48      OUT	P18,R20
(0038)  PORTA|=BIT(BITLK);		   //更新位选
    00D9 9ADC      SBI	P1B,4
(0039)  Delayus(50);				   //调整时序
    00DA E302      LDI	R16,0x32
    00DB E010      LDI	R17,0
    00DC DF84      RCALL	_Delayus
(0040)  PORTA&=~BIT(BITLK);	   //锁存位选
    00DD 98DC      CBI	P1B,4
(0041) }
    00DE 940E021C  CALL	pop_gset2
    00E0 9508      RET
_All_smg_display:
  i                    --> R20
  pdata                --> R22
    00E1 940E0214  CALL	push_gset2
    00E3 01B8      MOVW	R22,R16
(0042) /*******************************************
(0043) 函数名称: All_smg_display
(0044) 功    能: 6个数码管显示指定的内容
(0045) 参    数: *pdata--显示内容数组地址
(0046) 返回值  : 无
(0047) /********************************************/
(0048) void All_smg_display(uchar *pdata)
(0049) {
(0050)  uchar i;
(0051)  for(i=0;i<6;i++)
    00E4 2744      CLR	R20
    00E5 C00C      RJMP	0x00F2
(0052)  	{
(0053) 	 One_smg_display(pdata[i],i+1);
    00E6 2F24      MOV	R18,R20
    00E7 5F2F      SUBI	R18,0xFF
    00E8 2FE4      MOV	R30,R20
    00E9 27FF      CLR	R31
    00EA 0FE6      ADD	R30,R22
    00EB 1FF7      ADC	R31,R23
    00EC 8100      LDD	R16,0+Z
    00ED DFC7      RCALL	_One_smg_display
(0054) 	 Delayms(1);
    00EE E001      LDI	R16,1
    00EF E010      LDI	R17,0
    00F0 DF88      RCALL	_Delayms
    00F1 9543      INC	R20
    00F2 3046      CPI	R20,6
    00F3 F390      BCS	0x00E6
(0055) 	}
(0056) }
    00F4 940E021C  CALL	pop_gset2
    00F6 9508      RET
_Cycle_smg_display:
  i                    --> R20
  j                    --> R10
  pdata                --> R22
    00F7 940E0218  CALL	push_gset3
    00F9 01B8      MOVW	R22,R16
(0057) /*******************************************
(0058) 函数名称: Cycle_smg_display
(0059) 功    能: 6个数码管从右向左循环滚动显示指定的内容(循环一次)
(0060) 参    数: *pdata--显示内容数组地址
(0061) 返回值  : 无
(0062) /********************************************/
(0063) void Cycle_smg_display(uchar *pdata)
(0064) {
(0065)  uchar i,j;
(0066)  for(i=0;i<240;i++)			 //共滚动6次,每次内容显示40个循环
    00FA 2744      CLR	R20
    00FB C02B      RJMP	0x0127
(0067)  { 
(0068)   for(j=0;j<6;j++)			 //扫描6个数码管
    00FC 24AA      CLR	R10
    00FD C025      RJMP	0x0123
(0069)  	{
(0070) 	 One_smg_display(pdata[(i/40+j)%6],j+1);//显示
    00FE 2D2A      MOV	R18,R10
    00FF 5F2F      SUBI	R18,0xFF
    0100 E288      LDI	R24,0x28
    0101 E090      LDI	R25,0
    0102 2F04      MOV	R16,R20
    0103 2711      CLR	R17
    0104 932F      PUSH	R18
    0105 933F      PUSH	R19
    0106 019C      MOVW	R18,R24
    0107 940E01D2  CALL	div16s
    0109 0118      MOVW	R2,R16
    010A 913F      POP	R19
    010B 912F      POP	R18
    010C 2C4A      MOV	R4,R10
    010D 2455      CLR	R5
    010E 0C24      ADD	R2,R4
    010F 1C35      ADC	R3,R5
    0110 E086      LDI	R24,6
    0111 E090      LDI	R25,0
    0112 932F      PUSH	R18

⌨️ 快捷键说明

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