📄 1.lis
字号:
01D6 ; temp -> R20
01D6 ; k -> R22
01D6 ; n -> R10
.even
01D6 _read_1820::
01D6 0E940000 xcall push_gset3
01DA .dbline -1
01DA .dbline 200
01DA ; }
01DA ;
01DA ; //////////////////////////////////////////////
01DA ; uchar read_1820()
01DA ; {
01DA .dbline 202
01DA ; uchar temp,k,n;
01DA ; temp=0;
01DA 4427 clr R20
01DC .dbline 203
01DC ; for(n=0;n<8;n++)
01DC AA24 clr R10
01DE 18C0 xjmp L48
01E0 L45:
01E0 .dbline 204
01E0 ; {
01E0 .dbline 205
01E0 ; PORTD&=~(1<<6);
01E0 9698 cbi 0x12,6
01E2 .dbline 207
01E2 ; //delay(2);
01E2 ; PORTD|=(1<<6);
01E2 969A sbi 0x12,6
01E4 .dbline 209
01E4 ; //delay(3);
01E4 ; DDRD&=~(1<<6);
01E4 8E98 cbi 0x11,6
01E6 .dbline 210
01E6 ; k=(PIND&(1<<6)); //读数据,从低位开始
01E6 60B3 in R22,0x10
01E8 6074 andi R22,64
01EA .dbline 211
01EA ; if(k)
01EA 31F0 breq L49
01EC .dbline 212
01EC ; temp|=(1<<n);
01EC 01E0 ldi R16,1
01EE 1A2D mov R17,R10
01F0 0E940000 xcall lsl8
01F4 402B or R20,R16
01F6 07C0 xjmp L50
01F8 L49:
01F8 .dbline 214
01F8 ; else
01F8 ; temp&=~(1<<n);
01F8 01E0 ldi R16,1
01FA 1A2D mov R17,R10
01FC 0E940000 xcall lsl8
0200 202E mov R2,R16
0202 2094 com R2
0204 4221 and R20,R2
0206 L50:
0206 .dbline 215
0206 02E3 ldi R16,50
0208 10E0 ldi R17,0
020A B1DF xcall _delay
020C .dbline 216
020C 8E9A sbi 0x11,6
020E .dbline 217
020E L46:
020E .dbline 203
020E A394 inc R10
0210 L48:
0210 .dbline 203
0210 8A2D mov R24,R10
0212 8830 cpi R24,8
0214 28F3 brlo L45
0216 .dbline 218
0216 ; delay(50); //60~120us
0216 ; DDRD|=(1<<6);
0216 ; }
0216 ; return (temp);
0216 042F mov R16,R20
0218 .dbline -2
0218 L44:
0218 0E940000 xcall pop_gset3
021C .dbline 0 ; func end
021C 0895 ret
021E .dbsym r temp 20 c
021E .dbsym r k 22 c
021E .dbsym r n 10 c
021E .dbend
021E .dbfunc e send_byte _send_byte fV
021E ; i -> R20
021E ; x -> R22
.even
021E _send_byte::
021E 0E940000 xcall push_gset2
0222 602F mov R22,R16
0224 .dbline -1
0224 .dbline 222
0224 ; }
0224 ; ////////////////////////////////////////////////
0224 ; void send_byte(uchar x) //以下为显示程序
0224 ; {
0224 .dbline 224
0224 ; uchar i;
0224 ; for(i=0;i<8;i++)
0224 4427 clr R20
0226 14C0 xjmp L55
0228 L52:
0228 .dbline 225
0228 ; {
0228 .dbline 226
0228 ; PORTC&=~(1<<5); // PC5为底 为164提供时钟信号
0228 AD98 cbi 0x15,5
022A .dbline 227
022A ; if((x&(1<<(7-i)))||((dp==1)&&(i==0))) //判断每位数据的电平,及小数点判断
022A 17E0 ldi R17,7
022C 141B sub R17,R20
022E 01E0 ldi R16,1
0230 0E940000 xcall lsl8
0234 262E mov R2,R22
0236 2022 and R2,R16
0238 31F4 brne L58
023A 80910400 lds R24,_dp
023E 8130 cpi R24,1
0240 21F4 brne L56
0242 4423 tst R20
0244 11F4 brne L56
0246 L58:
0246 .dbline 228
0246 ; PORTC|=(1<<4); //若为高着PC4输出高电平
0246 AC9A sbi 0x15,4
0248 01C0 xjmp L57
024A L56:
024A .dbline 230
024A ; else
024A ; PORTC&=~(1<<4); //若为低着输出低电平
024A AC98 cbi 0x15,4
024C L57:
024C .dbline 231
024C AD9A sbi 0x15,5
024E .dbline 232
024E L53:
024E .dbline 224
024E 4395 inc R20
0250 L55:
0250 .dbline 224
0250 4830 cpi R20,8
0252 50F3 brlo L52
0254 .dbline -2
0254 L51:
0254 0E940000 xcall pop_gset2
0258 .dbline 0 ; func end
0258 0895 ret
025A .dbsym r i 20 c
025A .dbsym r x 22 c
025A .dbend
025A .dbfunc e main _main fV
025A ; teml -> R20
025A ; temh -> R22
025A ; i -> R10
.even
025A _main::
025A 2297 sbiw R28,2
025C .dbline -1
025C .dbline 237
025C ; PORTC|=(1<<5); //PC5 提供始终信号
025C ; }
025C ; //PORTC|=((1<<0)|(1<<1)|(1<<2));
025C ; }
025C ; ////////////////////////////////////////////////
025C ; void main(void) //主函数
025C ; {
025C .dbline 239
025C ; // disp_led(0,0);
025C ; delay(2000);
025C 00ED ldi R16,2000
025E 17E0 ldi R17,7
0260 86DF xcall _delay
0262 .dbline 240
0262 ; OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率,
0262 8DE9 ldi R24,157
0264 81BF out 0x31,R24
0266 .dbline 241
0266 ; DDRC=0xff;
0266 8FEF ldi R24,255
0268 84BB out 0x14,R24
026A .dbline 242
026A ; DDRD=0XFF;
026A 81BB out 0x11,R24
026C .dbline 243
026C ; DDRA=0XFF;
026C 8ABB out 0x1a,R24
026E .dbline 244
026E ; PORTA=0XF3;
026E 83EF ldi R24,243
0270 8BBB out 0x1b,R24
0272 .dbline 245
0272 ; PORTD=0XFF;
0272 8FEF ldi R24,255
0274 82BB out 0x12,R24
0276 .dbline 246
0276 ; WDR(); //看门狗计数清零
0276 A895 wdr
0278 .dbline 247
0278 ; LCD_init();
0278 EDDE xcall _LCD_init
027A .dbline 248
027A ; WDTCR=0x0F;
027A 8FE0 ldi R24,15
027C 81BD out 0x21,R24
027E .dbline 249
027E ; PORTC=0xff;
027E 8FEF ldi R24,255
0280 85BB out 0x15,R24
0282 49C0 xjmp L61
0284 L60:
0284 .dbline 251
0284 ; while(1)
0284 ; {
0284 .dbline 253
0284 ; uchar i,temh,teml;
0284 ; init_1820(); //复位18b20
0284 7BDF xcall _init_1820
0286 .dbline 254
0286 ; write_1820(0xcc); //skip rom
0286 0CEC ldi R16,204
0288 8BDF xcall _write_1820
028A .dbline 255
028A ; write_1820(0x44); // 发出转换命令 convert T
028A 04E4 ldi R16,68
028C 89DF xcall _write_1820
028E .dbline 256
028E ; delay(400);
028E 00E9 ldi R16,400
0290 11E0 ldi R17,1
0292 6DDF xcall _delay
0294 .dbline 257
0294 ; init_1820();
0294 73DF xcall _init_1820
0296 .dbline 258
0296 ; WDR();
0296 A895 wdr
0298 .dbline 259
0298 ; write_1820(0xcc); //发出读命令
0298 0CEC ldi R16,204
029A 82DF xcall _write_1820
029C .dbline 260
029C ; write_1820(0xbe);
029C 0EEB ldi R16,190
029E 80DF xcall _write_1820
02A0 .dbline 261
02A0 ; teml=read_1820(); //读数据
02A0 9ADF xcall _read_1820
02A2 402F mov R20,R16
02A4 .dbline 262
02A4 ; temh=read_1820();
02A4 98DF xcall _read_1820
02A6 602F mov R22,R16
02A8 .dbline 273
02A8 ;
02A8 ; //for(i=0;i<7;i++) //测试用
02A8 ; //{
02A8 ; //send_byte(0x40);
02A8 ; //send_byte(disp_table[0&0x0f]);
02A8 ; //}
02A8 ; //send_byte(disp_table[temh>>4]);
02A8 ; //send_byte(disp_table[temh&0x0f]);
02A8 ; //send_byte(disp_table[teml>>4]);
02A8 ; //send_byte(disp_table[teml&0x0f]);
02A8 ; count=(temh*256+teml)*6.25; //计算具体温度
02A8 00E0 ldi R16,<L63
02AA 10E0 ldi R17,>L63
02AC 0E940000 xcall lpm32
02B0 3A93 st -y,R19
02B2 2A93 st -y,R18
02B4 1A93 st -y,R17
02B6 0A93 st -y,R16
02B8 262F mov R18,R22
02BA 3327 clr R19
02BC 00E0 ldi R16,256
02BE 11E0 ldi R17,1
02C0 0E940000 xcall empy16s
02C4 1801 movw R2,R16
02C6 442E mov R4,R20
02C8 5524 clr R5
02CA 240C add R2,R4
02CC 351C adc R3,R5
02CE 8101 movw R16,R2
02D0 0E940000 xcall int2fp
02D4 3A93 st -y,R19
02D6 2A93 st -y,R18
02D8 1A93 st -y,R17
02DA 0A93 st -y,R16
02DC 0E940000 xcall empy32f
02E0 0E940000 xcall fp2long
02E4 10930100 sts _count+1,R17
02E8 00930000 sts _count,R16
02EC 30930300 sts _count+2+1,R19
02F0 20930200 sts _count+2,R18
02F4 .dbline 274
02F4 ; WDR();
02F4 A895 wdr
02F6 .dbline 276
02F6 ; //disp_led(0,1); //显示温度
02F6 ; for(i=0;i<100;i++) //每次转换需要延时200ms以上
02F6 AA24 clr R10
02F8 04C0 xjmp L67
02FA L64:
02FA .dbline 277
02FA 08EE ldi R16,1000
02FC 13E0 ldi R17,3
02FE 37DF xcall _delay
0300 L65:
0300 .dbline 276
0300 A394 inc R10
0302 L67:
0302 .dbline 276
0302 8A2D mov R24,R10
0304 8436 cpi R24,100
0306 C8F3 brlo L64
0308 .dbline 278
0308 80E0 ldi R24,<L68
030A 90E0 ldi R25,>L68
030C 9983 std y+1,R25
030E 8883 std y+0,R24
0310 2227 clr R18
0312 0027 clr R16
0314 0ADF xcall _LCD_write_string
0316 .dbline 279
0316 L61:
0316 .dbline 250
0316 B6CF xjmp L60
0318 X1:
0318 .dbline -2
0318 L59:
0318 2296 adiw R28,2
031A .dbline 0 ; func end
031A 0895 ret
031C .dbsym r teml 20 c
031C .dbsym r temh 22 c
031C .dbsym r i 10 c
031C .dbend
.area bss(ram, con, rel)
0000 .dbfile C:\DOCUME~1\Administrator\桌面\18b20\1.c
0000 _count::
0000 .blkb 4
0004 .dbsym e count _count L
0004 _dp::
0004 .blkb 1
0005 .dbsym e dp _dp c
.area data(ram, con, rel)
0010 .dbfile C:\DOCUME~1\Administrator\桌面\18b20\1.c
0010 L68:
0010 .blkb 6
.area idata
0010 636F756E7400 .byte 'c,'o,'u,'n,'t,0
.area data(ram, con, rel)
0016 .dbfile C:\DOCUME~1\Administrator\桌面\18b20\1.c
.area lit(rom, con, rel)
0000 L63:
0000 0000C840 .word 0x0,0x40c8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -