📄 can-18b20.lst
字号:
(0363) ===================================================================*/
(0364) /*void ds1820_match(unsigned char *p)
(0365) {
(0366) unsigned char i;
(0367) ds1820_ack();
(0368) write_byte(0x55);
(0369) for(i=0;i<8;i++)
(0370) write_byte(p[i]);
(0371) }
(0372) */
(0373)
(0374)
(0375) /*nms delay*/
(0376) void wait(unsigned int n)
(0377) {unsigned int i;
(0378) for(i=0;i<n;i++)
0181 2744 CLR R20
0182 2755 CLR R21
0183 C003 RJMP 0x0187
(0379) delay_1ms();
0184 D007 RCALL _delay_1ms
0185 5F4F SUBI R20,0xFF
0186 4F5F SBCI R21,0xFF
0187 1746 CP R20,R22
0188 0757 CPC R21,R23
0189 F3D0 BCS 0x0184
018A D1D6 RCALL pop_gset2
018B 9508 RET
(0380) }
(0381)
(0382) /*1ms delay*/
(0383) void delay_1ms(void)
(0384) {unsigned int i;
(0385) for(i=0;i<1035;i++);
_delay_1ms:
i --> R16
018C 2700 CLR R16
018D 2711 CLR R17
018E C002 RJMP 0x0191
018F 5F0F SUBI R16,0xFF
0190 4F1F SBCI R17,0xFF
0191 300B CPI R16,0xB
0192 E0E4 LDI R30,4
0193 071E CPC R17,R30
0194 F3D0 BCS 0x018F
0195 9508 RET
_delay:
i --> R20
n --> R16
0196 D1D6 RCALL push_gset1
(0386) }
(0387)
(0388) void delay(unsigned int n)
(0389) { unsigned int i;
(0390) for(i=0;i<n;i++)
0197 2744 CLR R20
0198 2755 CLR R21
0199 C003 RJMP 0x019D
(0391) asm("nop");
019A 0000 NOP
019B 5F4F SUBI R20,0xFF
019C 4F5F SBCI R21,0xFF
019D 1740 CP R20,R16
019E 0751 CPC R21,R17
019F F3D0 BCS 0x019A
01A0 D1CF RCALL pop_gset1
01A1 9508 RET
_HC595_SENDDAT:
i --> R20
dat --> R16
01A2 D1CA RCALL push_gset1
(0392) }
(0393)
(0394) /*595数据传输*/
(0395) void HC595_SENDDAT(unsigned char dat)
(0396) {unsigned char i;
(0397) C_CS; //cs 拉低
01A3 98A9 CBI 0x15,1
(0398) asm("nop");
01A4 0000 NOP
(0399) for(i=0;i<8;i++)
01A5 2744 CLR R20
01A6 C00B RJMP 0x01B2
(0400) {C_CLK ; //时钟拉低
01A7 98A8 CBI 0x15,0
(0401) asm("nop");
01A8 0000 NOP
(0402) if((dat&0x80)!=0)
01A9 FF07 SBRS R16,7
01AA C002 RJMP 0x01AD
(0403) S_DATA;
01AB 9AAA SBI 0x15,2
01AC C001 RJMP 0x01AE
(0404) else
(0405) C_DATA;
01AD 98AA CBI 0x15,2
(0406) dat<<=1;
01AE 0F00 LSL R16
(0407) asm("nop");
01AF 0000 NOP
(0408) S_CLK; // 时钟拉高
01B0 9AA8 SBI 0x15,0
01B1 9543 INC R20
01B2 3048 CPI R20,0x8
01B3 F398 BCS 0x01A7
(0409) }
(0410) S_CS; //cs 拉高
01B4 9AA9 SBI 0x15,1
01B5 D1BA RCALL pop_gset1
01B6 9508 RET
_time0_ovf_isr:
01B7 D1CC RCALL push_lset
(0411) }
(0412) //定时器1中断,1ms中断一次
(0413) #pragma interrupt_handler time0_ovf_isr:10
(0414) void time0_ovf_isr(void)
(0415) {
(0416) TCNT0=0xF8; //重新装置
01B8 EF88 LDI R24,0xF8
01B9 BF82 OUT 0x32,R24
(0417) count++;
01BA 91800070 LDS R24,count
01BC 91900071 LDS R25,count+1
01BE 9601 ADIW R24,1
01BF 93900071 STS count+1,R25
01C1 93800070 STS count,R24
(0418) if(count>=100) //100ms
01C3 3684 CPI R24,0x64
01C4 E0E0 LDI R30,0
01C5 079E CPC R25,R30
01C6 F030 BCS 0x01CD
(0419) count=0;
01C7 2422 CLR R2
01C8 2433 CLR R3
01C9 92300071 STS count+1,R3
01CB 92200070 STS count,R2
(0420) if(flag==0)
01CD 90200060 LDS R2,flag
01CF 2022 TST R2
01D0 F491 BNE 0x01E3
(0421) { flag=1;
01D1 E081 LDI R24,1
01D2 93800060 STS flag,R24
(0422) //个位显示
(0423) PORTC&=(~0x18);
01D4 B385 IN R24,0x15
01D5 7E87 ANDI R24,0xE7
01D6 BB85 OUT 0x15,R24
(0424) HC595_SENDDAT(table[ge]|0x80); //加小数点
01D7 E681 LDI R24,0x61
01D8 E090 LDI R25,0
01D9 91E0006D LDS R30,ge
01DB 27FF CLR R31
01DC 0FE8 ADD R30,R24
01DD 1FF9 ADC R31,R25
01DE 8100 LDD R16,Z+0
01DF 6800 ORI R16,0x80
01E0 DFC1 RCALL _HC595_SENDDAT
(0425) PORTC|=0x10;
01E1 9AAC SBI 0x15,4
(0426) }
01E2 C010 RJMP 0x01F3
(0427) else
(0428) { flag=0;
01E3 2422 CLR R2
01E4 92200060 STS flag,R2
(0429) //十位显示
(0430) PORTC&=(~0x18);
01E6 B385 IN R24,0x15
01E7 7E87 ANDI R24,0xE7
01E8 BB85 OUT 0x15,R24
(0431) HC595_SENDDAT(table[shi]);
01E9 E681 LDI R24,0x61
01EA E090 LDI R25,0
01EB 91E0006E LDS R30,shi
01ED 27FF CLR R31
01EE 0FE8 ADD R30,R24
01EF 1FF9 ADC R31,R25
01F0 8100 LDD R16,Z+0
01F1 DFB0 RCALL _HC595_SENDDAT
(0432) PORTC|=0x08;
01F2 9AAB SBI 0x15,3
(0433) }
01F3 D1A7 RCALL pop_lset
01F4 9518 RETI
_main:
m --> R12
a --> R10
temh --> R20
teml --> R22
i --> R12
temporary --> Y+0
j --> R14
01F5 9729 SBIW R28,0x9
(0434)
(0435) }
(0436)
(0437) /*************************** 主机先发送,等待接收***************************/
(0438) /* 说明:外部中断0不使能,如果允许,显示保持不住。*/
(0439) void main( void )
(0440) { unsigned char i,j;
(0441) unsigned char teml,temh;
(0442) unsigned char a=0;
01F6 24AA CLR R10
(0443) unsigned int m;
(0444) unsigned char temporary[9];
(0445) //M8 端口初始化
(0446) PORTB=0x07; //MCP2515 disable(CS,PB2),PB1,PB0上、下行灯灭
01F7 E087 LDI R24,7
01F8 BB88 OUT 0x18,R24
(0447) DDRB|=0x07;
01F9 B387 IN R24,0x17
01FA 6087 ORI R24,7
01FB BB87 OUT 0x17,R24
(0448) DDRD=0xC0; //1100 0000 PD7、PD6输出保持,PD5、PD4按键输入
01FC EC80 LDI R24,0xC0
01FD BB81 OUT 0x11,R24
(0449) PORTC=0x02; //CS disable
01FE E082 LDI R24,2
01FF BB85 OUT 0x15,R24
(0450) DDRC|=0x1F; //PC3为595的位选COM2(十位),PC4为595的位选COM1(个位)+595(PC0、PC1、PC2)
0200 B384 IN R24,0x14
0201 618F ORI R24,0x1F
0202 BB84 OUT 0x14,R24
(0451) /*use int0*/
(0452) // GICR|=0x40; //int0 enable
(0453) //MCUCR|=0x02; //下降沿触发中断0
(0454) //uart_init(); //串口初始化
(0455) //初始化SPI
(0456) init_SPI();
0203 DE46 RCALL _init_SPI
(0457) //reset mcp2515
(0458) reset_MCP();
0204 DE4B RCALL _reset_MCP
(0459) //初始化 CAN
(0460) init_can();
0205 DEA2 RCALL _init_can
(0461) minus_flag=0; //初始化负温度标志
0206 2422 CLR R2
0207 9220006B STS minus_flag,R2
(0462) CLI(); //关中断
0209 94F8 BCLR 7
(0463) //矫正第一次数据,不矫正第一次显示85
(0464) while(!ds1820_ack());
020A DF1E RCALL _ds1820_ack
020B 2300 TST R16
020C F3E9 BEQ 0x020A
(0465) write_byte(0xCC); // Skip ROM
020D EC0C LDI R16,0xCC
020E DF51 RCALL _write_byte
(0466) write_byte(0x44); // Start Conversion
020F E404 LDI R16,0x44
0210 DF4F RCALL _write_byte
(0467) wait(750);
0211 EE0E LDI R16,0xEE
0212 E012 LDI R17,2
0213 DF6B RCALL _wait
(0468) while(!ds1820_ack());
0214 DF14 RCALL _ds1820_ack
0215 2300 TST R16
0216 F3E9 BEQ 0x0214
(0469) write_byte(0xCC); // Skip ROM
0217 EC0C LDI R16,0xCC
0218 DF47 RCALL _write_byte
(0470) write_byte(0xBE); // Read Scratch Pad
0219 EB0E LDI R16,0xBE
021A DF45 RCALL _write_byte
(0471) teml = read_byte();
021B DF24 RCALL _read_byte
021C 2F60 MOV R22,R16
(0472) temh = read_byte();
021D DF22 RCALL _read_byte
021E 2F40 MOV R20,R16
(0473) m=temh*256+teml;
021F 2F24 MOV R18,R20
0220 2733 CLR R19
0221 E000 LDI R16,0
0222 E011 LDI R17,1
0223 D12D RCALL empy16s
0224 0168 MOVW R12,R16
0225 2E26 MOV R2,R22
0226 2433 CLR R3
0227 0CC2 ADD R12,R2
0228 1CD3 ADC R13,R3
(0474) if ((m&0xf800)!=0)
0229 01C6 MOVW R24,R12
022A 7080 ANDI R24,0
022B 7F98 ANDI R25,0xF8
022C 3080 CPI R24,0
022D 0789 CPC R24,R25
022E F089 BEQ 0x0240
(0475) {minus_flag=1;
022F E081 LDI R24,1
0230 9380006B STS minus_flag,R24
(0476) m=(~m)+1; //取反
0232 01C6 MOVW R24,R12
0233 9580 COM R24
0234 9590 COM R25
0235 9601 ADIW R24,1
0236 016C MOVW R12,R24
(0477) a=(unsigned char)((m*5)/80);}
0237 E005 LDI R16,5
0238 E010 LDI R17,0
0239 019C MOVW R18,R24
023A D116 RCALL empy16s
023B E520 LDI R18,0x50
023C E030 LDI R19,0
023D D0E1 RCALL div16u
023E 2EA0 MOV R10,R16
023F C008 RJMP 0x0248
(0478) else
(0479) a=(unsigned char)((m*5)/80);
0240 E005 LDI R16,5
0241 E010 LDI R17,0
0242 0196 MOVW R18,R12
0243 D10D RCALL empy16s
0244 E520 LDI R18,0x50
0245 E030 LDI R19,0
0246 D0D8 RCALL div16u
0247 2EA0 MOV R10,R16
(0480) shi=a/10;
0248 E01A LDI R17,0xA
0249 2D0A MOV R16,R10
024A D0F0 RCALL div8u
024B 9300006E STS shi,R16
(0481) ge=a%10;
024D E01A LDI R17,0xA
024E 2D0A MOV R16,R10
024F D0E9 RCALL mod8u
0250 9300006D STS ge,R16
(0482) if(minus_flag==1)
0252 9180006B LDS R24,minus_flag
0254 3081 CPI R24,1
0255 F429 BNE 0x025B
(0483) wendu=a|0x80; //暂时做 char处理
0256 2D8A MOV R24,R10
0257 6880 ORI R24,0x80
0258 9380006F STS wendu,R24
025A C002 RJMP 0x025D
(0484) else
(0485) wendu=a;
025B 92A0006F STS wendu,R10
(0486) TCNT0=0xF8;//1ms
025D EF88 LDI R24,0xF8
025E BF82 OUT 0x32,R24
(0487) TCCR0=5; //1024
025F E085 LDI R24,5
0260 BF83 OUT 0x33,R24
(0488) TIMSK=(1<<TOIE0);
0261 E081 LDI R24,1
0262 BF89 OUT 0x39,R24
(0489) count=0;
0263 2422 CLR R2
0264 2433 CLR R3
0265 92300071 STS count+1,R3
0267 92200070 STS count,R2
(0490) dot1=0;
0269 9220006C STS dot1,R2
(0491) //开中断
(0492) SEI();
026B 9478 BSET 7
026C C0AD RJMP 0x031A
(0493) while(1)
(0494) { if(count==0)
026D 90200070 LDS R2,count
026F 90300071 LDS R3,count+1
0271 2022 TST R2
0272 F009 BEQ 0x0274
0273 C0A6 RJMP 0x031A
0274 2033 TST R3
0275 F009 BEQ 0x0277
0276 C0A3 RJMP 0x031A
(0495) { fill_msg_box_0(); //填充CAN数据
0277 DE1E RCALL _fill_msg_box_0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -