📄 ds18b20_1602.lst
字号:
__start:
__text_start:
004A E5CF LDI R28,0x5F
004B E0D4 LDI R29,4
004C BFCD OUT 0x3D,R28
004D BFDE OUT 0x3E,R29
004E 51C0 SUBI R28,0x10
004F 40D0 SBCI R29,0
0050 EA0A LDI R16,0xAA
0051 8308 STD Y+0,R16
0052 2400 CLR R0
0053 EAE0 LDI R30,0xA0
0054 E0F0 LDI R31,0
0055 E010 LDI R17,0
0056 3AE0 CPI R30,0xA0
0057 07F1 CPC R31,R17
0058 F011 BEQ 0x005B
0059 9201 ST R0,Z+
005A CFFB RJMP 0x0056
005B 8300 STD Z+0,R16
005C E5E4 LDI R30,0x54
005D E0F0 LDI R31,0
005E E6A0 LDI R26,0x60
005F E0B0 LDI R27,0
0060 E010 LDI R17,0
0061 39E4 CPI R30,0x94
0062 07F1 CPC R31,R17
0063 F021 BEQ 0x0068
0064 95C8 LPM
0065 9631 ADIW R30,1
0066 920D ST R0,X+
0067 CFF9 RJMP 0x0061
0068 940E033B CALL _main
_exit:
006A CFFF RJMP _exit
_DS18B20_Reset:
err --> R20
006B 940E03C1 CALL push_gset1
FILE: F:\avr最小系统板\程序代码\ex15_ds18b20_1602\ds18b20.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "ds18b20.h"
(0004) #include "lm1602.h"
(0005)
(0006)
(0007) byte DS18B20_Reset(void) //DS18B20初始化函数
(0008) {
(0009) byte err=0;
006D 2744 CLR R20
(0010) DQ_OUT; //DQ复位
006E 9AA1 SBI 0x14,1
(0011) _NOP();
006F 0000 NOP
(0012) _NOP();
0070 0000 NOP
(0013) DQ_L;
0071 98A9 CBI 0x15,1
(0014) delay_nus(300); //延时470us
0072 E20C LDI R16,0x2C
0073 E011 LDI R17,1
0074 940E036A CALL _delay_nus
(0015) // DQ_H;
(0016) DQ_IN;
0076 98A1 CBI 0x14,1
(0017) delay_nus(60); //延时100us
0077 E30C LDI R16,0x3C
0078 E010 LDI R17,0
0079 940E036A CALL _delay_nus
(0018) if(DQ_IN_H)
007B B383 IN R24,0x13
007C 7082 ANDI R24,2
007D 3082 CPI R24,2
007E F409 BNE 0x0080
(0019) err = 1;
007F E041 LDI R20,1
(0020) delay_nus(60); //延时100us
0080 E30C LDI R16,0x3C
0081 E010 LDI R17,0
0082 940E036A CALL _delay_nus
(0021) return err;
0084 2F04 MOV R16,R20
0085 940E03C4 CALL pop_gset1
0087 9508 RET
_DS18B20_WriteBit:
bitval --> R20
0088 940E03C1 CALL push_gset1
008A 2F40 MOV R20,R16
(0022) }
(0023)
(0024) void DS18B20_WriteBit(byte bitval)
(0025) {
(0026) DQ_OUT;
008B 9AA1 SBI 0x14,1
(0027) _NOP();
008C 0000 NOP
(0028) _NOP();
008D 0000 NOP
(0029) DQ_L;//将DQ线拉低,开始写时间隙
008E 98A9 CBI 0x15,1
(0030) delay_nus(10); //延时30us
008F E00A LDI R16,0xA
0090 E010 LDI R17,0
0091 940E036A CALL _delay_nus
(0031) if(bitval == 1) //如果写1,DQ线拉高
0093 3041 CPI R20,1
0094 F409 BNE 0x0096
(0032) DQ_H;
0095 9AA9 SBI 0x15,1
(0033) delay_nus(20); //延时30us
0096 E104 LDI R16,0x14
0097 E010 LDI R17,0
0098 940E036A CALL _delay_nus
(0034) DQ_H;
009A 9AA9 SBI 0x15,1
009B 940E03C4 CALL pop_gset1
009D 9508 RET
_DS18B20_ReadBit:
rbit --> R20
009E 940E03C1 CALL push_gset1
(0035) }
(0036)
(0037) byte DS18B20_ReadBit(void)
(0038) {
(0039) byte rbit = 0;
00A0 2744 CLR R20
(0040) DQ_OUT;
00A1 9AA1 SBI 0x14,1
(0041) _NOP();
00A2 0000 NOP
(0042) _NOP();
00A3 0000 NOP
(0043) DQ_L; //将DQ线拉低,开始写时间隙
00A4 98A9 CBI 0x15,1
(0044) delay_us(); //延时30us
00A5 940E0368 CALL _delay_us
(0045) //DQ_H;
(0046) // delay_nus(10); //延时
(0047) DQ_IN;
00A7 98A1 CBI 0x14,1
(0048) _NOP();
00A8 0000 NOP
(0049) _NOP();
00A9 0000 NOP
(0050) //
(0051) if(DQ_IN_H)
00AA B383 IN R24,0x13
00AB 7082 ANDI R24,2
00AC 3082 CPI R24,2
00AD F409 BNE 0x00AF
(0052) rbit =1;
00AE E041 LDI R20,1
(0053) delay_nus(40);
00AF E208 LDI R16,0x28
00B0 E010 LDI R17,0
00B1 940E036A CALL _delay_nus
(0054) return (rbit);
00B3 2F04 MOV R16,R20
00B4 940E03C4 CALL pop_gset1
00B6 9508 RET
_DS18B20_WriteChar:
temp --> R20
i --> R22
val --> R10
00B7 940E03BD CALL push_gset3
00B9 2EA0 MOV R10,R16
(0055) }
(0056)
(0057) void DS18B20_WriteChar(byte val)
(0058) {
(0059) byte i;
(0060) byte temp;
(0061) temp = val;
00BA 2D4A MOV R20,R10
(0062) for(i = 0;i<8;i++)
00BB 2766 CLR R22
00BC C00F RJMP 0x00CC
(0063) {
(0064) temp =val>>i;
00BD 2D0A MOV R16,R10
00BE 2F16 MOV R17,R22
00BF 940E03DE CALL lsr8
00C1 2F40 MOV R20,R16
(0065) if((temp&0x01) == 0x01)
00C2 2F84 MOV R24,R20
00C3 7081 ANDI R24,1
00C4 3081 CPI R24,1
00C5 F419 BNE 0x00C9
(0066) DS18B20_WriteBit(1);
00C6 E001 LDI R16,1
00C7 DFC0 RCALL _DS18B20_WriteBit
00C8 C002 RJMP 0x00CB
(0067) else
(0068) DS18B20_WriteBit(0);
00C9 2700 CLR R16
00CA DFBD RCALL _DS18B20_WriteBit
00CB 9563 INC R22
00CC 3068 CPI R22,0x8
00CD F378 BCS 0x00BD
(0069)
(0070)
(0071) }
(0072)
(0073) delay_nus(60); //延时
00CE E30C LDI R16,0x3C
00CF E010 LDI R17,0
00D0 940E036A CALL _delay_nus
00D2 940E03B3 CALL pop_gset3
00D4 9508 RET
_DS18B20_ReadChar:
R_data --> R20
i --> R22
00D5 940E03BF CALL push_gset2
(0074) }
(0075)
(0076) byte DS18B20_ReadChar(void) //读一个字节数据函数
(0077) {
(0078) unsigned char i = 0;
00D7 2766 CLR R22
(0079) byte R_data = 0;
00D8 2744 CLR R20
(0080)
(0081) for (i=0;i<8;i++)
00D9 C009 RJMP 0x00E3
(0082) {
(0083) if(DS18B20_ReadBit())
00DA DFC3 RCALL _DS18B20_ReadBit
00DB 2300 TST R16
00DC F029 BEQ 0x00E2
(0084) R_data |=1<<i;
00DD E001 LDI R16,1
00DE 2F16 MOV R17,R22
00DF 940E03D8 CALL lsl8
00E1 2B40 OR R20,R16
00E2 9563 INC R22
00E3 3068 CPI R22,0x8
00E4 F3A8 BCS 0x00DA
(0085) }
(0086) return (R_data);
00E5 2F04 MOV R16,R20
00E6 940E03B0 CALL pop_gset2
00E8 9508 RET
_ReadTemperature:
tempValue --> R20
Rom --> Y+0
00E9 940E03C1 CALL push_gset1
00EB 9722 SBIW R28,2
(0087) }
(0088)
(0089) unsigned int ReadTemperature(void) //读取温度函数
(0090) {
(0091) byte Rom[2];
(0092) unsigned int tempValue;
(0093) if(DS18B20_Reset())
00EC DF7E RCALL _DS18B20_Reset
00ED 2300 TST R16
00EE F019 BEQ 0x00F2
(0094) {
(0095) return 0xffff;
00EF EF0F LDI R16,0xFF
00F0 EF1F LDI R17,0xFF
00F1 C023 RJMP 0x0115
(0096) }
(0097) DS18B20_WriteChar(0xcc) ; //跳过读序号列号的操作
00F2 EC0C LDI R16,0xCC
00F3 DFC3 RCALL _DS18B20_WriteChar
(0098) DS18B20_WriteChar(0x44) ; //启动温度转换
00F4 E404 LDI R16,0x44
00F5 DFC1 RCALL _DS18B20_WriteChar
(0099) delay_nus(100);
00F6 E604 LDI R16,0x64
00F7 E010 LDI R17,0
00F8 940E036A CALL _delay_nus
(0100) if(DS18B20_Reset())
00FA DF70 RCALL _DS18B20_Reset
00FB 2300 TST R16
00FC F019 BEQ 0x0100
(0101) {
(0102) return 0xffff;
00FD EF0F LDI R16,0xFF
00FE EF1F LDI R17,0xFF
00FF C015 RJMP 0x0115
(0103) }
(0104) DS18B20_WriteChar(0xCC) ; //跳过读序号列号的操作
0100 EC0C LDI R16,0xCC
0101 DFB5 RCALL _DS18B20_WriteChar
(0105) DS18B20_WriteChar(0xBE) ; //读取温度寄存器
0102 EB0E LDI R16,0xBE
0103 DFB3 RCALL _DS18B20_WriteChar
(0106) delay_nus(200);
0104 EC08 LDI R16,0xC8
0105 E010 LDI R17,0
0106 940E036A CALL _delay_nus
(0107) Rom[0] = DS18B20_ReadChar() ; //读温度低8位
0108 DFCC RCALL _DS18B20_ReadChar
0109 8308 STD Y+0,R16
(0108) Rom[1] = DS18B20_ReadChar() ; //读温度高8位
010A DFCA RCALL _DS18B20_ReadChar
010B 8309 STD Y+1,R16
(0109) /* *tempValue = Rom[1];
(0110) *tempValue <<= 8;
(0111) *tempValue |= Rom[0];*/
(0112) tempValue = Rom[1];
010C 2F40 MOV R20,R16
010D 2755 CLR R21
(0113) tempValue <<= 8;
010E 2F54 MOV R21,R20
010F 2744 CLR R20
(0114) tempValue |= Rom[0];
0110 8028 LDD R2,Y+0
0111 2433 CLR R3
0112 2942 OR R20,R2
0113 2953 OR R21,R3
(0115) return tempValue;
0114 018A MOVW R16,R20
0115 9622 ADIW R28,2
0116 940E03C4 CALL pop_gset1
0118 9508 RET
FILE: F:\avr最小系统板\程序代码\ex15_ds18b20_1602\lm1602.c
(0001) #include "lm1602.h"
(0002) #include "string.h"
(0003) #include <macros.h>
(0004)
(0005)
(0006) /*自定义字符*/
(0007) byte CGRAMtab[] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号
(0008)
(0009)
(0010) void LcdInit(void);
(0011) void DisplayTime(byte hour,byte minute,byte second);
(0012)
(0013) unsigned char CheckBusy(void)
(0014) {
(0015)
(0016) DDRB = 0x00;
_CheckBusy:
0119 2422 CLR R2
011A BA27 OUT 0x17,R2
(0017) NOP();
011B 0000 NOP
(0018) NOP();
011C 0000 NOP
(0019) NOP();
011D 0000 NOP
(0020) NOP();
011E 0000 NOP
(0021) NOP();
011F 0000 NOP
(0022) NOP();
0120 0000 NOP
(0023) NOP();
0121 0000 NOP
(0024) NOP();
0122 0000 NOP
(0025) RS_L;
0123 98DD CBI 0x1B,5
(0026) RW_H;
0124 9ADE SBI 0x1B,6
(0027) EN_H;
0125 9ADF SBI 0x1B,7
(0028) NOP();
0126 0000 NOP
(0029) NOP();
0127 0000 NOP
(0030) NOP();
0128 0000 NOP
(0031) NOP();
0129 0000 NOP
(0032) EN_L;
012A 98DF CBI 0x1B,7
(0033) if((PINB&0x80)==0x80)
012B B386 IN R24,0x16
012C 7880 ANDI R24,0x80
012D 3880 CPI R24,0x80
012E F421 BNE 0x0133
(0034) {
(0035) DDRB = 0xFF;
012F EF8F LDI R24,0xFF
0130 BB87 OUT 0x17,R24
(0036) return 1;
0131 E001 LDI R16,1
0132 C003 RJMP 0x0136
(0037) }
(0038) else
(0039) {
(0040) DDRB = 0xFF;
0133 EF8F LDI R24,0xFF
0134 BB87 OUT 0x17,R24
(0041) return 0;
0135 2700 CLR R16
0136 9508 RET
(0042) }
(0043)
(0044) }
(0045)
(0046) void delay(void)
(0047) {
(0048) unsigned int t;
(0049) for(t=0;t<1000;t++);
_delay:
t --> R16
0137 2700 CLR R16
0138 2711 CLR R17
0139 C002 RJMP 0x013C
013A 5F0F SUBI R16,0xFF
013B 4F1F SBCI R17,0xFF
013C 3E08 CPI R16,0xE8
013D E0E3 LDI R30,3
013E 071E CPC R17,R30
013F F3D0 BCS 0x013A
0140 9508 RET
_WriteCmd:
cmd --> R20
0141 940E03C1 CALL push_gset1
0143 2F40 MOV R20,R16
(0050) }
(0051)
(0052) void WriteCmd(byte cmd)
(0053) {
(0054)
(0055) RS_L;
0144 98DD CBI 0x1B,5
(0056) RW_L;
0145 98DE CBI 0x1B,6
(0057) DATAPORT = cmd;
0146 BB48 OUT 0x18,R20
(0058) EN_H;
0147 9ADF SBI 0x1B,7
(0059) //while(CheckBusy());
(0060) delay();
0148 DFEE RCALL _delay
(0061) EN_L;
0149 98DF CBI 0x1B,7
014A 940E03C4 CALL pop_gset1
014C 9508 RET
_WriteData:
datas --> R20
014D 940E03C1 CALL push_gset1
014F 2F40 MOV R20,R16
(0062) }
(0063)
(0064) void WriteData(byte datas)
(0065) {
(0066) RS_H;
0150 9ADD SBI 0x1B,5
(0067) RW_L;
0151 98DE CBI 0x1B,6
(0068) DATAPORT = datas;
0152 BB48 OUT 0x18,R20
(0069) EN_H;
0153 9ADF SBI 0x1B,7
(0070) delay();
0154 DFE2 RCALL _delay
(0071) EN_L;
0155 98DF CBI 0x1B,7
0156 940E03C4 CALL pop_gset1
0158 9508 RET
_LCD_WriteCGRAM:
i --> R20
len --> R22
cgram --> R10
0159 940E03BD CALL push_gset3
015B 2F62 MOV R22,R18
015C 0158 MOVW R10,R16
(0072) }
(0073)
(0074) void LCD_WriteCGRAM(byte *cgram,byte len) //自定义字符写入CGRAM函数
(0075) {
(0076) byte i ;
(0077) WriteCmd(0x40) ; //写CGRAM
015D E400 LDI R16,0x40
015E DFE2 RCALL _WriteCmd
(0078) for (i = 0 ; i< len ; i++)
015F 2744 CLR R20
0160 C007 RJMP 0x0168
(0079) WriteData(*(cgram+i)) ;
0161 2FE4 MOV R30,R20
0162 27FF CLR R31
0163 0DEA ADD R30,R10
0164 1DFB ADC R31,R11
0165 8100 LDD R16,Z+0
0166 DFE6 RCALL _WriteData
0167 9543 INC R20
0168 1746 CP R20,R22
0169 F3B8 BCS 0x0161
016A 940E03B3 CALL pop_gset3
016C 9508 RET
(0080) }
(0081)
(0082)
(0083) void ClearLcd(void)
(0084) {
(0085) WriteCmd(CLR_DIS);
_ClearLcd:
016D E001 LDI R16,1
016E DFD2 RCALL _WriteCmd
016F 9508 RET
(0086) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -