📄 main.lst
字号:
__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 + -