📄 1.lst
字号:
(0156) while(x)
(0157) {
(0158) x--;
0115 5001 SUBI R16,1
0116 4010 SBCI R17,0
0117 3000 CPI R16,0
0118 0701 CPC R16,R17
0119 F7D9 BNE 0x0115
011A 9508 RET
(0159) }
(0160) }
(0161)
(0162) //////////////////////////////////////////
(0163) void init_1820()
(0164) {
(0165) PORTD|=(1<<6);
_init_1820:
011B 9A96 SBI 0x12,6
(0166) PORTD&=~(1<<6);
011C 9896 CBI 0x12,6
(0167) delay(3000); //480us以上
011D EB08 LDI R16,0xB8
011E E01B LDI R17,0xB
011F DFF4 RCALL _delay
(0168) PORTD|=(1<<6);
0120 9A96 SBI 0x12,6
(0169) DDRD&=~(1<<6);
0121 988E CBI 0x11,6
(0170) delay(40); //15~60us
0122 E208 LDI R16,0x28
0123 E010 LDI R17,0
0124 DFEF RCALL _delay
(0171) while(PIND&(1<<6))
0125 9986 SBIC 0x10,6
0126 CFFE RJMP 0x0125
(0172) {
(0173) // disp_led(3,0);
(0174) // for(;;)
(0175) //{}
(0176) }
(0177) DDRD|=(1<<6);
0127 9A8E SBI 0x11,6
(0178) PORTD|=(1<<6);
0128 9A96 SBI 0x12,6
(0179) delay(150); //60~240us
0129 E906 LDI R16,0x96
012A E010 LDI R17,0
012B DFE8 RCALL _delay
012C 9508 RET
_write_1820:
m --> R20
x --> R22
012D 940E020C CALL push_gset2
012F 2F60 MOV R22,R16
(0180) }
(0181) ///////////////////////////////////////////////////////
(0182) write_1820(uchar x)
(0183) {
(0184) uchar m;
(0185) for(m=0;m<8;m++)
0130 2744 CLR R20
0131 C010 RJMP 0x0142
(0186) {
(0187) PORTD&=~(1<<6);
0132 9896 CBI 0x12,6
(0188) if(x&(1<<m)) //写数据,从低位开始
0133 E001 LDI R16,1
0134 2F14 MOV R17,R20
0135 940E0242 CALL lsl8
0137 2E26 MOV R2,R22
0138 2220 AND R2,R16
0139 F011 BEQ 0x013C
(0189) PORTD|=(1<<6);
013A 9A96 SBI 0x12,6
013B C001 RJMP 0x013D
(0190) else
(0191) PORTD&=~(1<<6);
013C 9896 CBI 0x12,6
(0192) delay(40); //15~60us
013D E208 LDI R16,0x28
013E E010 LDI R17,0
013F DFD4 RCALL _delay
(0193) PORTD|=(1<<6);
0140 9A96 SBI 0x12,6
0141 9543 INC R20
0142 3048 CPI R20,0x8
0143 F370 BCS 0x0132
(0194) }
(0195) PORTD|=(1<<6);
0144 9A96 SBI 0x12,6
0145 940E0200 CALL pop_gset2
0147 9508 RET
_read_1820:
temp --> R20
k --> R22
n --> R10
0148 940E020A CALL push_gset3
(0196) }
(0197)
(0198) //////////////////////////////////////////////
(0199) uchar read_1820()
(0200) {
(0201) uchar temp,k,n;
(0202) temp=0;
014A 2744 CLR R20
(0203) for(n=0;n<8;n++)
014B 24AA CLR R10
014C C018 RJMP 0x0165
(0204) {
(0205) PORTD&=~(1<<6);
014D 9896 CBI 0x12,6
(0206) //delay(2);
(0207) PORTD|=(1<<6);
014E 9A96 SBI 0x12,6
(0208) //delay(3);
(0209) DDRD&=~(1<<6);
014F 988E CBI 0x11,6
(0210) k=(PIND&(1<<6)); //读数据,从低位开始
0150 B360 IN R22,0x10
0151 7460 ANDI R22,0x40
(0211) if(k)
0152 F031 BEQ 0x0159
(0212) temp|=(1<<n);
0153 E001 LDI R16,1
0154 2D1A MOV R17,R10
0155 940E0242 CALL lsl8
0157 2B40 OR R20,R16
0158 C007 RJMP 0x0160
(0213) else
(0214) temp&=~(1<<n);
0159 E001 LDI R16,1
015A 2D1A MOV R17,R10
015B 940E0242 CALL lsl8
015D 2E20 MOV R2,R16
015E 9420 COM R2
015F 2142 AND R20,R2
(0215) delay(50); //60~120us
0160 E302 LDI R16,0x32
0161 E010 LDI R17,0
0162 DFB1 RCALL _delay
(0216) DDRD|=(1<<6);
0163 9A8E SBI 0x11,6
0164 94A3 INC R10
0165 2D8A MOV R24,R10
0166 3088 CPI R24,0x8
0167 F328 BCS 0x014D
(0217) }
(0218) return (temp);
0168 2F04 MOV R16,R20
0169 940E0203 CALL pop_gset3
016B 9508 RET
_send_byte:
i --> R20
x --> R22
016C 940E020C CALL push_gset2
016E 2F60 MOV R22,R16
(0219) }
(0220) ////////////////////////////////////////////////
(0221) void send_byte(uchar x) //以下为显示程序
(0222) {
(0223) uchar i;
(0224) for(i=0;i<8;i++)
016F 2744 CLR R20
0170 C014 RJMP 0x0185
(0225) {
(0226) PORTC&=~(1<<5); // PC5为底 为164提供时钟信号
0171 98AD CBI 0x15,5
(0227) if((x&(1<<(7-i)))||((dp==1)&&(i==0))) //判断每位数据的电平,及小数点判断
0172 E017 LDI R17,7
0173 1B14 SUB R17,R20
0174 E001 LDI R16,1
0175 940E0242 CALL lsl8
0177 2E26 MOV R2,R22
0178 2220 AND R2,R16
0179 F431 BNE 0x0180
017A 9180007A LDS R24,dp
017C 3081 CPI R24,1
017D F421 BNE 0x0182
017E 2344 TST R20
017F F411 BNE 0x0182
(0228) PORTC|=(1<<4); //若为高着PC4输出高电平
0180 9AAC SBI 0x15,4
0181 C001 RJMP 0x0183
(0229) else
(0230) PORTC&=~(1<<4); //若为低着输出低电平
0182 98AC CBI 0x15,4
(0231) PORTC|=(1<<5); //PC5 提供始终信号
0183 9AAD SBI 0x15,5
0184 9543 INC R20
0185 3048 CPI R20,0x8
0186 F350 BCS 0x0171
0187 940E0200 CALL pop_gset2
0189 9508 RET
_main:
teml --> R20
temh --> R22
i --> R10
018A 9722 SBIW R28,2
(0232) }
(0233) //PORTC|=((1<<0)|(1<<1)|(1<<2));
(0234) }
(0235) ////////////////////////////////////////////////
(0236) void main(void) //主函数
(0237) {
(0238) // disp_led(0,0);
(0239) delay(2000);
018B ED00 LDI R16,0xD0
018C E017 LDI R17,7
018D DF86 RCALL _delay
(0240) OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率,
018E E98D LDI R24,0x9D
018F BF81 OUT 0x31,R24
(0241) DDRC=0xff;
0190 EF8F LDI R24,0xFF
0191 BB84 OUT 0x14,R24
(0242) DDRD=0XFF;
0192 BB81 OUT 0x11,R24
(0243) DDRA=0XFF;
0193 BB8A OUT 0x1A,R24
(0244) PORTA=0XF3;
0194 EF83 LDI R24,0xF3
0195 BB8B OUT 0x1B,R24
(0245) PORTD=0XFF;
0196 EF8F LDI R24,0xFF
0197 BB82 OUT 0x12,R24
(0246) WDR(); //看门狗计数清零
0198 95A8 WDR
(0247) LCD_init();
0199 DEED RCALL _LCD_init
(0248) WDTCR=0x0F;
019A E08F LDI R24,0xF
019B BD81 OUT 0x21,R24
(0249) PORTC=0xff;
019C EF8F LDI R24,0xFF
019D BB85 OUT 0x15,R24
019E C049 RJMP 0x01E8
(0250) while(1)
(0251) {
(0252) uchar i,temh,teml;
(0253) init_1820(); //复位18b20
019F DF7B RCALL _init_1820
(0254) write_1820(0xcc); //skip rom
01A0 EC0C LDI R16,0xCC
01A1 DF8B RCALL _write_1820
(0255) write_1820(0x44); // 发出转换命令 convert T
01A2 E404 LDI R16,0x44
01A3 DF89 RCALL _write_1820
(0256) delay(400);
01A4 E900 LDI R16,0x90
01A5 E011 LDI R17,1
01A6 DF6D RCALL _delay
(0257) init_1820();
01A7 DF73 RCALL _init_1820
(0258) WDR();
01A8 95A8 WDR
(0259) write_1820(0xcc); //发出读命令
01A9 EC0C LDI R16,0xCC
01AA DF82 RCALL _write_1820
(0260) write_1820(0xbe);
01AB EB0E LDI R16,0xBE
01AC DF80 RCALL _write_1820
(0261) teml=read_1820(); //读数据
01AD DF9A RCALL _read_1820
01AE 2F40 MOV R20,R16
(0262) temh=read_1820();
01AF DF98 RCALL _read_1820
01B0 2F60 MOV R22,R16
(0263)
(0264) //for(i=0;i<7;i++) //测试用
(0265) //{
(0266) //send_byte(0x40);
(0267) //send_byte(disp_table[0&0x0f]);
(0268) //}
(0269) //send_byte(disp_table[temh>>4]);
(0270) //send_byte(disp_table[temh&0x0f]);
(0271) //send_byte(disp_table[teml>>4]);
(0272) //send_byte(disp_table[teml&0x0f]);
(0273) count=(temh*256+teml)*6.25; //计算具体温度
01B1 E504 LDI R16,0x54
01B2 E010 LDI R17,0
01B3 940E022E CALL lpm32
01B5 933A ST R19,-Y
01B6 932A ST R18,-Y
01B7 931A ST R17,-Y
01B8 930A ST R16,-Y
01B9 2F26 MOV R18,R22
01BA 2733 CLR R19
01BB E000 LDI R16,0
01BC E011 LDI R17,1
01BD 940E01F0 CALL empy16s
01BF 0118 MOVW R2,R16
01C0 2E44 MOV R4,R20
01C1 2455 CLR R5
01C2 0C24 ADD R2,R4
01C3 1C35 ADC R3,R5
01C4 0181 MOVW R16,R2
01C5 940E0290 CALL int2fp
01C7 933A ST R19,-Y
01C8 932A ST R18,-Y
01C9 931A ST R17,-Y
01CA 930A ST R16,-Y
01CB 940E02F9 CALL empy32f
01CD 940E0256 CALL fp2long
01CF 93100077 STS count+1,R17
01D1 93000076 STS count,R16
01D3 93300079 STS count+3,R19
01D5 93200078 STS count+2,R18
(0274) WDR();
01D7 95A8 WDR
(0275) //disp_led(0,1); //显示温度
(0276) for(i=0;i<100;i++) //每次转换需要延时200ms以上
01D8 24AA CLR R10
01D9 C004 RJMP 0x01DE
(0277) delay(1000);
01DA EE08 LDI R16,0xE8
01DB E013 LDI R17,3
01DC DF37 RCALL _delay
01DD 94A3 INC R10
01DE 2D8A MOV R24,R10
01DF 3684 CPI R24,0x64
01E0 F3C8 BCS 0x01DA
(0278) LCD_write_string(0,0,"count");
FILE: <library>
01E1 E780 LDI R24,0x70
01E2 E090 LDI R25,0
01E3 8399 STD Y+1,R25
01E4 8388 STD Y+0,R24
01E5 2722 CLR R18
01E6 2700 CLR R16
01E7 DF0A RCALL _LCD_write_string
01E8 CFB6 RJMP 0x019F
01E9 9622 ADIW R28,2
01EA 9508 RET
push_arg4:
01EB 933A ST R19,-Y
01EC 932A ST R18,-Y
push_arg2:
01ED 931A ST R17,-Y
01EE 930A ST R16,-Y
01EF 9508 RET
empy16s:
01F0 920A ST R0,-Y
01F1 921A ST R1,-Y
01F2 938A ST R24,-Y
01F3 939A ST R25,-Y
01F4 9F02 MUL R16,R18
01F5 01C0 MOVW R24,R0
01F6 9F12 MUL R17,R18
01F7 0D90 ADD R25,R0
01F8 9F03 MUL R16,R19
01F9 0D90 ADD R25,R0
01FA 018C MOVW R16,R24
01FB 9199 LD R25,Y+
01FC 9189 LD R24,Y+
01FD 9019 LD R1,Y+
01FE 9009 LD R0,Y+
01FF 9508 RET
pop_gset2:
0200 E0E2 LDI R30,2
0201 940C0212 JMP pop
pop_gset3:
0203 E0E4 LDI R30,4
0204 940C0212 JMP pop
push_gset5:
0206 92FA ST R15,-Y
0207 92EA ST R14,-Y
push_gset4:
0208 92DA ST R13,-Y
0209 92CA ST R12,-Y
push_gset3:
020A 92BA ST R11,-Y
020B 92AA ST R10,-Y
push_gset2:
020C 937A ST R23,-Y
020D 936A ST R22,-Y
push_gset1:
020E 935A ST R21,-Y
020F 934A ST R20,-Y
0210 9508 RET
pop_gset1:
0211 E0E1 LDI R30,1
pop:
0212 9149 LD R20,Y+
0213 9159 LD R21,Y+
0214 FDE0 SBRC R30,0
0215 9508 RET
0216 9169 LD R22,Y+
0217 9179 LD R23,Y+
0218 FDE1 SBRC R30,1
0219 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -