📄 温度测量.s
字号:
; DDRA|=0x01;
sbi 0x1a,0
.dbline 127
; for (j=0;j<=7;j++)
clr R10
xjmp L35
L32:
.dbline 128
; {
.dbline 129
; i=wdata&0x01;
mov R22,R20
andi R22,1
.dbline 130
; if(i==0x01)
cpi R22,1
brne L36
X7:
.dbline 131
; {
.dbline 132
; PORTA&=0xfe;
in R24,0x1b
andi R24,254
out 0x1b,R24
.dbline 133
; delay_18B20(10);
ldi R16,10
ldi R17,0
xcall _delay_18B20
.dbline 134
; PORTA|=0x01;
sbi 0x1b,0
.dbline 135
; delay_18B20(100);
ldi R16,100
ldi R17,0
xcall _delay_18B20
.dbline 136
; }
xjmp L37
L36:
.dbline 138
; else
; {
.dbline 139
; PORTA&=0xfe;
in R24,0x1b
andi R24,254
out 0x1b,R24
.dbline 140
; delay_18B20(100);
ldi R16,100
ldi R17,0
xcall _delay_18B20
.dbline 141
; PORTA|=0x01;
sbi 0x1b,0
.dbline 142
; delay_18B20(10);
ldi R16,10
ldi R17,0
xcall _delay_18B20
.dbline 143
; }
L37:
.dbline 144
; wdata=wdata>>1;
lsr R20
.dbline 145
; }
L33:
.dbline 127
inc R10
L35:
.dbline 127
ldi R24,7
cp R24,R10
brsh L32
X8:
.dbline -2
L31:
.dbline 0 ; func end
xjmp pop_xgsetF00C
.dbsym r i 22 c
.dbsym r j 10 c
.dbsym r wdata 20 c
.dbend
.dbfunc e ds1820disp _ds1820disp fV
; flagdat -> R20
.even
_ds1820disp::
st -y,R20
.dbline -1
.dbline 150
; }
;
; /******************************************************************/
; void ds1820disp()//温度值显示
; {
.dbline 152
; uchar flagdat;
; DDRB|=0xFF;
in R24,0x17
ori R24,255
out 0x17,R24
.dbline 153
; DDRC|=(1<<3)|(1<<4)|(1<<5);
in R24,0x14
ori R24,56
out 0x14,R24
.dbline 154
; adata[0]=tvalue/1000+0x30;//百位数
ldi R18,1000
ldi R19,3
lds R16,_tvalue
lds R17,_tvalue+1
xcall div16u
movw R24,R16
adiw R24,48
sts _adata,R24
.dbline 155
; adata[1]=tvalue%1000/100+0x30;//十位数
ldi R18,1000
ldi R19,3
lds R16,_tvalue
lds R17,_tvalue+1
xcall mod16u
ldi R18,100
ldi R19,0
xcall div16u
movw R24,R16
adiw R24,48
sts _adata+1,R24
.dbline 156
; adata[2]=tvalue%100/10+0x30;//个位数
ldi R18,100
ldi R19,0
lds R16,_tvalue
lds R17,_tvalue+1
xcall mod16u
ldi R18,10
ldi R19,0
xcall div16u
movw R24,R16
adiw R24,48
sts _adata+2,R24
.dbline 157
; adata[3]=tvalue%10+0x30;//小数位
ldi R18,10
ldi R19,0
lds R16,_tvalue
lds R17,_tvalue+1
xcall mod16u
movw R24,R16
adiw R24,48
sts _adata+3,R24
.dbline 158
; if(tflag==0)
lds R2,_tflag
tst R2
brne L42
X9:
.dbline 159
; flagdat=0x20;//正温度不显示符号
ldi R20,32
xjmp L43
L42:
.dbline 161
; else
; flagdat=0x2d;//负温度显示负号:-
ldi R20,45
L43:
.dbline 162
; if(adata[0]==0x30)
lds R24,_adata
cpi R24,48
brne L44
X10:
.dbline 163
; {
.dbline 164
; adata[0]=0x20;//如果百位为0,不显示
ldi R24,32
sts _adata,R24
.dbline 165
; if(adata[1]==0x30)
lds R24,_adata+1
cpi R24,48
brne L46
X11:
.dbline 166
; {
.dbline 167
; adata[1]=0x20;//如果百位为0,十位为0也不显示
ldi R24,32
sts _adata+1,R24
.dbline 168
; }
L46:
.dbline 169
; }
L44:
.dbline 170
; if(n==0)
lds R2,_n
tst R2
brne L50
X12:
.dbline 171
; {
.dbline 172
; wr_com(0x80);
ldi R16,128
xcall _wr_com
.dbline 173
; display(str1);
ldi R16,<_str1
ldi R17,>_str1
xcall _display
.dbline 174
; }
xjmp L51
L50:
.dbline 175
; else if(n==1)
lds R24,_n
cpi R24,1
brne L52
X13:
.dbline 176
; {
.dbline 177
; wr_com(0x80);
ldi R16,128
xcall _wr_com
.dbline 178
; display(str2);
ldi R16,<_str2
ldi R17,>_str2
xcall _display
.dbline 179
; }
xjmp L53
L52:
.dbline 180
; else if(n==2)
lds R24,_n
cpi R24,2
brne L54
X14:
.dbline 181
; {
.dbline 182
; wr_com(0x80);
ldi R16,128
xcall _wr_com
.dbline 183
; display(str3);
ldi R16,<_str3
ldi R17,>_str3
xcall _display
.dbline 184
; }
xjmp L55
L54:
.dbline 185
; else if(n==3)
lds R24,_n
cpi R24,3
brne L56
X15:
.dbline 186
; {
.dbline 187
; wr_com(0x80);
ldi R16,128
xcall _wr_com
.dbline 188
; display(str4);
ldi R16,<_str4
ldi R17,>_str4
xcall _display
.dbline 189
; }
L56:
L55:
L53:
L51:
.dbline 190
; wr_com(0xc0);
ldi R16,192
xcall _wr_com
.dbline 191
; wr_dat(flagdat);//显示符号位
mov R16,R20
xcall _wr_dat
.dbline 192
; wr_com(0xc1);
ldi R16,193
xcall _wr_com
.dbline 193
; wr_dat(adata[0]);//显示百位
lds R16,_adata
xcall _wr_dat
.dbline 194
; wr_com(0xc2);
ldi R16,194
xcall _wr_com
.dbline 195
; wr_dat(adata[1]);//显示十位
lds R16,_adata+1
xcall _wr_dat
.dbline 196
; wr_com(0xc3);
ldi R16,195
xcall _wr_com
.dbline 197
; wr_dat(adata[2]);//显示个位
lds R16,_adata+2
xcall _wr_dat
.dbline 198
; wr_com(0xc4);
ldi R16,196
xcall _wr_com
.dbline 199
; wr_dat(0x2e);//显示小数点
ldi R16,46
xcall _wr_dat
.dbline 200
; wr_com(0xc5);
ldi R16,197
xcall _wr_com
.dbline 201
; wr_dat(adata[3]);//显示小数位
lds R16,_adata+3
xcall _wr_dat
.dbline -2
L38:
.dbline 0 ; func end
ld R20,y+
ret
.dbsym r flagdat 20 c
.dbend
.dbfunc e readandisp_temp _readandisp_temp fV
; b -> R12
; a -> R10
; i -> R20
.even
_readandisp_temp::
xcall push_xgset303C
.dbline -1
.dbline 205
; }
; /*******************读取温度值并转换********************************/
; void readandisp_temp()
; {
.dbline 207
; unsigned char a,b,i;
; DDRB|=0xFF;
in R24,0x17
ori R24,255
out 0x17,R24
.dbline 208
; DDRA|=(1<<3)|(1<<4)|(1<<5);
in R24,0x1a
ori R24,56
out 0x1a,R24
.dbline 209
; lcd_init();
xcall _lcd_init
.dbline 210
; for(n=0;n<4;n++)
clr R2
sts _n,R2
xjmp L65
L62:
.dbline 211
; {
L66:
.dbline 213
; do
; i=ds1820rst();
xcall _ds1820rst
mov R20,R16
L67:
.dbline 214
; while(i==0x01);
cpi R20,1
breq L66
X16:
.dbline 215
; ds1820wr(0xCC);
ldi R16,204
xcall _ds1820wr
.dbline 216
; ds1820wr(0x44);
ldi R16,68
xcall _ds1820wr
.dbline 217
; delay_18B20(600);
ldi R16,600
ldi R17,2
xcall _delay_18B20
L69:
.dbline 219
; do
; i=ds1820rst();
xcall _ds1820rst
mov R20,R16
L70:
.dbline 220
; while(i==0x01);
cpi R20,1
breq L69
X17:
.dbline 221
; ds1820wr(0x55);//匹配
ldi R16,85
xcall _ds1820wr
.dbline 222
; for(i=0;i<8;i++)
clr R20
xjmp L75
L72:
.dbline 223
; {
.dbline 224
; ds1820wr(str5[n][i]);
ldi R24,<_str5
ldi R25,>_str5
lds R2,_n
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 _ds1820wr
.dbline 225
; }
L73:
.dbline 222
inc R20
L75:
.dbline 222
cpi R20,8
brlo L72
X18:
.dbline 226
; ds1820wr(0xbe);
ldi R16,190
xcall _ds1820wr
.dbline 227
; a=ds1820rd();
xcall _ds1820rd
mov R10,R16
.dbline 228
; b=ds1820rd();
xcall _ds1820rd
mov R12,R16
.dbline 229
; ds1820rst();
xcall _ds1820rst
.dbline 230
; tvalue=b;
mov R2,R12
clr R3
sts _tvalue+1,R3
sts _tvalue,R2
.dbline 231
; tvalue<<=8;
mov R3,R2
clr R2
sts _tvalue+1,R3
sts _tvalue,R2
.dbline 232
; tvalue=tvalue|a;
mov R2,R10
clr R3
lds R4,_tvalue
lds R5,_tvalue+1
or R4,R2
or R5,R3
sts _tvalue+1,R5
sts _tvalue,R4
.dbline 233
; if(tvalue<0x0fff)
movw R24,R4
cpi R24,255
ldi R30,15
cpc R25,R30
brsh L76
X19:
.dbline 234
; tflag=0;
clr R2
sts _tflag,R2
xjmp L77
L76:
.dbline 236
; else
; {
.dbline 237
; tvalue=~tvalue+1;
lds R24,_tvalue
lds R25,_tvalue+1
com R24
com R25
adiw R24,1
sts _tvalue+1,R25
sts _tvalue,R24
.dbline 238
; tflag=1;
ldi R24,1
sts _tflag,R24
.dbline 239
; }
L77:
.dbline 240
; tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
ldi R16,<L78
ldi R17,>L78
xcall lpm32
movw R2,R16
movw R4,R18
lds R16,_tvalue
lds R17,_tvalue+1
xcall uint2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall fpmule2
xcall fpint
sts _tvalue+1,R17
sts _tvalue,R16
.dbline 241
; ds1820disp();
xcall _ds1820disp
.dbline 242
; delay1ms(1000);
ldi R16,1000
ldi R17,3
xcall _delay1ms
.dbline 243
; }
L63:
.dbline 210
lds R24,_n
subi R24,255 ; addi 1
sts _n,R24
L65:
.dbline 210
lds R24,_n
cpi R24,4
brsh X21
xjmp L62
X21:
X20:
.dbline -2
L61:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r b 12 c
.dbsym r a 10 c
.dbsym r i 20 c
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 247
; }
; /********************主程序***********************************/
; void main()
; {
xjmp L81
L80:
.dbline 249
; while(1)
; {
.dbline 250
; readandisp_temp();//读取和显示温度
xcall _readandisp_temp
.dbline 251
; }
L81:
.dbline 248
xjmp L80
X22:
.dbline -2
L79:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile C:\DOCUME~1\徐胜辉\桌面\新建文件夹\温度测量.c
_tflag::
.blkb 1
.dbsym e tflag _tflag c
_tvalue::
.blkb 2
.dbsym e tvalue _tvalue i
_n::
.blkb 1
.dbsym e n _n c
_adata::
.blkb 5
.dbsym e adata _adata A[5:5]c
.area lit(rom, con, rel)
L78:
.word 0x0,0x3f20
;
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -