📄 can18b20.s
字号:
mov R2,R22
clr R3
eor R2,R24
eor R3,R25
mov R22,R2
L61:
.dbline 194
lsr R10
.dbline 195
L58:
.dbline 186
inc R12
L60:
.dbline 186
mov R24,R12
cpi R24,8
brlo L57
.dbline 196
L54:
.dbline 183
inc R20
L56:
.dbline 183
cp R20,R6
brlo L53
.dbline 197
; byte >>= 1;
; }
; }
; return temp;
mov R16,R22
.dbline -2
L52:
adiw R28,1
rcall pop_gset5
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r r 14 c
.dbsym l cbit 0 c
.dbsym r bit0 8 c
.dbsym r byte 10 c
.dbsym r i 12 c
.dbsym r temp 22 c
.dbsym r len 6 c
.dbsym r p 4 pc
.dbend
.dbfunc e delay_us _delay_us fV
; time -> R16,R17
.even
_delay_us::
.dbline -1
.dbline 207
; }
;
; /*===================================================================
; // 函数功能: us延时函数
; // 形参: void
; // 返回: void
; // 编写: 2004/8/25
; ===================================================================*/
; void delay_us(unsigned int time)
; {
L64:
.dbline 209
; do
; { //delay_1us();
.dbline 210
; time--;
subi R16,1
sbci R17,0
.dbline 211
; }
L65:
.dbline 212
; while (time>1);
ldi R24,1
ldi R25,0
cp R24,R16
cpc R25,R17
brlo L64
.dbline -2
L63:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e ds1820_ack _ds1820_ack fc
; ack -> R20
.even
_ds1820_ack::
rcall push_gset1
.dbline -1
.dbline 222
; }
;
; /*===================================================================
; // 函数功能: 判断总线应答
; // 形参: void
; // 返回: unsigned char true为应答
; // 编写: 2004/8/25
; ===================================================================*/
; unsigned char ds1820_ack(void)
; {
.dbline 224
; unsigned char ack;
; DDRC |= DQ;
sbi 0x14,5
.dbline 225
; PORTC &= ~DQ;
cbi 0x15,5
.dbline 226
; delay_us(450); // reset
ldi R16,450
ldi R17,1
rcall _delay_us
.dbline 227
; PORTC |= DQ;
sbi 0x15,5
.dbline 228
; DDRC &= ~DQ;
cbi 0x14,5
.dbline 229
; delay_us(45);
ldi R16,45
ldi R17,0
rcall _delay_us
.dbline 230
; ack = DQ & PIND;
in R20,0x10
andi R20,32
.dbline 231
; delay_us(450); // host receive
ldi R16,450
ldi R17,1
rcall _delay_us
.dbline 232
; if(ack)
tst R20
breq L68
.dbline 233
; return 1;
ldi R16,1
rjmp L67
L68:
.dbline 235
; else
; return 0;
clr R16
.dbline -2
L67:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r ack 20 c
.dbend
.dbfunc e read_byte _read_byte fc
; value -> R20
; i -> R22
.even
_read_byte::
rcall push_gset2
.dbline -1
.dbline 245
; }
;
; /*===================================================================
; // 函数功能: 从 1-wire 总线上读取一个字节
; // 形参: void
; // 返回: unsigned char 读到的值
; // 编写: 2004/8/25
; ===================================================================*/
; unsigned char read_byte(void)
; {
.dbline 247
; unsigned char i;
; unsigned char value = 0;
clr R20
.dbline 248
; for(i = 8; i > 0; i--)
ldi R22,8
rjmp L74
L71:
.dbline 249
; {
.dbline 250
; value >>= 1; // low bit first
lsr R20
.dbline 251
; DDRC |= DQ;
sbi 0x14,5
.dbline 252
; PORTC &= ~DQ; // pull DQ low to start timeslot
cbi 0x15,5
.dbline 253
; delay_us(3);
ldi R16,3
ldi R17,0
rcall _delay_us
.dbline 254
; PORTC |= DQ;
sbi 0x15,5
.dbline 255
; DDRC &= ~DQ; // release bus
cbi 0x14,5
.dbline 256
; delay_us(10);
ldi R16,10
ldi R17,0
rcall _delay_us
.dbline 257
; if(DQ & PINC)
sbis 0x13,5
rjmp L75
.dbline 258
; value|=0x80;
ori R20,128
L75:
.dbline 259
ldi R16,100
ldi R17,0
rcall _delay_us
.dbline 260
sbi 0x14,5
.dbline 261
ldi R16,5
ldi R17,0
rcall _delay_us
.dbline 262
L72:
.dbline 248
dec R22
L74:
.dbline 248
clr R2
cp R2,R22
brlo L71
.dbline 263
; delay_us(100);
; DDRC |= DQ;
; delay_us(5); // time interval
; }
; return(value);
mov R16,R20
.dbline -2
L70:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r value 20 c
.dbsym r i 22 c
.dbend
.dbfunc e write_byte _write_byte fV
; i -> R20
; value -> R22
.even
_write_byte::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 273
; }
;
; /*===================================================================
; // 函数功能: 向 1-WIRE 总线上写一个字节
; // 形参: value 写到总线上的值
; // 返回: void
; // 编写: 2004/8/25
; ===================================================================*/
; void write_byte(unsigned char value)
; {
.dbline 275
; unsigned char i;
; DDRC |= DQ;
sbi 0x14,5
.dbline 276
; for(i = 8; i > 0; i--)
ldi R20,8
rjmp L81
L78:
.dbline 277
; {
.dbline 278
; if(value & 0x01)
sbrs R22,0
rjmp L82
.dbline 279
; {
.dbline 280
; PORTC &= ~DQ; // pull DQ low to start timeslot
cbi 0x15,5
.dbline 281
; delay_us(10);
ldi R16,10
ldi R17,0
rcall _delay_us
.dbline 282
; PORTC |= DQ;
sbi 0x15,5
.dbline 283
; delay_us(100);
ldi R16,100
ldi R17,0
rcall _delay_us
.dbline 284
; }
rjmp L83
L82:
.dbline 286
; else
; {
.dbline 287
; PORTC &= ~DQ; // pull DQ low to start timeslot
cbi 0x15,5
.dbline 288
; delay_us(100);
ldi R16,100
ldi R17,0
rcall _delay_us
.dbline 289
; PORTC |= DQ;
sbi 0x15,5
.dbline 290
; delay_us(10);
ldi R16,10
ldi R17,0
rcall _delay_us
.dbline 291
; }
L83:
.dbline 292
lsr R22
.dbline 293
L79:
.dbline 276
dec R20
L81:
.dbline 276
clr R2
cp R2,R20
brlo L78
.dbline -2
L77:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r value 22 c
.dbend
.dbfunc e wait _wait fV
; i -> R20,R21
; n -> R22,R23
.even
_wait::
rcall push_gset2
movw R22,R16
.dbline -1
.dbline 377
; value >>= 1;
; }
; }
;
; /*===================================================================
; // 函数功能: 读取温度
; // 形参: *temperature 温度存储空间
; // 返回: unsigned char true为有效
; // 编写: 2004/8/25
; ===================================================================*/
; /*unsigned char Read_Temperature(unsigned int *temperature)
; {
; unsigned char i;
; union{
; unsigned char c[2];
; unsigned int x;
; }temp;
; unsigned char temporary[9];
;
; while(!ds1820_ack());
; write_byte(0xCC); // Skip ROM
; write_byte(0x44); // Start Conversion
; //for(i = 0; i < 16; i++)
; //delay_us(50000);
; delay(20);
; while(!ds1820_ack());
; write_byte(0xCC); // Skip ROM
; write_byte(0xBE); // Read Scratch Pad
; for(i = 0; i < 9; i++)
; temporary[i] = read_byte();
; temp.c[0] = temporary[0];
; temp.c[1] = temporary[1];
;
; if(crccheck(temporary,9))
; return 0;
; else
; {
; *temperature = temp.x;
; return 1;
; }
; }
; */
; /*===================================================================
; // 函数功能: 读取Rom Code
; // 形参: *temp DS18B20的Rom Code存储空间
; // 返回: unsigned char true为有效
; // 编写: 2004/8/25
; ===================================================================*/
; /*unsigned char Read_RomCode(unsigned char *temp)
; {
; ds1820_ack();
; write_byte(0x33);
; temp[0] = read_byte();
; temp[1] = read_byte();
; temp[2] = read_byte();
; temp[3] = read_byte();
; temp[4] = read_byte();
; temp[5] = read_byte();
; temp[6] = read_byte();
; temp[7] = read_byte();
; if(crccheck(temp,8))
; return 0;
; else
; return 1;
; }
; */
; /*===================================================================
; // 函数功能: 匹配DS18B20
; // 形参: *p DS18B20的Rom Code
; // 返回: void
; // 编写: 2004/8/25
; ===================================================================*/
; /*void ds1820_match(unsigned char *p)
; {
; unsigned char i;
; ds1820_ack();
; write_byte(0x55);
; for(i=0;i<8;i++)
; write_byte(p[i]);
; }
; */
;
;
; /*nms delay*/
; void wait(unsigned int n)
; {unsigned int i;
.dbline 378
; for(i=0;i<n;i++)
clr R20
clr R21
rjmp L88
L85:
.dbline 379
rcall _delay_1ms
L86:
.dbline 378
subi R20,255 ; offset = 1
sbci R21,255
L88:
.dbline 378
cp R20,R22
cpc R21,R23
brlo L85
.dbline -2
L84:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 22 i
.dbend
.dbfunc e delay_1ms _delay_1ms fV
; i -> R16,R17
.even
_delay_1ms::
.dbline -1
.dbline 384
; delay_1ms();
; }
;
; /*1ms delay*/
; void delay_1ms(void)
; {unsigned int i;
.dbline 385
clr R16
clr R17
rjmp L93
L90:
.dbline 385
L91:
.dbline 385
subi R16,255 ; offset = 1
sbci R17,255
L93:
.dbline 385
; for(i=0;i<1035;i++);
cpi R16,11
ldi R30,4
cpc R17,R30
brlo L90
.dbline -2
L89:
.dbline 0 ; func end
ret
.dbsym r i 16 i
.dbend
.dbfunc e delay _delay fV
; i -> R20,R21
; n -> R16,R17
.even
_delay::
rcall push_gset1
.dbline -1
.dbline 389
; }
;
; void delay(unsigned int n)
; { unsigned int i;
.dbline 390
; for(i=0;i<n;i++)
clr R20
clr R21
rjmp L98
L95:
.dbline 391
nop
L96:
.dbline 390
subi R20,255 ; offset = 1
sbci R21,255
L98:
.dbline 390
cp R20,R16
cpc R21,R17
brlo L95
.dbline -2
L94:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r n 16 i
.dbend
.dbfunc e HC595_SENDDAT _HC595_SENDDAT fV
; i -> R20
; dat -> R16
.even
_HC595_SENDDAT::
rcall push_gset1
.dbline -1
.dbline 396
; asm("nop");
; }
;
; /*595数据传输*/
; void HC595_SENDDAT(unsigned char dat)
; {unsigned char i;
.dbline 397
; C_CS; //cs 拉低
cbi 0x15,1
.dbline 398
; asm("nop");
nop
.dbline 399
; for(i=0;i<8;i++)
clr R20
rjmp L103
L100:
.dbline 400
; {C_CLK ; //时钟拉低
.dbline 400
cbi 0x15,0
.dbline 401
; asm("nop");
nop
.dbline 402
; if((dat&0x80)!=0)
sbrs R16,7
rjmp L104
.dbline 403
; S_DATA;
sbi 0x15,2
rjmp L105
L104:
.dbline 405
; else
; C_DATA;
cbi 0x15,2
L105:
.dbline 406
lsl R16
.dbline 407
nop
.dbline 408
sbi 0x15,0
.dbline 409
L101:
.dbline 399
inc R20
L103:
.dbline 399
cpi R20,8
brlo L100
.dbline 410
; dat<<=1;
; asm("nop");
; S_CLK; // 时钟拉高
; }
; S_CS; //cs 拉高
sbi 0x15,1
.dbline -2
L99:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r dat 16 c
.dbend
.area vector(rom, abs)
.org 18
rjmp _time0_ovf_isr
.area text(rom, con, rel)
.dbfile F:\can-18b20(无浮点再调试)\can18b20.c
.dbfunc e time0_ovf_isr _time0_ovf_isr fV
.even
_time0_ovf_isr::
rcall push_lset
.dbline -1
.dbline 415
; }
; //定时器1中断,1ms中断一次
; #pragma interrupt_handler time0_ovf_isr:10
; void time0_ovf_isr(void)
; {
.dbline 416
; TCNT0=0xF8; //重新装置
ldi R24,248
out 0x32,R24
.dbline 417
; count++;
lds R24,_count
lds R25,_count+1
adiw R24,1
sts _count+1,R25
sts _count,R24
.dbline 418
; if(count>=100) //100ms
cpi R24,100
ldi R30,0
cpc R25,R30
brlo L107
.dbline 419
; count=0;
clr R2
clr R3
sts _count+1,R3
sts _count,R2
L107:
.dbline 420
; if(flag==0)
lds R2,_flag
tst R2
brne L109
.dbline 421
; { flag=1;
.dbline 421
ldi R24,1
sts _flag,R24
.dbline 423
; //个位显示
; PORTC&=(~0x18);
in R24,0x15
andi R24,231
out 0x15,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -