📄 ds18b20.s
字号:
.dbline 116
; delay_nus(80); /*延时80uS*/
; DQ_SET; /*位结束*/
; value >>= 1;
; }
; if (flag & 0x80) { /*恢复中断状态*/
; SEI();
; }
; }
;
; /*启动ds1820转换*/
; void ds1820_start(void) {
.dbline 118
;
; ds1820_reset();
xcall _ds1820_reset
.dbline 119
; ds1820_write_byte(0xCC); /*勿略地址*/
ldi R16,204
xcall _ds1820_write_byte
.dbline 120
; ds1820_write_byte(0x44); /*启动转换*/
ldi R16,68
xcall _ds1820_write_byte
.dbline -2
L40:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ds1820_read_temp _ds1820_read_temp fi
; buf -> y+0
; i -> R20,R21
.even
_ds1820_read_temp::
xcall push_gset1
sbiw R28,9
.dbline -1
.dbline 124
; }
;
; /*DS8B20读取温度信息*/
; unsigned int ds1820_read_temp(void) {
.dbline 129
;
; unsigned int i;
; unsigned char buf[9];
;
; ds1820_reset();
xcall _ds1820_reset
.dbline 130
; ds1820_write_byte(0xCC); /*勿略地址*/
ldi R16,204
xcall _ds1820_write_byte
.dbline 131
; ds1820_write_byte(0xBE); /*读取温度*/
ldi R16,190
xcall _ds1820_write_byte
.dbline 132
clr R20
clr R21
xjmp L45
L42:
.dbline 132
.dbline 133
xcall _ds1820_read_byte
movw R24,R28
movw R30,R20
add R30,R24
adc R31,R25
std z+0,R16
.dbline 134
L43:
.dbline 132
subi R20,255 ; offset = 1
sbci R21,255
L45:
.dbline 132
; for (i = 0; i < 9; i++) {
cpi R20,9
ldi R30,0
cpc R21,R30
brlo L42
.dbline 135
; buf[i] = ds1820_read_byte();
; }
; i = buf[1];
ldd R20,y+1
clr R21
.dbline 136
; i <<= 8;
mov R21,R20
clr R20
.dbline 137
; i |= buf[0];
ldd R2,y+0
clr R3
or R20,R2
or R21,R3
.dbline 139
;
; return i;
movw R16,R20
.dbline -2
L41:
adiw R28,9
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym l buf 0 A[9:9]c
.dbsym r i 20 i
.dbend
.dbfunc e time_to_disbuffer _time_to_disbuffer fV
; d -> y+2
; c -> y+0
; b -> R18,R19
; a -> R16,R17
.even
_time_to_disbuffer::
.dbline -1
.dbline 142
; }
; void time_to_disbuffer(int a,int b,int c,int d)//时间送显示缓冲区函数
; {
.dbline 144
;
; dis_buff[0] = a;
sts _dis_buff,R16
.dbline 145
; dis_buff[1] =b;
sts _dis_buff+1,R18
.dbline 146
; dis_buff[2] = c;
ldd R2,y+0
ldd R3,y+1
sts _dis_buff+2,R2
.dbline 147
; dis_buff[3] =d;
ldd R2,y+2
ldd R3,y+3
sts _dis_buff+3,R2
.dbline -2
L47:
.dbline 0 ; func end
ret
.dbsym l d 2 I
.dbsym l c 0 I
.dbsym r b 18 I
.dbsym r a 16 I
.dbend
.dbfunc e display _display fV
.even
_display::
.dbline -1
.dbline 151
.dbline 151
ldi R24,255
out 0x12,R24
.dbline 152
ldi R24,<_dis_buff
ldi R25,>_dis_buff
lds R30,_posit
clr R31
add R30,R24
adc R31,R25
ldd R30,z+0
clr R31
ldi R24,<_led_7
ldi R25,>_led_7
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x15,R2
.dbline 153
ldi R24,<_position
ldi R25,>_position
lds R30,_posit
clr R31
add R30,R24
adc R31,R25
ldd R2,z+0
out 0x12,R2
.dbline 154
lds R24,_posit
subi R24,255 ; addi 1
mov R2,R24
sts _posit,R2
cpi R24,4
brlo L52
.dbline 154
clr R2
sts _posit,R2
L52:
.dbline -2
L51:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 76
jmp _TIMER0_COMP
.area text(rom, con, rel)
.dbfile G:\ds18b20\ds18b20.c
.dbfunc e TIMER0_COMP _TIMER0_COMP fV
.even
_TIMER0_COMP::
xcall push_lset
.dbline -1
.dbline 160
;
; }
; void display(void)//数码管显示程序
; { PORTD = 0xff;
; PORTC = led_7[dis_buff[posit]];
; PORTD= position[posit];
; if (++posit >=4 ) posit = 0;
; }
;
; // Timer 0 比较匹配中断服务
; #pragma interrupt_handler TIMER0_COMP:20
; void TIMER0_COMP(void)
; {
.dbline 161
; display();
xcall _display
.dbline -2
L54:
xcall pop_lset
.dbline 0 ; func end
reti
.dbend
.dbfunc e main _main fV
; j -> <dead>
; i -> R20,R21
.even
_main::
sbiw R28,4
.dbline -1
.dbline 166
;
; }
;
; void main(void)
; {
.dbline 168
; int i,j;
; PORTD=0xFF; // 显示控制I/O端口初始化
ldi R24,255
out 0x12,R24
.dbline 169
; DDRD=0xFF;
out 0x11,R24
.dbline 170
; PORTC=0XfF;
out 0x15,R24
.dbline 171
; DDRC=0xFF;
out 0x14,R24
.dbline 176
;
;
; // T/C0 初始化
;
; TCCR0=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
ldi R24,11
out 0x33,R24
.dbline 177
; TCNT0=0x00;
clr R2
out 0x32,R2
.dbline 178
; OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms
ldi R24,124
out 0x3c,R24
.dbline 179
; TIMSK=0x02; // 允许T/C0比较匹配中断
ldi R24,2
out 0x39,R24
.dbline 180
; SEI(); //允许全局中断
sei
xjmp L57
L56:
.dbline 182
;
; while (1) {
.dbline 183
; ds1820_start(); /*启动一次转换*/
xcall _ds1820_start
.dbline 184
; delay_nms(10); /*等待转换结束*/
ldi R16,10
ldi R17,0
xcall _delay_nms
.dbline 185
; i=ds1820_read_temp(); /*读取温度数值*/
xcall _ds1820_read_temp
movw R20,R16
.dbline 186
; if(i>=0xf000)//判断是不是负数
cpi R16,0
ldi R30,240
cpc R17,R30
brsh X1
xjmp L59
X1:
.dbline 187
; {
.dbline 188
; i=~i; //转换,先取反,在加1.
com R20
com R21
.dbline 189
; i+=1;
subi R20,255 ; offset = 1
sbci R21,255
.dbline 190
; i = (i * 10) / 16; /*数值处理*/
ldi R16,10
ldi R17,0
movw R18,R20
xcall empy16s
ldi R18,16
ldi R19,0
xcall div16s
movw R20,R16
.dbline 191
; led_buf[3] = i / 1000; /*将显示信息加载到显示缓存区*/
ldi R18,1000
ldi R19,3
xcall div16s
sts _led_buf+3,R16
.dbline 192
; i = i % 1000;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 193
; led_buf[2] = i / 100;
ldi R18,100
ldi R19,0
xcall div16s
sts _led_buf+2,R16
.dbline 194
; i = i % 100;
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 195
; led_buf[1] = i / 10;
ldi R18,10
ldi R19,0
xcall div16s
sts _led_buf+1,R16
.dbline 196
; led_buf[0] = i % 10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16s
sts _led_buf,R16
.dbline 197
; time_to_disbuffer(led_buf[1],led_buf[2],10,11);
ldi R24,11
ldi R25,0
std y+3,R25
std y+2,R24
ldi R24,10
std y+1,R25
std y+0,R24
lds R18,_led_buf+2
clr R19
lds R16,_led_buf+1
clr R17
xcall _time_to_disbuffer
.dbline 198
; }
xjmp L60
L59:
.dbline 200
; else
; {
.dbline 201
; i = (i * 10) / 16; /*数值处理*/
ldi R16,10
ldi R17,0
movw R18,R20
xcall empy16s
ldi R18,16
ldi R19,0
xcall div16s
movw R20,R16
.dbline 202
; led_buf[3] = i / 1000; /*将显示信息加载到显示缓存区*/
ldi R18,1000
ldi R19,3
xcall div16s
sts _led_buf+3,R16
.dbline 203
; i = i % 1000;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 204
; led_buf[2] = i / 100;
ldi R18,100
ldi R19,0
xcall div16s
sts _led_buf+2,R16
.dbline 205
; i = i % 100;
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 206
; led_buf[1] = i / 10;
ldi R18,10
ldi R19,0
xcall div16s
sts _led_buf+1,R16
.dbline 207
; led_buf[0] = i % 10;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16s
sts _led_buf,R16
.dbline 208
; time_to_disbuffer(led_buf[1],led_buf[2],led_buf[3],led_buf[0]);
mov R2,R16
clr R3
std y+3,R3
std y+2,R2
lds R2,_led_buf+3
clr R3
std y+1,R3
std y+0,R2
lds R18,_led_buf+2
clr R19
lds R16,_led_buf+1
clr R17
xcall _time_to_disbuffer
.dbline 209
; }
L60:
.dbline 210
L57:
.dbline 182
xjmp L56
X0:
.dbline -2
L55:
adiw R28,4
.dbline 0 ; func end
ret
.dbsym l j 5 I
.dbsym r i 20 I
.dbend
.area bss(ram, con, rel)
.dbfile G:\ds18b20\ds18b20.c
_posit::
.blkb 1
.dbsym e posit _posit c
_dis_buff::
.blkb 4
.dbsym e dis_buff _dis_buff A[4:4]c
_flag::
.blkb 1
.dbsym e flag _flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -