ds1820.lis
来自「avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用」· LIS 代码 · 共 542 行 · 第 1/2 页
LIS
542 行
008C ; NOP();
008C 0000 nop
008E .dbline 120
008E ; NOP();
008E 0000 nop
0090 .dbline 121
0090 ; if (DQ_R) {
0090 CF9B sbis 0x19,7
0092 01C0 rjmp L17
0094 .dbline 121
0094 .dbline 122
0094 ; value|=0x80;
0094 4068 ori R20,128
0096 .dbline 123
0096 ; }
0096 L17:
0096 .dbline 124
0096 05E0 ldi R16,5
0098 B3DF xcall _delay_10us
009A .dbline 125
009A L14:
009A .dbline 101
009A 6A95 dec R22
009C L16:
009C .dbline 101
009C 6623 tst R22
009E 29F7 brne L13
00A0 .dbline 126
00A0 ; delay_10us(5); /*延时60uS*/
00A0 ; }
00A0 ; if (flag & 0x80) { /*恢复中断状态*/
00A0 20900000 lds R2,_flag
00A4 27FE sbrs R2,7
00A6 01C0 rjmp L19
00A8 .dbline 126
00A8 .dbline 127
00A8 ; SEI();
00A8 7894 sei
00AA .dbline 128
00AA ; }
00AA L19:
00AA .dbline 129
00AA ; return(value);
00AA 042F mov R16,R20
00AC .dbline -2
00AC L12:
00AC 0E940000 xcall pop_gset2
00B0 .dbline 0 ; func end
00B0 0895 ret
00B2 .dbsym r value 20 c
00B2 .dbsym r i 22 c
00B2 .dbend
00B2 .dbfunc e ds1820_write_byte _ds1820_write_byte fV
00B2 ; i -> R20
00B2 ; value -> R22
.even
00B2 _ds1820_write_byte::
00B2 0E940000 xcall push_gset2
00B6 602F mov R22,R16
00B8 .dbline -1
00B8 .dbline 138
00B8 ; }
00B8 ;
00B8 ; /*===================================================================
00B8 ; // 函数功能: 向 1-WIRE 总线上写一个字节
00B8 ; // 形参: value 写到总线上的值
00B8 ; // 返回: void
00B8 ; // 编写: 2004/8/25
00B8 ; ===================================================================*/
00B8 ; void ds1820_write_byte(unsigned char value) {
00B8 .dbline 141
00B8 ;
00B8 ; unsigned char i;
00B8 ; flag = SREG; /*中断保护*/
00B8 2FB6 in R2,0x3f
00BA 20920000 sts _flag,R2
00BE .dbline 142
00BE ; CLI(); /*关中断*/
00BE F894 cli
00C0 .dbline 143
00C0 48E0 ldi R20,8
00C2 0DC0 xjmp L25
00C4 L22:
00C4 .dbline 143
00C4 ; for (i = 8; i != 0; i--) {
00C4 .dbline 144
00C4 ; DQ_OUT;
00C4 D79A sbi 0x1a,7
00C6 .dbline 145
00C6 ; DQ_CLR;
00C6 DF98 cbi 0x1b,7
00C8 .dbline 146
00C8 ; NOP(); /*延时4uS*/
00C8 0000 nop
00CA .dbline 147
00CA ; NOP();
00CA 0000 nop
00CC .dbline 148
00CC ; NOP();
00CC 0000 nop
00CE .dbline 149
00CE ; NOP();
00CE 0000 nop
00D0 .dbline 150
00D0 ; if (value & 0x01) {
00D0 60FD sbrc R22,0
00D2 .dbline 150
00D2 .dbline 151
00D2 ; DQ_SET;
00D2 DF9A sbi 0x1b,7
00D4 .dbline 152
00D4 ; }
00D4 L26:
00D4 .dbline 153
00D4 07E0 ldi R16,7
00D6 94DF xcall _delay_10us
00D8 .dbline 154
00D8 DF9A sbi 0x1b,7
00DA .dbline 155
00DA 6695 lsr R22
00DC .dbline 156
00DC L23:
00DC .dbline 143
00DC 4A95 dec R20
00DE L25:
00DE .dbline 143
00DE 4423 tst R20
00E0 89F7 brne L22
00E2 .dbline 157
00E2 20900000 lds R2,_flag
00E6 27FE sbrs R2,7
00E8 01C0 rjmp L28
00EA .dbline 157
00EA .dbline 158
00EA 7894 sei
00EC .dbline 159
00EC L28:
00EC .dbline -2
00EC L21:
00EC 0E940000 xcall pop_gset2
00F0 .dbline 0 ; func end
00F0 0895 ret
00F2 .dbsym r i 20 c
00F2 .dbsym r value 22 c
00F2 .dbend
00F2 .dbfunc e ds1820_start _ds1820_start fV
.even
00F2 _ds1820_start::
00F2 .dbline -1
00F2 .dbline 163
00F2 ; delay_10us(7); /*延时80uS*/
00F2 ; DQ_SET; /*位结束*/
00F2 ; value >>= 1;
00F2 ; }
00F2 ; if (flag & 0x80) { /*恢复中断状态*/
00F2 ; SEI();
00F2 ; }
00F2 ; }
00F2 ;
00F2 ; /*启动ds1820转换*/
00F2 ; void ds1820_start(void) {
00F2 .dbline 165
00F2 ;
00F2 ; ds1820_reset();
00F2 93DF xcall _ds1820_reset
00F4 .dbline 166
00F4 ; ds1820_write_byte(0xCC); /*勿略地址*/
00F4 0CEC ldi R16,204
00F6 DDDF xcall _ds1820_write_byte
00F8 .dbline 167
00F8 ; ds1820_write_byte(0x44); /*启动转换*/
00F8 04E4 ldi R16,68
00FA DBDF xcall _ds1820_write_byte
00FC .dbline -2
00FC L30:
00FC .dbline 0 ; func end
00FC 0895 ret
00FE .dbend
00FE .dbfunc e ds1820_read_temp _ds1820_read_temp fi
00FE ; buf -> y+0
00FE ; i -> R20,R21
.even
00FE _ds1820_read_temp::
00FE 0E940000 xcall push_gset1
0102 2997 sbiw R28,9
0104 .dbline -1
0104 .dbline 176
0104 ; }
0104 ;
0104 ; /*===================================================================
0104 ; // 函数功能: 读取温度
0104 ; // 形参: *temperature 温度存储空间
0104 ; // 返回: unsigned char true为有效
0104 ; // 编写: 2004/8/25
0104 ; ===================================================================*/
0104 ; unsigned int ds1820_read_temp(void) {
0104 .dbline 181
0104 ;
0104 ; unsigned int i;
0104 ; unsigned char buf[9];
0104 ;
0104 ; ds1820_reset();
0104 8ADF xcall _ds1820_reset
0106 .dbline 182
0106 ; ds1820_write_byte(0xCC); /*勿略地址*/
0106 0CEC ldi R16,204
0108 D4DF xcall _ds1820_write_byte
010A .dbline 183
010A ; ds1820_write_byte(0xBE); /*读取温度*/
010A 0EEB ldi R16,190
010C D2DF xcall _ds1820_write_byte
010E .dbline 184
010E 4427 clr R20
0110 5527 clr R21
0112 08C0 xjmp L35
0114 L32:
0114 .dbline 184
0114 .dbline 185
0114 A1DF xcall _ds1820_read_byte
0116 CE01 movw R24,R28
0118 FA01 movw R30,R20
011A E80F add R30,R24
011C F91F adc R31,R25
011E 0083 std z+0,R16
0120 .dbline 186
0120 L33:
0120 .dbline 184
0120 4F5F subi R20,255 ; offset = 1
0122 5F4F sbci R21,255
0124 L35:
0124 .dbline 184
0124 ; for (i = 0; i < 9; i++) {
0124 4930 cpi R20,9
0126 E0E0 ldi R30,0
0128 5E07 cpc R21,R30
012A A0F3 brlo L32
012C .dbline 187
012C ; buf[i] = ds1820_read_byte();
012C ; }
012C ; i = buf[1];
012C 4981 ldd R20,y+1
012E 5527 clr R21
0130 .dbline 188
0130 ; i <<= 8;
0130 542F mov R21,R20
0132 4427 clr R20
0134 .dbline 189
0134 ; i |= buf[0];
0134 2880 ldd R2,y+0
0136 3324 clr R3
0138 4229 or R20,R2
013A 5329 or R21,R3
013C .dbline 191
013C ;
013C ; return i;
013C 8A01 movw R16,R20
013E .dbline -2
013E L31:
013E 2996 adiw R28,9
0140 0E940000 xcall pop_gset1
0144 .dbline 0 ; func end
0144 0895 ret
0146 .dbsym l buf 0 A[9:9]c
0146 .dbsym r i 20 i
0146 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~2\icc\030-DS18B20-LED4\DS1820.C
0000 _flag::
0000 .blkb 1
0001 .dbsym e flag _flag c
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?