📄 1820.lst
字号:
15C E090 LDI R25,0
15D 8399 STD Y+1,R25
15E 8388 STD Y+0,R24
15F 2D2C MOV R18,R12
160 2D0A MOV R16,R10
161 DF70 RCALL _LCD_DisplayString
162 9627 ADIW R28,7
163 940C 0283 JMP pop_xgsetF0FC
_LCD_Displayasc:
temp --> R20
ascii --> Y,+2
asc --> Y,+10
column --> R12
row --> R10
165 940E 02B1 CALL push_xgset303C
167 2EC2 MOV R12,R18
168 2EA0 MOV R10,R16
169 9724 SBIW R28,4
(0136) }
(0137)
(0138) void LCD_Displayasc (char row, char column, char asc)
(0139) {
(0140) unsigned char ascii[2],temp;
(0141) temp=asc;
16A 854A LDD R20,Y+10
(0142) ascii[0]=temp+'0';
16B 2F84 MOV R24,R20
16C 5D80 SUBI R24,0xD0
16D 838A STD Y+2,R24
(0143) ascii[1]='\0';
16E 2422 CLR R2
16F 822B STD Y+3,R2
(0144) LCD_DisplayString(row,column,ascii);
170 01CE MOVW R24,R28
171 9602 ADIW R24,2
172 8399 STD Y+1,R25
173 8388 STD Y+0,R24
174 2D2C MOV R18,R12
175 2D0A MOV R16,R10
176 DF5B RCALL _LCD_DisplayString
177 9624 ADIW R28,4
178 940C 02B8 JMP pop_xgset303C
(0145) }
(0146)
(0147) /****************************************************************************/
(0148) //////////////////////////////延时程序////////////////////////////////////////
(0149) /****************************************************************************/
(0150) #define XTAL 8 //晶振频率,单位MHz
(0151) void delay_1us(void) //1us延时函数
(0152) {
(0153) asm("nop");
_delay_1us:
17A 0000 NOP
17B 9508 RET
_delay_nus:
i --> R20
n --> R10
17C 940E 0299 CALL push_xgset300C
17E 0158 MOVW R10,R16
(0154) }
(0155)
(0156) void delay_nus(unsigned int n) //N us延时函数
(0157) {
(0158) unsigned int i=0;
17F 2744 CLR R20
180 2755 CLR R21
(0159) for (i=0;i<n;i++)
181 C003 RJMP 0x0185
(0160) delay_1us();
182 DFF7 RCALL _delay_1us
183 5F4F SUBI R20,0xFF
184 4F5F SBCI R21,0xFF
185 154A CP R20,R10
186 055B CPC R21,R11
187 F3D0 BCS 0x0182
188 940C 029E JMP pop_xgset300C
(0161) }
(0162)
(0163) void delay_1ms(void) //1ms延时函数
(0164) {
(0165) unsigned int i;
(0166) for (i=0;i<(unsigned int)(XTAL*143-2);i++);
_delay_1ms:
i --> R16
18A 2700 CLR R16
18B 2711 CLR R17
18C C002 RJMP 0x018F
18D 5F0F SUBI R16,0xFF
18E 4F1F SBCI R17,0xFF
18F E786 LDI R24,0x76
190 E094 LDI R25,4
191 1708 CP R16,R24
192 0719 CPC R17,R25
193 F3C8 BCS 0x018D
194 9508 RET
_delay_nms:
i --> R20
n --> R10
195 940E 0299 CALL push_xgset300C
197 0158 MOVW R10,R16
(0167) }
(0168)
(0169) void delay_nms(unsigned int n) //N ms延时函数
(0170) {
(0171) unsigned int i=0;
198 2744 CLR R20
199 2755 CLR R21
(0172) for (i=0;i<n;i++)
19A C003 RJMP 0x019E
(0173) {
(0174) delay_1ms();
19B DFEE RCALL _delay_1ms
19C 5F4F SUBI R20,0xFF
19D 4F5F SBCI R21,0xFF
19E 154A CP R20,R10
19F 055B CPC R21,R11
1A0 F3D0 BCS 0x019B
1A1 940C 029E JMP pop_xgset300C
_resetDS18B20:
errTime --> R10
1A3 92AA ST R10,-Y
FILE: D:\DS18B20\ds18b20.h
(0001) #define dq_clr PORTB&=~(1<<PB7) //数据线强制拉低
(0002) #define dq_set PORTB|=(1<<PB7) //数据线强制拉高,上拉
(0003) #define hold_dq DDRB|=(1<<PB7) //Mega16控制总线
(0004) #define rls_dq DDRB&=~(1<<PB7) //释放总线
(0005) #define stu_dq PINB&(1<<PB7) //数据线的状态
(0006)
(0007) unsigned char resetDS18B20(void)
(0008) {
(0009) unsigned char errTime=0;
1A4 24AA CLR R10
(0010) rls_dq; //释放总线
1A5 98BF CBI 0x17,7
(0011) _NOP();
1A6 0000 NOP
(0012) hold_dq; //Maga16控制总线
1A7 9ABF SBI 0x17,7
(0013) dq_clr; //强制拉低
1A8 98C7 CBI 0x18,7
(0014) delay_nus(480);
1A9 EE00 LDI R16,0xE0
1AA E011 LDI R17,1
1AB DFD0 RCALL _delay_nus
(0015) //以上延时大于480us
(0016) rls_dq; //释放总线,总线自动上拉
1AC 98BF CBI 0x17,7
(0017) _NOP();
1AD 0000 NOP
1AE C009 RJMP 0x01B8
(0018) while(stu_dq)
(0019) {
(0020) delay_nus(5); //5us
1AF E005 LDI R16,5
1B0 E010 LDI R17,0
1B1 DFCA RCALL _delay_nus
(0021) errTime++;
1B2 94A3 INC R10
(0022) if(errTime>12)
1B3 E08C LDI R24,0xC
1B4 158A CP R24,R10
1B5 F410 BCC 0x01B8
(0023) return(0x00); //如果等带大于约 5*12就返回0x00,报告复位失败(实际上只要等待15-60us)
1B6 2700 CLR R16
1B7 C010 RJMP 0x01C8
1B8 99B7 SBIC 0x16,7
1B9 CFF5 RJMP 0x01AF
(0024) }
(0025) errTime=0;
1BA 24AA CLR R10
1BB C009 RJMP 0x01C5
(0026) while(!(stu_dq))
(0027) {
(0028) delay_nus(5); //5us
1BC E005 LDI R16,5
1BD E010 LDI R17,0
1BE DFBD RCALL _delay_nus
(0029) errTime++;
1BF 94A3 INC R10
(0030) if(errTime>50)
1C0 E382 LDI R24,0x32
1C1 158A CP R24,R10
1C2 F410 BCC 0x01C5
(0031) return(0x00); //如果等带大于约 5us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
1C3 2700 CLR R16
1C4 C003 RJMP 0x01C8
1C5 9BB7 SBIS 0x16,7
1C6 CFF5 RJMP 0x01BC
(0032) }
(0033) return(0xff);
1C7 EF0F LDI R16,0xFF
1C8 90A9 LD R10,Y+
1C9 9508 RET
_readByteDS18B20:
retVal --> R20
i --> R22
1CA 934A ST R20,-Y
1CB 936A ST R22,-Y
(0034) }
(0035)
(0036) unsigned char readByteDS18B20(void)
(0037) {
(0038) unsigned char i;
(0039) unsigned char retVal=0;
1CC 2744 CLR R20
(0040) rls_dq; //释放总线
1CD 98BF CBI 0x17,7
(0041) for(i=8;i>0;i--)
1CE E068 LDI R22,0x8
1CF C011 RJMP 0x01E1
(0042) {
(0043) retVal>>=1;
1D0 9546 LSR R20
(0044) hold_dq; //Maga16控制总线
1D1 9ABF SBI 0x17,7
(0045) dq_clr; //强制拉低
1D2 98C7 CBI 0x18,7
(0046) delay_nus(8); //延时大于1us
1D3 E008 LDI R16,0x8
1D4 E010 LDI R17,0
1D5 DFA6 RCALL _delay_nus
(0047) dq_set; //释放总线,DS18B20会将总线强制拉低
1D6 9AC7 SBI 0x18,7
(0048)
(0049) rls_dq; //释放总线
1D7 98BF CBI 0x17,7
(0050) if(stu_dq)
1D8 9BB7 SBIS 0x16,7
1D9 C001 RJMP 0x01DB
(0051) retVal|=0x80;
1DA 6840 ORI R20,0x80
(0052) delay_nus(30); //30us
1DB E10E LDI R16,0x1E
1DC E010 LDI R17,0
1DD DF9E RCALL _delay_nus
(0053) hold_dq; //释放总线
1DE 9ABF SBI 0x17,7
(0054) dq_set; //释放总线,DS18B20会将总线强制拉低
1DF 9AC7 SBI 0x18,7
1E0 956A DEC R22
1E1 E080 LDI R24,0
1E2 1786 CP R24,R22
1E3 F360 BCS 0x01D0
(0055)
(0056) }
(0057) delay_nus(5); //2.71us(大于1us就行了)
1E4 E005 LDI R16,5
1E5 E010 LDI R17,0
1E6 DF95 RCALL _delay_nus
(0058) return(retVal);
1E7 2F04 MOV R16,R20
1E8 9169 LD R22,Y+
1E9 9149 LD R20,Y+
1EA 9508 RET
_writeByteDS18B20:
temp --> R22
i --> R20
wb --> R10
1EB 940E 02A3 CALL push_xgsetF00C
1ED 2EA0 MOV R10,R16
(0059) }
(0060)
(0061) void writeByteDS18B20(unsigned char wb)
(0062) {
(0063) unsigned char i;
(0064) unsigned char temp;
(0065) rls_dq; //释放总线
1EE 98BF CBI 0x17,7
(0066) for(i=0;i<8;i++)
1EF 2744 CLR R20
1F0 C017 RJMP 0x0208
(0067) {
(0068) hold_dq; //Maga16控制总线
1F1 9ABF SBI 0x17,7
(0069) dq_clr; //强制拉低
1F2 98C7 CBI 0x18,7
(0070) delay_nus(4);
1F3 E004 LDI R16,4
1F4 E010 LDI R17,0
1F5 DF86 RCALL _delay_nus
(0071) temp=wb>>i;
1F6 2D0A MOV R16,R10
1F7 2F14 MOV R17,R20
1F8 940E 02DC CALL lsr8
1FA 2F60 MOV R22,R16
(0072) temp&=0x01;
1FB 7061 ANDI R22,1
(0073) if(temp)
1FC F011 BEQ 0x01FF
(0074) dq_set; //释放总线
1FD 9AC7 SBI 0x18,7
1FE C001 RJMP 0x0200
(0075) else
(0076) dq_clr; //强制拉低
1FF 98C7 CBI 0x18,7
(0077) delay_nus(50);
200 E302 LDI R16,0x32
201 E010 LDI R17,0
202 DF79 RCALL _delay_nus
(0078)
(0079) dq_set; //释放总线
203 9AC7 SBI 0x18,7
(0080) delay_nus(4); //(大于1us就行了)
204 E004 LDI R16,4
205 E010 LDI R17,0
206 DF75 RCALL _delay_nus
207 9543 INC R20
208 3048 CPI R20,0x8
209 F338 BCS 0x01F1
20A 940C 02AA JMP pop_xgsetF00C
_readTempDS18B20:
tempH --> R12
tempL --> R10
x --> R10
20C 940E 0294 CALL push_xgset003C
20E 9722 SBIW R28,2
(0081) }
(0082) }
(0083)
(0084) void readTempDS18B20(void)
(0085) {
(0086) unsigned char tempL,tempH;
(0087) unsigned int x;
(0088) resetDS18B20();
20F DF93 RCALL _resetDS18B20
(0089) writeByteDS18B20(0xcc); //跳过ROM
210 EC0C LDI R16,0xCC
211 DFD9 RCALL _writeByteDS18B20
(0090) writeByteDS18B20(0x44); //启动温度转换
212 E404 LDI R16,0x44
213 DFD7 RCALL _writeByteDS18B20
(0091) delay_nus(500); //等待500us
214 EF04 LDI R16,0xF4
215 E011 LDI R17,1
216 DF65 RCALL _delay_nus
(0092) resetDS18B20();
217 DF8B RCALL _resetDS18B20
(0093) writeByteDS18B20(0xcc); //跳过ROM
218 EC0C LDI R16,0xCC
219 DFD1 RCALL _writeByteDS18B20
(0094) writeByteDS18B20(0xbe); //读数据
21A EB0E LDI R16,0xBE
21B DFCF RCALL _writeByteDS18B20
(0095) tempL=readByteDS18B20();
21C DFAD RCALL _readByteDS18B20
21D 2EA0 MOV R10,R16
(0096) tempH=readByteDS18B20();
21E DFAB RCALL _readByteDS18B20
21F 2EC0 MOV R12,R16
(0097) x=(tempH<<8)|tempL;
220 2CBC MOV R11,R12
(0098) resetDS18B20();
221 DF81 RCALL _resetDS18B20
(0099) writeByteDS18B20(0xcc); //跳过ROM
222 EC0C LDI R16,0xCC
223 DFC7 RCALL _writeByteDS18B20
(0100) writeByteDS18B20(0x44); //启动温度转换
224 E404 LDI R16,0x44
225 DFC5 RCALL _writeByteDS18B20
(0101) x=x*0.625;
226 E504 LDI R16,0x54
227 E010 LDI R17,0
228 940E 02C8 CALL lpm32
22A 0118 MOVW R2,R16
22B 0129 MOVW R4,R18
22C 0185 MOVW R16,R10
22D 940E 030E CALL uint2fp
22F 933A ST R19,-Y
230 932A ST R18,-Y
231 931A ST R17,-Y
232 930A ST R16,-Y
233 0181 MOVW R16,R2
234 0192 MOVW R18,R4
235 940E 0406 CALL fpmule2
237 940E 02E2 CALL fpint
239 0158 MOVW R10,R16
(0102) LCD_DisplayInt(2,3,x); //未将温度值的小数点显示出
23A 82B9 STD Y+1,R11
23B 82A8 STD Y+0,R10
23C E023 LDI R18,3
23D E002 LDI R16,2
23E DEA7 RCALL _LCD_DisplayInt
23F 9622 ADIW R28,2
240 940C 0277 JMP pop_xgset003C
_main:
temp --> R10
i --> R10
242 9722 SBIW R28,2
FILE: D:\DS18B20\main.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "lcd.h"
(0004) #include "ds18b20.h"
(0005)
(0006) void main(void)
(0007) {
(0008) unsigned char i=0;
243 24AA CLR R10
(0009) unsigned int temp=0;
244 24BB CLR R11
(0010) CLI();
245 94F8 BCLR 7
(0011) LCD_init();
246 DE0E RCALL _LCD_init
(0012) SEI();
247 9478 BSET 7
(0013) LCD_DisplayString(1,4,"DS18B20");
248 E683 LDI R24,0x63
249 E090 LDI R25,0
24A 8399 STD Y+1,R25
24B 8388 STD Y+0,R24
24C E024 LDI R18,4
24D E001 LDI R16,1
24E DE83 RCALL _LCD_DisplayString
(0014) LCD_DisplayString(2,1,"T=");
24F E680 LDI R24,0x60
250 E090 LDI R25,0
251 8399 STD Y+1,R25
252 8388 STD Y+0,R24
253 E021 LDI R18,1
254 E002 LDI R16,2
255 DE7C RCALL _LCD_DisplayString
256 C001 RJMP 0x0258
(0015) while(1)
(0016) {
(0017) readTempDS18B20();
FILE: <library>
257 DFB4 RCALL _readTempDS18B20
258 CFFE RJMP 0x0257
259 9622 ADIW R28,2
25A 9508 RET
mod16u:
25B 9468 BSET 6
25C C001 RJMP xdiv16u
div16u:
25D 94E8 BCLR 6
xdiv16u:
25E 92EA ST R14,-Y
25F 92FA ST R15,-Y
260 938A ST R24,-Y
261 24EE CLR R14
262 24FF CLR R15
263 E180 LDI R24,0x10
264 0F00 LSL R16
265 1F11 ROL R17
266 1CEE ROL R14
267 1CFF ROL R15
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -