📄 zz.lst
字号:
(0016) return addata;
00150 0185 MOVW R16,R10
00151 90B9 LD R11,Y+
00152 90A9 LD R10,Y+
00153 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\12864_~1\18B20.h
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #define DQ_IN DDRC &= ~(1 << PA3) /*设置输入*/
(0006) #define DQ_OUT DDRC |= (1 << PA3) /*设置输出*/
(0007) #define DQ_CLR PORTC &= ~(1 << PA3) /*置低电平*/
(0008) #define DQ_SET PORTC |= (1 << PA3) /*置高电平*/
(0009) #define DQ_R PINC & (1 << PA3) /*读了电平*/
(0010)
(0011) uchar flag;/*中断标志缓存*/
(0012) #define delay4us {NOP();NOP();NOP();NOP();}
(0013) #define delay10us {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}
(0014) void delay_10us(unsigned char i) {
(0015)
(0016) if (i == 0) {
_delay_10us:
i --> R16
00154 2300 TST R16
00155 F429 BNE 0x015B
(0017) return ;
00156 C009 RJMP 0x0160
(0018) }
(0019) while (i--) {
(0020) delay4us;
00157 0000 NOP
00158 0000 NOP
00159 0000 NOP
0015A 0000 NOP
0015B 2E20 MOV R2,R16
0015C 2433 CLR R3
0015D 5001 SUBI R16,1
0015E 2022 TST R2
0015F F7B9 BNE 0x0157
00160 9508 RET
_ds1820_reset:
i --> R20
00161 934A ST -Y,R20
(0021) }
(0022) }
(0023) /*DS18B20复位函数*/
(0024) unsigned char ds1820_reset(void) {
(0025)
(0026) unsigned char i;
(0027) flag = SREG; /*中断保护*/
00162 B62F IN R2,0x3F
00163 9220 00B9 STS flag,R2
(0028) CLI(); /*关中断*/
00165 94F8 BCLR 7
(0029) DQ_OUT;
00166 9AA3 SBI 0x14,3
(0030) DQ_CLR;
00167 98AB CBI 0x15,3
(0031) delay_10us(49); /*延时500uS(480-960)*/
00168 E301 LDI R16,0x31
00169 DFEA RCALL _delay_10us
(0032) DQ_SET;
0016A 9AAB SBI 0x15,3
(0033) DQ_IN;
0016B 98A3 CBI 0x14,3
(0034) delay_10us(7); /*延时80uS*/
0016C E007 LDI R16,7
0016D DFE6 RCALL _delay_10us
(0035) i = DQ_R;
0016E B343 IN R20,0x13
0016F 7048 ANDI R20,0x8
(0036) delay_10us(49); /*延时500uS(保持>480uS)*/
00170 E301 LDI R16,0x31
00171 DFE2 RCALL _delay_10us
(0037) if (flag & 0x80) { /*恢复中断状态*/
00172 9020 00B9 LDS R2,flag
00174 FE27 SBRS R2,7
00175 C001 RJMP 0x0177
(0038) SEI();
00176 9478 BSET 7
(0039) }
(0040) if (i) {
00177 2344 TST R20
00178 F011 BEQ 0x017B
(0041) return 0x00;
00179 2700 CLR R16
0017A C001 RJMP 0x017C
(0042) }
(0043) else {
(0044) return 0x01;
0017B E001 LDI R16,1
0017C 9149 LD R20,Y+
0017D 9508 RET
_ds1820_read_byte:
value --> R20
i --> R22
0017E 934A ST -Y,R20
0017F 936A ST -Y,R22
(0045) }
(0046) }
(0047)
(0048) /*DS18B20字节读取函数*/
(0049) unsigned char ds1820_read_byte(void) {
(0050)
(0051) unsigned char i;
(0052) unsigned char value = 0;
00180 2744 CLR R20
(0053) flag = SREG; /*中断保护*/
00181 B62F IN R2,0x3F
00182 9220 00B9 STS flag,R2
(0054) CLI(); /*关中断*/
00184 94F8 BCLR 7
(0055) for (i = 8; i != 0; i--) {
00185 E068 LDI R22,0x8
00186 C019 RJMP 0x01A0
(0056) value >>= 1;
00187 9546 LSR R20
(0057) DQ_OUT;
00188 9AA3 SBI 0x14,3
(0058) DQ_CLR;
00189 98AB CBI 0x15,3
(0059) delay4us; /*延时4uS*/
0018A 0000 NOP
0018B 0000 NOP
0018C 0000 NOP
0018D 0000 NOP
(0060) DQ_SET;
0018E 9AAB SBI 0x15,3
(0061) DQ_IN;
0018F 98A3 CBI 0x14,3
(0062) delay10us; /*延时10uS*/
00190 0000 NOP
00191 0000 NOP
00192 0000 NOP
00193 0000 NOP
00194 0000 NOP
00195 0000 NOP
00196 0000 NOP
00197 0000 NOP
00198 0000 NOP
00199 0000 NOP
(0063) if (DQ_R) {
0019A 9B9B SBIS 0x13,3
0019B C001 RJMP 0x019D
(0064) value|=0x80;
0019C 6840 ORI R20,0x80
(0065) }
(0066) delay_10us(5); /*延时60uS*/
0019D E005 LDI R16,5
0019E DFB5 RCALL _delay_10us
0019F 956A DEC R22
001A0 2366 TST R22
001A1 F729 BNE 0x0187
(0067) }
(0068) if (flag & 0x80) { /*恢复中断状态*/
001A2 9020 00B9 LDS R2,flag
001A4 FE27 SBRS R2,7
001A5 C001 RJMP 0x01A7
(0069) SEI();
001A6 9478 BSET 7
(0070) }
(0071) return(value);
001A7 2F04 MOV R16,R20
001A8 9169 LD R22,Y+
001A9 9149 LD R20,Y+
001AA 9508 RET
_ds1820_write_byte:
i --> R20
value --> R10
001AB 92AA ST -Y,R10
001AC 934A ST -Y,R20
001AD 2EA0 MOV R10,R16
(0072) }
(0073)
(0074) /*DS18B20字节写入函数*/
(0075) void ds1820_write_byte(unsigned char value) {
(0076)
(0077) unsigned char i;
(0078) flag = SREG; /*中断保护*/
001AE B62F IN R2,0x3F
001AF 9220 00B9 STS flag,R2
(0079) CLI(); /*关中断*/
001B1 94F8 BCLR 7
(0080) for (i = 8; i != 0; i--) {
001B2 E048 LDI R20,0x8
001B3 C00E RJMP 0x01C2
(0081) DQ_OUT;
001B4 9AA3 SBI 0x14,3
(0082) DQ_CLR;
001B5 98AB CBI 0x15,3
(0083) delay4us; /*延时4uS*/
001B6 0000 NOP
001B7 0000 NOP
001B8 0000 NOP
001B9 0000 NOP
(0084) if (value & 0x01) {DQ_SET;}
001BA FEA0 SBRS R10,0
001BB C001 RJMP 0x01BD
001BC 9AAB SBI 0x15,3
(0085) //每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0
(0086) delay_10us(7); /*延时80uS*/
001BD E007 LDI R16,7
001BE DF95 RCALL _delay_10us
(0087) DQ_SET; /*位结束*/
001BF 9AAB SBI 0x15,3
(0088) value >>= 1;
001C0 94A6 LSR R10
001C1 954A DEC R20
001C2 2344 TST R20
001C3 F781 BNE 0x01B4
(0089) }
(0090) if (flag & 0x80) { /*恢复中断状态*/
001C4 9020 00B9 LDS R2,flag
001C6 FE27 SBRS R2,7
001C7 C001 RJMP 0x01C9
(0091) SEI();
001C8 9478 BSET 7
(0092) }
001C9 9149 LD R20,Y+
001CA 90A9 LD R10,Y+
001CB 9508 RET
_ds1820_read_temp:
tt --> Y,+0
c --> R20
b --> R22
a --> R10
t --> R12
001CC 940E 04A3 CALL push_xgsetF03C
001CE 9724 SBIW R28,4
(0093) }
(0094)
(0095) /*DS8B20读取温度信息*/
(0096) ds1820_read_temp(void)
(0097) {
(0098)
(0099) unsigned int a = 0, b = 0, c = 0, t = 0;
(0100) float tt = 0;
001CF E600 LDI R16,0x60
001D0 E010 LDI R17,0
001D1 940E 04BE CALL lpm32
001D3 8308 ST Y,R16
001D4 8319 STD Y+1,R17
001D5 832A STD Y+2,R18
001D6 833B STD Y+3,R19
(0101)
(0102) ds1820_reset();
001D7 DF89 RCALL _ds1820_reset
(0103) ds1820_write_byte(0xCC); /*勿略地址*/
001D8 EC0C LDI R16,0xCC
001D9 DFD1 RCALL _ds1820_write_byte
(0104) ds1820_write_byte(0x44); /*启动转换*/
001DA E404 LDI R16,0x44
001DB DFCF RCALL _ds1820_write_byte
(0105) ds1820_reset();
001DC DF84 RCALL _ds1820_reset
(0106) ds1820_write_byte(0xCC); /*勿略地址*/
001DD EC0C LDI R16,0xCC
001DE DFCC RCALL _ds1820_write_byte
(0107) ds1820_write_byte(0xBE); /*读取温度*/
001DF EB0E LDI R16,0xBE
001E0 DFCA RCALL _ds1820_write_byte
(0108) a = ds1820_read_byte(); //读取温度寄存器
001E1 DF9C RCALL _ds1820_read_byte
001E2 2EA0 MOV R10,R16
001E3 24BB CLR R11
(0109) b = ds1820_read_byte();
001E4 DF99 RCALL _ds1820_read_byte
001E5 2F60 MOV R22,R16
001E6 2777 CLR R23
(0110) t = b;
001E7 016B MOVW R12,R22
(0111) t <<= 8;
001E8 2CDC MOV R13,R12
001E9 24CC CLR R12
(0112) t = t | a;
001EA 28CA OR R12,R10
001EB 28DB OR R13,R11
(0113)
(0114) tt = t * 0.0625;
001EC E50C LDI R16,0x5C
001ED E010 LDI R17,0
001EE 940E 04BE CALL lpm32
001F0 0118 MOVW R2,R16
001F1 0129 MOVW R4,R18
001F2 0186 MOVW R16,R12
001F3 940E 0579 CALL uint2fp
001F5 933A ST -Y,R19
001F6 932A ST -Y,R18
001F7 931A ST -Y,R17
001F8 930A ST -Y,R16
001F9 0181 MOVW R16,R2
001FA 0192 MOVW R18,R4
001FB 940E 0686 CALL fpmule2
001FD 8308 ST Y,R16
001FE 8319 STD Y+1,R17
001FF 832A STD Y+2,R18
00200 833B STD Y+3,R19
(0115) t = tt * 10 + 0.5; //放大10倍输出并四舍五入
00201 E508 LDI R16,0x58
00202 E010 LDI R17,0
00203 940E 04BE CALL lpm32
00205 01CE MOVW R24,R28
00206 939A ST -Y,R25
00207 938A ST -Y,R24
00208 940E 067C CALL fpmule1
0020A 0118 MOVW R2,R16
0020B 0129 MOVW R4,R18
0020C E504 LDI R16,0x54
0020D E010 LDI R17,0
0020E 940E 04BE CALL lpm32
00210 933A ST -Y,R19
00211 932A ST -Y,R18
00212 931A ST -Y,R17
00213 930A ST -Y,R16
00214 0181 MOVW R16,R2
00215 0192 MOVW R18,R4
00216 940E 053C CALL fpadd2
00218 940E 0547 CALL fpint
0021A 0168 MOVW R12,R16
(0116)
(0117) a = t / 100; //十位
0021B E624 LDI R18,0x64
0021C E030 LDI R19,0
0021D 940E 046B CALL div16u
0021F 0158 MOVW R10,R16
(0118) b = t / 10 - a * 10; //个位
00220 E00A LDI R16,0xA
00221 E010 LDI R17,0
00222 0195 MOVW R18,R10
00223 940E 0485 CALL empy16s
00225 0118 MOVW R2,R16
00226 E02A LDI R18,0xA
00227 E030 LDI R19,0
00228 0186 MOVW R16,R12
00229 940E 046B CALL div16u
0022B 01B8 MOVW R22,R16
0022C 1962 SUB R22,R2
0022D 0973 SBC R23,R3
(0119) c = t - a * 100 - b * 10; //小数位
0022E E604 LDI R16,0x64
0022F E010 LDI R17,0
00230 0195 MOVW R18,R10
00231 940E 0485 CALL empy16s
00233 01A6 MOVW R20,R12
00234 1B40 SUB R20,R16
00235 0B51 SBC R21,R17
00236 E00A LDI R16,0xA
00237 E010 LDI R17,0
00238 019B MOVW R18,R22
00239 940E 0485 CALL empy16s
0023B 1B40 SUB R20,R16
0023C 0B51 SBC R21,R17
(0120) locate(1,7);
0023D E027 LDI R18,7
0023E E001 LDI R16,1
0023F DEC2 RCALL _locate
(0121) write_shuju(1,a+0x30);
00240 0195 MOVW R18,R10
00241 5D20 SUBI R18,0xD0
00242 4F3F SBCI R19,0xFF
00243 E001 LDI R16,1
00244 DE65 RCALL _write_shuju
(0122) write_shuju(1,b+0x30);
00245 019B MOVW R18,R22
00246 5D20 SUBI R18,0xD0
00247 4F3F SBCI R19,0xFF
00248 E001 LDI R16,1
00249 DE60 RCALL _write_shuju
(0123) write_hz(".");
0024A E90F LDI R16,0x9F
0024B E010 LDI R17,0
0024C DEA4 RCALL _write_hz
(0124) write_shuju(1,c+0x30);
0024D 019A MOVW R18,R20
0024E 5D20 SUBI R18,0xD0
0024F 4F3F SBCI R19,0xFF
00250 E001 LDI R16,1
00251 DE58 RCALL _write_shuju
(0125) delay(100);
00252 E604 LDI R16,0x64
00253 E010 LDI R17,0
00254 DE21 RCALL _delay
00255 9624 ADIW R28,4
00256 940C 04AC JMP pop_xgsetF03C
FILE: C:\DOCUME~1\Administrator\桌面\12864_~1\zz.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #include "12864.h"
(0004) #include "adc.h"
(0005) #include "18B20.h"
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) uint A ,B;
(0009) typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
(0010) typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
(0011) typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
(0012) typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
(0013) typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
(0014) typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
(0015) typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
(0016) typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -