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

📄 main.lst

📁 一个关于AVR单片机的例程
💻 LST
📖 第 1 页 / 共 2 页
字号:
__text_start:
__start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E2      CPI	R30,0x62
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E013C  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: D:\桌面\ds18b20\delay.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **                                杭 州 鑫 高 科 技 有 限 公 司
(0003) **                                     开	发	部
(0004) **                                 http://www.hzxingao.com
(0005) ** 文   件   名: delay.c
(0006) ** 最后修改日期: 2005年05月25日
(0007) ** 描        述: 延时函数
(0008) ** 版	     本: V1.0
(0009) ** 主  控  芯 片:M16  晶振频率:7.3728MHZ, 波特率19200
(0010) **********************************************************************************************************/
(0011) #include <iom16v.h>
(0012) #include <macros.h>
(0013) #include "define.h"
(0014) #include "function.h"
(0015) 
(0016) 
(0017) /**********************************************************************
(0018) functionName: void delayUs(BYTE temp)
(0019) description :延时函数 晶振频率:7.3728MHZ
(0020) delayUs(1);	 	//2.71us
(0021) delayUs(2);	 	//3.53us
(0022) delayUs(4);	 	//5.15us
(0023) delayUs(8);	 	//8.41us
(0024) delayUs(16);	 	//14.92us
(0025) delayUs(32);	 	//27.94us
(0026) delayUs(64);	 	//53.98us
(0027) delayUs(128);	 	//106.07us
(0028) delayUs(255);		//209.42us
(0029) delayUs(18);	 	//16.55us
(0030) delayUs(34);	 	//29.57us
(0031) delayUs(35);	 	//30.38us
(0032) delayUs(100);	 	//83.28
(0033) _NOP();			//0.14us  
(0034) **********************************************************************/
(0035) void delayUs(BYTE temp)
(0036) {
(0037)  	 while(temp--);
_delayUs:
  temp                 --> R16
    004B 2E20      MOV	R2,R16
    004C 2433      CLR	R3
    004D 5001      SUBI	R16,1
    004E 2022      TST	R2
    004F F7D9      BNE	0x004B
    0050 9508      RET
_resetDS18B20:
  errTime              --> R20
    0051 940E01F1  CALL	push_gset1
FILE: D:\桌面\ds18b20\ds18b20.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **                                杭 州 鑫 高 科 技 有 限 公 司
(0003) **                                     开	发	部
(0004) **                                 http://www.hzxingao.com
(0005) ** 文   件   名: DS18B20.c
(0006) ** 最后修改日期: 2005年05月25日
(0007) ** 描        述: DS18B20函数
(0008) ** 版	     本: V1.0
(0009) ** 主  控  芯 片:M16  晶振频率:7.3728MHZ, 波特率19200
(0010) **********************************************************************************************************/
(0011) 
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014) #include "define.h"
(0015) #include "function.h"
(0016) 
(0017) 
(0018) /**********************************************************************
(0019) functionName: BYTE resetDS18B20(void)
(0020) description :DS18B20初始化
(0021) **********************************************************************/
(0022) BYTE resetDS18B20(void)
(0023) {
(0024) 	BYTE errTime=0;
    0053 2744      CLR	R20
(0025) 	RLS_DS18B20;		//释放总线
    0054 988B      CBI	0x11,3
(0026) 	_NOP();
    0055 0000      NOP
(0027) 	HLD_DS18B20;		//Maga16控制总线
    0056 9A8B      SBI	0x11,3
(0028) 	CLR_DS18B20;		//强制拉低
    0057 9893      CBI	0x12,3
(0029) 	delayUs(255);		//209.42us
    0058 EF0F      LDI	R16,0xFF
    0059 940E004B  CALL	_delayUs
(0030) 	delayUs(255);		//209.42us
    005B EF0F      LDI	R16,0xFF
    005C 940E004B  CALL	_delayUs
(0031) 	delayUs(255);		//83.28us
    005E EF0F      LDI	R16,0xFF
    005F 940E004B  CALL	_delayUs
(0032) 	//以上的三个延时大于480us
(0033) 	RLS_DS18B20;		//释放总线,总线自动上拉
    0061 988B      CBI	0x11,3
(0034) 	_NOP();			
    0062 0000      NOP
    0063 C009      RJMP	0x006D
(0035) 	while(STU_DS18B20)	
(0036) 	{
(0037) 		delayUs(4);	 	//5.15us
    0064 E004      LDI	R16,4
    0065 940E004B  CALL	_delayUs
(0038) 		errTime++;
    0067 9543      INC	R20
(0039) 		if(errTime>20)
    0068 E184      LDI	R24,0x14
    0069 1784      CP	R24,R20
    006A F410      BCC	0x006D
(0040) 		return(0x00);		//如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
    006B 2700      CLR	R16
    006C C010      RJMP	0x007D
    006D 9983      SBIC	0x10,3
    006E CFF5      RJMP	0x0064
(0041) 	}
(0042) 	errTime=0;
    006F 2744      CLR	R20
    0070 C009      RJMP	0x007A
(0043) 	while(!(STU_DS18B20))	
(0044) 	{
(0045) 		delayUs(4);	 	//5.15us
    0071 E004      LDI	R16,4
    0072 940E004B  CALL	_delayUs
(0046) 		errTime++;
    0074 9543      INC	R20
(0047) 		if(errTime>50)
    0075 E382      LDI	R24,0x32
    0076 1784      CP	R24,R20
    0077 F410      BCC	0x007A
(0048) 		return(0x00);		//如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
    0078 2700      CLR	R16
    0079 C003      RJMP	0x007D
    007A 9B83      SBIS	0x10,3
    007B CFF5      RJMP	0x0071
(0049) 	}
(0050) 	return(0xff);
    007C EF0F      LDI	R16,0xFF
    007D 940E01F4  CALL	pop_gset1
    007F 9508      RET
_readByteDS18B20:
  retVal               --> R20
  i                    --> R22
    0080 940E01EF  CALL	push_gset2
(0051) }
(0052) 
(0053) 
(0054) /**********************************************************************
(0055) functionName: BYTE readByteDS18B20(void)
(0056) description :读DS18B20一个字节
(0057) **********************************************************************/
(0058) BYTE readByteDS18B20(void)
(0059) {
(0060) 	BYTE i;
(0061) 	BYTE retVal=0;
    0082 2744      CLR	R20
(0062) 	RLS_DS18B20;		//释放总线
    0083 988B      CBI	0x11,3
(0063) 	for(i=8;i>0;i--)
    0084 E068      LDI	R22,0x8
    0085 C01D      RJMP	0x00A3
(0064) 	{
(0065) 	 	retVal>>=1;
    0086 9546      LSR	R20
(0066) 	        HLD_DS18B20;	//Maga16控制总线
    0087 9A8B      SBI	0x11,3
(0067) 		CLR_DS18B20;	//强制拉低
    0088 9893      CBI	0x12,3
(0068) 		NOP();
    0089 0000      NOP
(0069) 	   	NOP();
    008A 0000      NOP
(0070) 	   	NOP();
    008B 0000      NOP
(0071) 	   	NOP();
    008C 0000      NOP
(0072) 	   	NOP();
    008D 0000      NOP
(0073) 		NOP();
    008E 0000      NOP
(0074) 		NOP();	
    008F 0000      NOP
(0075) 		NOP();			//延时大于1us	
    0090 0000      NOP
(0076) 		RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
    0091 988B      CBI	0x11,3
(0077) 		NOP();
    0092 0000      NOP
(0078) 		NOP();
    0093 0000      NOP
(0079) 		NOP();
    0094 0000      NOP
(0080) 		if(STU_DS18B20)
    0095 9B83      SBIS	0x10,3
    0096 C001      RJMP	0x0098
(0081) 		retVal|=0x80;
    0097 6840      ORI	R20,0x80
(0082) 		delayUs(16);	 	//14.92us
    0098 E100      LDI	R16,0x10
    0099 940E004B  CALL	_delayUs
(0083) 		delayUs(16);	 	//14.92us
    009B E100      LDI	R16,0x10
    009C 940E004B  CALL	_delayUs
(0084) 		RLS_DS18B20;		//释放总线
    009E 988B      CBI	0x11,3
(0085) 		delayUs(35);	 	//30.38us
    009F E203      LDI	R16,0x23
    00A0 940E004B  CALL	_delayUs
    00A2 956A      DEC	R22
    00A3 2422      CLR	R2
    00A4 1626      CP	R2,R22
    00A5 F300      BCS	0x0086
(0086) 	}
(0087) 	delayUs(1);	 		//2.71us(大于1us就行了)
    00A6 E001      LDI	R16,1
    00A7 940E004B  CALL	_delayUs
(0088) 	return(retVal);
    00A9 2F04      MOV	R16,R20
    00AA 940E01E3  CALL	pop_gset2
    00AC 9508      RET
_writeByteDS18B20:
  temp                 --> R20
  i                    --> R22
  wb                   --> R10
    00AD 940E01ED  CALL	push_gset3
    00AF 2EA0      MOV	R10,R16
(0089) }
(0090) 
(0091) 
(0092) /**********************************************************************
(0093) functionName: BYTE readByteDS18B20(void)
(0094) description :写DS18B20一个字节
(0095) **********************************************************************/
(0096) void writeByteDS18B20(BYTE wb)
(0097) {
(0098) 	BYTE i;
(0099) 	BYTE temp;
(0100) 	RLS_DS18B20;		//释放总线
    00B0 988B      CBI	0x11,3
(0101) 	for(i=0;i<8;i++)
    00B1 2766      CLR	R22
    00B2 C01A      RJMP	0x00CD
(0102) 	{
(0103) 		HLD_DS18B20;		//Maga16控制总线
    00B3 9A8B      SBI	0x11,3
(0104) 		CLR_DS18B20;		//强制拉低
    00B4 9893      CBI	0x12,3
(0105) 		delayUs(16);	 	//14.92us
    00B5 E100      LDI	R16,0x10
    00B6 940E004B  CALL	_delayUs
(0106) 		temp=wb>>i;
    00B8 2D0A      MOV	R16,R10
    00B9 2F16      MOV	R17,R22
    00BA 940E020F  CALL	lsr8
    00BC 2F40      MOV	R20,R16
(0107) 		temp&=0x01;
    00BD 7041      ANDI	R20,1
(0108) 		if(temp)
    00BE F011      BEQ	0x00C1
(0109) 		RLS_DS18B20;		//释放总线
    00BF 988B      CBI	0x11,3
    00C0 C001      RJMP	0x00C2
(0110) 		else
(0111) 		CLR_DS18B20;		//强制拉低
    00C1 9893      CBI	0x12,3
(0112) 		delayUs(16);	 	//14.92us
    00C2 E100      LDI	R16,0x10
    00C3 940E004B  CALL	_delayUs
(0113) 		delayUs(35);	 	//30.38us
    00C5 E203      LDI	R16,0x23
    00C6 940E004B  CALL	_delayUs
(0114) 		RLS_DS18B20;		//释放总线
    00C8 988B      CBI	0x11,3
(0115) 		delayUs(1);	 		//2.71us(大于1us就行了)
    00C9 E001      LDI	R16,1
    00CA 940E004B  CALL	_delayUs
    00CC 9563      INC	R22
    00CD 3068      CPI	R22,0x8
    00CE F320      BCS	0x00B3
    00CF 940E01E6  CALL	pop_gset3
    00D1 9508      RET
_readTempDS18B20:
  x                    --> R20
  tempH                --> R20
  tempL                --> R22
    00D2 940E01EF  CALL	push_gset2
(0116) 	}
(0117) }
(0118) 
(0119) 
(0120) 
(0121) 
(0122) 
(0123) 
(0124) /**********************************************************************
(0125) functionName: unsigned int readTempDS18B20(void)
(0126) description :读DS18B20温度
(0127) **********************************************************************/
(0128) unsigned int readTempDS18B20(void)
(0129) {
(0130) 	BYTE tempL,tempH;
(0131) 	WORD x;
(0132) 	resetDS18B20();
    00D4 DF7C      RCALL	_resetDS18B20
(0133) 	writeByteDS18B20(0xcc); 	//跳过ROM
    00D5 EC0C      LDI	R16,0xCC
    00D6 DFD6      RCALL	_writeByteDS18B20
(0134) 	writeByteDS18B20(0x44);		//启动温度转换
    00D7 E404      LDI	R16,0x44
    00D8 DFD4      RCALL	_writeByteDS18B20
(0135) 	delayUs(1);
    00D9 E001      LDI	R16,1
    00DA 940E004B  CALL	_delayUs
(0136) 	resetDS18B20();
    00DC DF74      RCALL	_resetDS18B20
(0137) 	writeByteDS18B20(0xcc);		//跳过ROM
    00DD EC0C      LDI	R16,0xCC
    00DE DFCE      RCALL	_writeByteDS18B20
(0138) 	writeByteDS18B20(0xbe);		//读数据
    00DF EB0E      LDI	R16,0xBE
    00E0 DFCC      RCALL	_writeByteDS18B20
(0139) 	tempL=readByteDS18B20();
    00E1 DF9E      RCALL	_readByteDS18B20
    00E2 2F60      MOV	R22,R16
(0140) 	tempH=readByteDS18B20();
    00E3 DF9C      RCALL	_readByteDS18B20
    00E4 2F40      MOV	R20,R16
(0141) 	x=(tempH<<8)|tempL;
    00E5 2F54      MOV	R21,R20
    00E6 2F46      MOV	R20,R22
(0142) 	return(x);
    00E7 018A      MOVW	R16,R20
    00E8 940E01E3  CALL	pop_gset2
    00EA 9508      RET
FILE: D:\桌面\ds18b20\initial.c
(0001) /****************************************Copyright (c)**************************************************
(0002) **                                杭 州 鑫 高 科 技 有 限 公 司
(0003) **                                     开	发	部
(0004) **                                 http://www.hzxingao.com
(0005) ** 文   件   名: initial.c
(0006) ** 最后修改日期: 2005年05月11日
(0007) ** 描        述: 初始化函数
(0008) ** 版	     本: V1.0
(0009) ** 主  控  芯 片:M16  晶振频率:7.3728MHZ, 波特率19200
(0010) **********************************************************************************************************/
(0011) 
(0012) #include <iom16v.h>
(0013) #include <macros.h>
(0014) #include "define.h"
(0015) #include "function.h"
(0016) 
(0017) 
(0018) 
(0019) 
(0020) void port_init(void)
(0021) {
(0022)  PORTA = 0xFF;
_port_init:
    00EB EF8F      LDI	R24,0xFF
    00EC BB8B      OUT	0x1B,R24
(0023)  DDRA  = 0x00;

⌨️ 快捷键说明

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