📄 zz.lis
字号:
01EC ; delay_10us(7); /*延时80uS*/
01EC 07E0 ldi R16,7
01EE E6DF xcall _delay_10us
01F0 .dbline 35
01F0 ; i = DQ_R;
01F0 43B3 in R20,0x13
01F2 4870 andi R20,8
01F4 .dbline 36
01F4 ; delay_10us(49); /*延时500uS(保持>480uS)*/
01F4 01E3 ldi R16,49
01F6 E2DF xcall _delay_10us
01F8 .dbline 37
01F8 ; if (flag & 0x80) { /*恢复中断状态*/
01F8 20901800 lds R2,_flag
01FC 27FE sbrs R2,7
01FE 01C0 rjmp L50
0200 X14:
0200 .dbline 37
0200 .dbline 38
0200 ; SEI();
0200 7894 sei
0202 .dbline 39
0202 ; }
0202 L50:
0202 .dbline 40
0202 ; if (i) {
0202 4423 tst R20
0204 11F0 breq L52
0206 X15:
0206 .dbline 40
0206 .dbline 41
0206 ; return 0x00;
0206 0027 clr R16
0208 01C0 xjmp L49
020A L52:
020A .dbline 43
020A ; }
020A ; else {
020A .dbline 44
020A ; return 0x01;
020A 01E0 ldi R16,1
020C .dbline -2
020C L49:
020C .dbline 0 ; func end
020C 4991 ld R20,y+
020E 0895 ret
0210 .dbsym r i 20 c
0210 .dbend
0210 .dbfunc e ds1820_read_byte _ds1820_read_byte fc
0210 ; value -> R20
0210 ; i -> R22
.even
0210 _ds1820_read_byte::
0210 4A93 st -y,R20
0212 6A93 st -y,R22
0214 .dbline -1
0214 .dbline 49
0214 ; }
0214 ; }
0214 ;
0214 ; /*DS18B20字节读取函数*/
0214 ; unsigned char ds1820_read_byte(void) {
0214 .dbline 52
0214 ;
0214 ; unsigned char i;
0214 ; unsigned char value = 0;
0214 4427 clr R20
0216 .dbline 53
0216 ; flag = SREG; /*中断保护*/
0216 2FB6 in R2,0x3f
0218 20921800 sts _flag,R2
021C .dbline 54
021C ; CLI(); /*关中断*/
021C F894 cli
021E .dbline 55
021E ; for (i = 8; i != 0; i--) {
021E 68E0 ldi R22,8
0220 19C0 xjmp L58
0222 L55:
0222 .dbline 55
0222 .dbline 56
0222 ; value >>= 1;
0222 4695 lsr R20
0224 .dbline 57
0224 ; DQ_OUT;
0224 A39A sbi 0x14,3
0226 .dbline 58
0226 ; DQ_CLR;
0226 AB98 cbi 0x15,3
0228 .dbline 59
0228 ; delay4us; /*延时4uS*/
0228 .dbline 59
0228 0000 nop
022A .dbline 59
022A 0000 nop
022C .dbline 59
022C 0000 nop
022E .dbline 59
022E 0000 nop
0230 .dbline 59
0230 .dbline 59
0230 .dbline 60
0230 ; DQ_SET;
0230 AB9A sbi 0x15,3
0232 .dbline 61
0232 ; DQ_IN;
0232 A398 cbi 0x14,3
0234 .dbline 62
0234 ; delay10us; /*延时10uS*/
0234 .dbline 62
0234 0000 nop
0236 .dbline 62
0236 0000 nop
0238 .dbline 62
0238 0000 nop
023A .dbline 62
023A 0000 nop
023C .dbline 62
023C 0000 nop
023E .dbline 62
023E 0000 nop
0240 .dbline 62
0240 0000 nop
0242 .dbline 62
0242 0000 nop
0244 .dbline 62
0244 0000 nop
0246 .dbline 62
0246 0000 nop
0248 .dbline 62
0248 .dbline 62
0248 .dbline 63
0248 ; if (DQ_R) {
0248 9B9B sbis 0x13,3
024A 01C0 rjmp L59
024C X16:
024C .dbline 63
024C .dbline 64
024C ; value|=0x80;
024C 4068 ori R20,128
024E .dbline 65
024E ; }
024E L59:
024E .dbline 66
024E ; delay_10us(5); /*延时60uS*/
024E 05E0 ldi R16,5
0250 B5DF xcall _delay_10us
0252 .dbline 67
0252 ; }
0252 L56:
0252 .dbline 55
0252 6A95 dec R22
0254 L58:
0254 .dbline 55
0254 6623 tst R22
0256 29F7 brne L55
0258 X17:
0258 .dbline 68
0258 ; if (flag & 0x80) { /*恢复中断状态*/
0258 20901800 lds R2,_flag
025C 27FE sbrs R2,7
025E 01C0 rjmp L61
0260 X18:
0260 .dbline 68
0260 .dbline 69
0260 ; SEI();
0260 7894 sei
0262 .dbline 70
0262 ; }
0262 L61:
0262 .dbline 71
0262 ; return(value);
0262 042F mov R16,R20
0264 .dbline -2
0264 L54:
0264 .dbline 0 ; func end
0264 6991 ld R22,y+
0266 4991 ld R20,y+
0268 0895 ret
026A .dbsym r value 20 c
026A .dbsym r i 22 c
026A .dbend
026A .dbfunc e ds1820_write_byte _ds1820_write_byte fV
026A ; i -> R20
026A ; value -> R10
.even
026A _ds1820_write_byte::
026A AA92 st -y,R10
026C 4A93 st -y,R20
026E A02E mov R10,R16
0270 .dbline -1
0270 .dbline 75
0270 ; }
0270 ;
0270 ; /*DS18B20字节写入函数*/
0270 ; void ds1820_write_byte(unsigned char value) {
0270 .dbline 78
0270 ;
0270 ; unsigned char i;
0270 ; flag = SREG; /*中断保护*/
0270 2FB6 in R2,0x3f
0272 20921800 sts _flag,R2
0276 .dbline 79
0276 ; CLI(); /*关中断*/
0276 F894 cli
0278 .dbline 80
0278 ; for (i = 8; i != 0; i--) {
0278 48E0 ldi R20,8
027A 0EC0 xjmp L67
027C L64:
027C .dbline 80
027C .dbline 81
027C ; DQ_OUT;
027C A39A sbi 0x14,3
027E .dbline 82
027E ; DQ_CLR;
027E AB98 cbi 0x15,3
0280 .dbline 83
0280 ; delay4us; /*延时4uS*/
0280 .dbline 83
0280 0000 nop
0282 .dbline 83
0282 0000 nop
0284 .dbline 83
0284 0000 nop
0286 .dbline 83
0286 0000 nop
0288 .dbline 83
0288 .dbline 83
0288 .dbline 84
0288 ; if (value & 0x01) {DQ_SET;}
0288 A0FE sbrs R10,0
028A 01C0 rjmp L68
028C X19:
028C .dbline 84
028C .dbline 84
028C AB9A sbi 0x15,3
028E .dbline 84
028E L68:
028E .dbline 86
028E ; //每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0
028E ; delay_10us(7); /*延时80uS*/
028E 07E0 ldi R16,7
0290 95DF xcall _delay_10us
0292 .dbline 87
0292 ; DQ_SET; /*位结束*/
0292 AB9A sbi 0x15,3
0294 .dbline 88
0294 ; value >>= 1;
0294 A694 lsr R10
0296 .dbline 89
0296 ; }
0296 L65:
0296 .dbline 80
0296 4A95 dec R20
0298 L67:
0298 .dbline 80
0298 4423 tst R20
029A 81F7 brne L64
029C X20:
029C .dbline 90
029C ; if (flag & 0x80) { /*恢复中断状态*/
029C 20901800 lds R2,_flag
02A0 27FE sbrs R2,7
02A2 01C0 rjmp L70
02A4 X21:
02A4 .dbline 90
02A4 .dbline 91
02A4 ; SEI();
02A4 7894 sei
02A6 .dbline 92
02A6 ; }
02A6 L70:
02A6 .dbline -2
02A6 L63:
02A6 .dbline 0 ; func end
02A6 4991 ld R20,y+
02A8 A990 ld R10,y+
02AA 0895 ret
02AC .dbsym r i 20 c
02AC .dbsym r value 10 c
02AC .dbend
02AC .dbfunc e ds1820_read_temp _ds1820_read_temp fI
02AC ; tt -> y+0
02AC ; c -> R20,R21
02AC ; b -> R22,R23
02AC ; a -> R10,R11
02AC ; t -> R12,R13
.even
02AC _ds1820_read_temp::
02AC 0E940000 xcall push_xgsetF03C
02B0 2497 sbiw R28,4
02B2 .dbline -1
02B2 .dbline 97
02B2 ; }
02B2 ;
02B2 ; /*DS8B20读取温度信息*/
02B2 ; ds1820_read_temp(void)
02B2 ; {
02B2 .dbline 99
02B2 ;
02B2 ; unsigned int a = 0, b = 0, c = 0, t = 0;
02B2 .dbline 99
02B2 .dbline 99
02B2 .dbline 99
02B2 .dbline 100
02B2 ; float tt = 0;
02B2 00E0 ldi R16,<L73
02B4 10E0 ldi R17,>L73
02B6 0E940000 xcall lpm32
02BA 0883 std y+0,R16
02BC 1983 std y+1,R17
02BE 2A83 std y+2,R18
02C0 3B83 std y+3,R19
02C2 .dbline 102
02C2 ;
02C2 ; ds1820_reset();
02C2 89DF xcall _ds1820_reset
02C4 .dbline 103
02C4 ; ds1820_write_byte(0xCC); /*勿略地址*/
02C4 0CEC ldi R16,204
02C6 D1DF xcall _ds1820_write_byte
02C8 .dbline 104
02C8 ; ds1820_write_byte(0x44); /*启动转换*/
02C8 04E4 ldi R16,68
02CA CFDF xcall _ds1820_write_byte
02CC .dbline 105
02CC ; ds1820_reset();
02CC 84DF xcall _ds1820_reset
02CE .dbline 106
02CE ; ds1820_write_byte(0xCC); /*勿略地址*/
02CE 0CEC ldi R16,204
02D0 CCDF xcall _ds1820_write_byte
02D2 .dbline 107
02D2 ; ds1820_write_byte(0xBE); /*读取温度*/
02D2 0EEB ldi R16,190
02D4 CADF xcall _ds1820_write_byte
02D6 .dbline 108
02D6 ; a = ds1820_read_byte(); //读取温度寄存器
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -