📄 main.s
字号:
; do{
.dbline 319
; flag_count=0;
clr R20
.dbline 320
; end_flag=0;
clr R10
.dbline 321
; i=resetDS18B20();
xcall _resetDS18B20
mov R22,R16
.dbline 322
; writeuint8DS18B20(0xf0);
ldi R16,240
xcall _writeuint8DS18B20
.dbline 323
; RLS_DS18B20; //释放总线
cbi 0x1a,0
.dbline 324
; for(chr=0;chr<8;chr++){
clr R12
xjmp L53
L50:
.dbline 324
.dbline 325
; num=0;
clr R0
std y+20,R0
.dbline 326
; for(i=0;i<8;i++){
clr R22
xjmp L57
L54:
.dbline 326
.dbline 327
; num=num>>1;
ldd R0,y+20
lsr R0
std y+20,R0
.dbline 328
; retVal=0;
clr R0
std y+19,R0
.dbline 329
; temp=0;
std y+18,R0
.dbline 331
;
; temp=read_a_bit();
xcall _read_a_bit
std y+18,R16
.dbline 332
; if(temp)
mov R0,R16
tst R16
breq L58
X12:
.dbline 333
; retVal|=0x01;
ldd R24,y+19
ori R24,1
std y+19,R24
L58:
.dbline 334
; retVal<<=1;
ldd R0,y+19
lsl R0
std y+19,R0
.dbline 335
; temp=0;
clr R0
std y+18,R0
.dbline 337
;
; temp=read_a_bit();
xcall _read_a_bit
mov R14,R16
std y+18,R14
.dbline 338
; if(temp)
mov R0,R14
tst R16
breq L60
X13:
.dbline 339
; retVal|=0x01;
ldd R24,y+19
ori R24,1
std y+19,R24
L60:
.dbline 341
;
; if(retVal==bit_1){ //1
ldd R24,y+19
cpi R24,2
brne L62
X14:
.dbline 341
.dbline 342
; write_a_bit(1);
ldi R16,1
xcall _write_a_bit
.dbline 343
; num|=0x80;
ldd R24,y+20
ori R24,128
std y+20,R24
.dbline 344
; }
xjmp L63
L62:
.dbline 345
; else if(retVal==bit_0){ //0
ldd R24,y+19
cpi R24,1
brne L64
X15:
.dbline 345
.dbline 347
;
; write_a_bit(0);
clr R16
xcall _write_a_bit
.dbline 348
; }else { //maybe o or 1
xjmp L65
L64:
.dbline 348
.dbline 349
; if(flag[flag_count]==0){
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
brne L66
X16:
.dbline 349
.dbline 350
; write_a_bit(0);
clr R16
xcall _write_a_bit
.dbline 352
;
; }
xjmp L67
L66:
.dbline 353
; else{
.dbline 354
; write_a_bit(0x01);
ldi R16,1
xcall _write_a_bit
.dbline 355
; num|=0x80;
ldd R24,y+20
ori R24,128
std y+20,R24
.dbline 357
;
; }
L67:
.dbline 358
; flag_count++;
inc R20
.dbline 360
;
; }
L65:
L63:
.dbline 363
;
;
; }
L55:
.dbline 326
inc R22
L57:
.dbline 326
cpi R22,8
brsh X29
xjmp L54
X29:
X17:
.dbline 364
; num2[chr]=num;
movw R24,R28
adiw R24,10
mov R30,R12
clr R31
add R30,R24
adc R31,R25
ldd R0,y+20
std z+0,R0
.dbline 367
;
;
; }
L51:
.dbline 324
inc R12
L53:
.dbline 324
mov R24,R12
cpi R24,8
brsh X30
xjmp L50
X30:
X18:
.dbline 368
; for(i=0;i<8;i++){
clr R22
xjmp L71
L68:
.dbline 368
.dbline 369
; USART_Transmit(num2[i]);
movw R24,R28
adiw R24,10
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _USART_Transmit
.dbline 370
; rom_seq[B20_num][i]=num2[i];
ldi R24,<_rom_seq
ldi R25,>_rom_seq
lds R2,_B20_num
clr R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
add R2,R24
adc R3,R25
mov R30,R22
clr R31
add R30,R2
adc R31,R3
movw R24,R28
adiw R24,10
mov R26,R22
clr R27
add R26,R24
adc R27,R25
ld R2,x
std z+0,R2
.dbline 371
; }
L69:
.dbline 368
inc R22
L71:
.dbline 368
cpi R22,8
brlo L68
X19:
.dbline 372
; B20_num++;
lds R24,_B20_num
subi R24,255 ; addi 1
sts _B20_num,R24
.dbline 373
; for(i=0;i<flag_count;i++){
clr R22
xjmp L75
L72:
.dbline 373
.dbline 374
; if(flag[i]==1)end_flag++;
movw R24,R28
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
cpi R24,1
brne L76
X20:
.dbline 374
inc R10
L76:
.dbline 376
;
; }
L73:
.dbline 373
inc R22
L75:
.dbline 373
cp R22,R20
brlo L72
X21:
.dbline 378
;
; if(end_flag==flag_count)
cp R10,R20
brne L78
X22:
.dbline 379
; {
.dbline 380
; flag_count=0xff;
ldi R20,255
.dbline 381
; USART_Transmit(0xff);
ldi R16,255
xcall _USART_Transmit
.dbline 382
; return 0;
clr R16
xjmp L46
L78:
.dbline 387
; }
;
;
;
; if(flag_count>0&&flag_count!=0xff){ //has bentch
ldi R24,0
cp R24,R20
brlo X31
xjmp L80
X31:
X23:
cpi R20,255
brne X32
xjmp L80
X32:
X24:
.dbline 387
.dbline 388
; flag_count--; //flag_count point to the next one
dec R20
.dbline 389
; if(flag[flag_count]==0){
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
tst R2
brne L85
X25:
.dbline 389
.dbline 390
; flag[flag_count]=1;
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldi R24,1
std z+0,R24
.dbline 391
; }
xjmp L83
L84:
.dbline 393
; else{
; while((flag[flag_count]==1)&&(flag_count>0)){
.dbline 394
; flag[flag_count--]=0;
mov R22,R20
clr R23
subi R20,1
movw R24,R28
mov R30,R22
clr R31
add R30,R24
adc R31,R25
clr R2
std z+0,R2
.dbline 395
; }
L85:
.dbline 393
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R24,z+0
cpi R24,1
brne L87
X26:
ldi R24,0
cp R24,R20
brlo L84
X27:
L87:
.dbline 396
; flag[flag_count]=1;
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldi R24,1
std z+0,R24
.dbline 399
;
;
; }
L83:
.dbline 401
;
; }
L80:
.dbline 403
;
; }while(flag_count!=0xff);
L48:
.dbline 403
cpi R20,255
breq X33
xjmp L47
X33:
X28:
.dbline -2
L46:
.dbline 0 ; func end
adiw R28,21
xjmp pop_xgsetF0FC
.dbsym r end_flag 10 c
.dbsym l num2 10 A[8:8]c
.dbsym r chr 12 c
.dbsym l flag 0 A[10:10]c
.dbsym r flag_count 20 c
.dbsym l num 20 c
.dbsym r i 22 c
.dbsym l retVal 19 c
.dbsym l temp 18 c
.dbend
.dbfunc e match_rom _match_rom fV
; k -> R20
; num -> R10
.even
_match_rom::
st -y,R10
st -y,R20
mov R10,R16
.dbline -1
.dbline 407
;
; }
;
; void match_rom(unsigned char num){
.dbline 409
; unsigned char k;
; k=resetDS18B20();
xcall _resetDS18B20
.dbline 410
; writeuint8DS18B20(0x55); //match common
ldi R16,85
xcall _writeuint8DS18B20
.dbline 411
; for(k=0;k<8;k++)
clr R20
xjmp L92
L89:
.dbline 412
; writeuint8DS18B20(rom_seq[num][k]);
ldi R24,<_rom_seq
ldi R25,>_rom_seq
mov R2,R10
clr R3
lsl R2
rol R3
lsl R2
rol R3
lsl R2
rol R3
add R2,R24
adc R3,R25
mov R30,R20
clr R31
add R30,R2
adc R31,R3
ldd R16,z+0
xcall _writeuint8DS18B20
L90:
.dbline 411
inc R20
L92:
.dbline 411
cpi R20,8
brlo L89
X34:
.dbline -2
L88:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r k 20 c
.dbsym r num 10 c
.dbend
.dbfunc e readTemp_DS18B20 _readTemp_DS18B20 fi
; x -> R10,R11
; tempH -> R12
; tempL -> R10
; num -> R10
.even
_readTemp_DS18B20::
xcall push_xgset003C
mov R10,R16
.dbline -1
.dbline 416
;
; }
;
; unsigned int readTemp_DS18B20(unsigned char num){
.dbline 419
; unsigned char tempL,tempH;
; unsigned int x;
; match_rom(num);
mov R16,R10
xcall _match_rom
.dbline 420
; writeuint8DS18B20(0x44); //启动温度转换
ldi R16,68
xcall _writeuint8DS18B20
.dbline 421
; delayUs(1);
ldi R16,1
xcall _delayUs
.dbline 422
; resetDS18B20();
xcall _resetDS18B20
.dbline 423
; match_rom(num);
mov R16,R10
xcall _match_rom
.dbline 424
; writeuint8DS18B20(0xbe); //读数据
ldi R16,190
xcall _writeuint8DS18B20
.dbline 425
; tempL=readuint8DS18B20();
xcall _readuint8DS18B20
mov R10,R16
.dbline 426
; tempH=readuint8DS18B20();
xcall _readuint8DS18B20
mov R12,R16
.dbline 427
; x=(tempH<<8)|tempL;
mov R11,R12
.dbline 428
; return(x);
movw R16,R10
.dbline -2
L93:
.dbline 0 ; func end
xjmp pop_xgset003C
.dbsym r x 10 i
.dbsym r tempH 12 c
.dbsym r tempL 10 c
.dbsym r num 10 c
.dbend
.dbfunc e output _output fV
; t -> R20
; number -> R20
; temp -> R22,R23
.even
_output::
xcall push_xgsetF000
mov R20,R18
movw R22,R16
.dbline -1
.dbline 431
; }
;
; void output(uint16 temp,unsigned char number){
.dbline 433
; unsigned char t;
; USART_Transmit('N');
ldi R16,78
xcall _USART_Transmit
.dbline 434
; USART_Transmit('O');
ldi R16,79
xcall _USART_Transmit
.dbline 435
; USART_Transmit(':');
ldi R16,58
xcall _USART_Transmit
.dbline 436
; USART_Transmit(number+0x30);
mov R16,R20
subi R16,208 ; addi 48
xcall _USART_Transmit
.dbline 437
; USART_Transmit('-');
ldi R16,45
xcall _USART_Transmit
.dbline 438
; t=(temp&0xf0)>>4;
movw R20,R22
andi R20,240
andi R21,0
lsr R21
ror R20
lsr R21
ror R20
lsr R21
ror R20
lsr R21
ror R20
.dbline 439
; if(t>9)t='A'+t-10;
ldi R24,9
cp R24,R20
brsh L95
X35:
.dbline 439
mov R24,R20
subi R24,191 ; addi 65
subi R24,10
mov R20,R24
xjmp L96
L95:
.dbline 440
; else t='0'+t;
subi R20,208 ; addi 48
L96:
.dbline 441
; USART_Transmit(t);
mov R16,R20
xcall _USART_Transmit
.dbline 442
; t=(temp&0x0f);
mov R20,R22
andi R20,15
andi R21,0
.dbline 443
; if(t>9)t='A'+t-10;
ldi R24,9
cp R24,R20
brsh L97
X36:
.dbline 443
mov R24,R20
subi R24,191 ; addi 65
subi R24,10
mov R20,R24
xjmp L98
L97:
.dbline 444
; else t='0'+t;
subi R20,208 ; addi 48
L98:
.dbline 445
; USART_Transmit(t);
mov R16,R20
xcall _USART_Transmit
.dbline 446
; USART_Transmit(0x0d);
ldi R16,13
xcall _USART_Transmit
.dbline -2
L94:
.dbline 0 ; func end
xjmp pop_xgsetF000
.dbsym r t 20 c
.dbsym r number 20 c
.dbsym r temp 22 i
.dbend
.dbfunc e get_temp _get_temp fV
; temp -> R10
; i -> R12,R13
; number -> R20
.even
_get_temp::
xcall push_xgset303C
.dbline -1
.dbline 451
;
;
;
; }
; void get_temp(void){
.dbline 453
; uint16 i; //读温度值的暂存变量
; unsigned char temp=0;
clr R10
.dbline 454
; unsigned char number=0;
clr R20
.dbline 455
; i=resetDS18B20();
xcall _resetDS18B20
mov R12,R16
clr R13
.dbline 456
; for(number=0;number<maxsize;number++){
xjmp L103
L100:
.dbline 456
.dbline 457
; i=readTemp_DS18B20(number);
mov R16,R20
xcall _readTemp_DS18B20
movw R12,R16
.dbline 458
; if(i&(1<<3)) //判断倒数第四位是1还是0
sbrs R16,3
rjmp L104
X37:
.dbline 459
; {
.dbline 460
; temp=i>>4+1;
ldi R18,5
ldi R19,0
xcall lsr16
mov R10,R16
.dbline 461
; }
xjmp L105
L104:
.dbline 463
; else
; {
.dbline 464
; temp=i>>4;
movw R10,R12
lsr R11
ror R10
lsr R11
ror R10
lsr R11
ror R10
lsr R11
ror R10
.dbline 465
; }
L105:
.dbline 466
; tep[number][0]=temp;
ldi R24,10
mul R24,R20
movw R30,R0
ldi R24,<_tep
ldi R25,>_tep
add R30,R24
adc R31,R25
std z+0,R10
.dbline 467
; }
L101:
.dbline 456
inc R20
L103:
.dbline 456
cpi R20,7
brlo L100
X38:
.dbline -2
L99:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r temp 10 c
.dbsym r i 12 i
.dbsym r number 20 c
.dbend
.dbfunc e main _main fV
; number -> R12
; temp -> R10
.even
_main::
.dbline -1
.dbline 475
;
;
; }
;
;
;
; void main(void)
; {
.dbline 477
;
; unsigned char temp=0;
.dbline 478
; unsigned char number=0;
clr R12
.dbline 479
; port_init();
xcall _port_init
.dbline 481
;
; USART_Init(9600); //波特率9600 初始化串口
ldi R16,9600
ldi R17,37
xcall _USART_Init
.dbline 482
; USART_Transmit('O');
ldi R16,79
xcall _USART_Transmit
.dbline 483
; USART_Transmit('K');
ldi R16,75
xcall _USART_Transmit
.dbline 484
; temp=read_rom();
xcall _read_rom
mov R10,R16
L107:
.dbline 487
;
; while(1)
; {
.dbline 490
;
;
; }//end while(1)
L108:
.dbline 486
xjmp L107
X39:
.dbline -2
L106:
.dbline 0 ; func end
ret
.dbsym r number 12 c
.dbsym r temp 10 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\cood\18b20\main.c
_tep::
.blkb 70
.dbsym e tep _tep A[70:7:10]c
_B20_num::
.blkb 1
.dbsym e B20_num _B20_num c
_rom_seq::
.blkb 56
.dbsym e rom_seq _rom_seq A[56:7:8]c
; }
;
; /*
; 假设你只要精确到1度
;
; 换算温度用很简单的方法就可以处理:
;
; 首先判断是正温度还是负温度
; 然后判断倒数第四位是1还是0
; 如果是1且温度为正,那么 温度=x>>4+1;
; 如果是1且温度为负,那么 温度=x>>4-1;
; 如果是0,温度=x>>4;
;
; 这样的操作可以节省很多的flah空间。
; */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -