📄 结点2.lst
字号:
__start:
__text_start:
5A EFCF LDI R28,0xFF
5B E1D0 LDI R29,0x10
5C BFCD OUT 0x3D,R28
5D BFDE OUT 0x3E,R29
5E 51C8 SUBI R28,0x18
5F 40D0 SBCI R29,0
60 EA0A LDI R16,0xAA
61 8308 STD Y+0,R16
62 2400 CLR R0
63 E1E6 LDI R30,0x16
64 E0F1 LDI R31,1
65 E011 LDI R17,1
66 31E8 CPI R30,0x18
67 07F1 CPC R31,R17
68 F011 BEQ 0x006B
69 9201 ST R0,Z+
6A CFFB RJMP 0x0066
6B 8300 STD Z+0,R16
6C E9EE LDI R30,0x9E
6D E0F0 LDI R31,0
6E E0A0 LDI R26,0
6F E0B1 LDI R27,1
70 E010 LDI R17,0
71 E000 LDI R16,0
72 BF0B OUT 0x3B,R16
73 3BE4 CPI R30,0xB4
74 07F1 CPC R31,R17
75 F021 BEQ 0x007A
76 95C8 LPM
77 9631 ADIW R30,1
78 920D ST R0,X+
79 CFF9 RJMP 0x0073
7A 940E 01A8 CALL _main
_exit:
7C CFFF RJMP _exit
FILE: D:\CANBUS\数据帧\查询\单向通讯\结点2\AT90CAN128.C
(0001) #define _MAIN_H
(0002) #include "AT90CAN128.H"
(0003)
(0004) uint8 CS = 0;
(0005) uint8 volatile CHA =0;
(0006) uint8 me_DLC = 0;
(0007)
(0008) BOOL LED[5] = {FALSE,FALSE,FALSE,FALSE,FALSE};
(0009) BOOL volatile send_mark = TRUE;
(0010) BOOL volatile display_mark = TRUE;
(0011) uint16 send_time = 0;
(0012) uint16 display_time = 0;
(0013)
(0014)
(0015) void PORT_Init(void)
(0016) {
(0017) PORTA = 0xFF;
_PORT_Init:
7D EF8F LDI R24,0xFF
7E B982 OUT 0x02,R24
(0018) DDRA = 0xFF; //数码管
7F B981 OUT 0x01,R24
(0019)
(0020) PORTB = 0xFF;
80 B985 OUT 0x05,R24
(0021) DDRB = 0x00;
81 2422 CLR R2
82 B824 OUT 0x04,R2
(0022)
(0023) PORTC = 0xFF; //m103 output only
83 B988 OUT 0x08,R24
(0024) DDRC = 0xFF;
84 B987 OUT 0x07,R24
(0025)
(0026) PORTD = 0xFF;//PD4
85 B98B OUT 0x0B,R24
(0027) DDRD = 0x10;
86 E180 LDI R24,0x10
87 B98A OUT 0x0A,R24
(0028)
(0029) PORTE = 0xFF;
88 EF8F LDI R24,0xFF
89 B98E OUT 0x0E,R24
(0030) DDRE = 0x00;
8A B82D OUT 0x0D,R2
(0031)
(0032) PORTF = 0xFF;
8B BB81 OUT 0x11,R24
(0033) DDRF = 0x00;
8C BA20 OUT 0x10,R2
(0034)
(0035) PORTG = 0xFF;
8D BB84 OUT 0x14,R24
(0036) DDRG = 0x00;
8E BA23 OUT 0x13,R2
(0037) //=======================================================================
(0038) //ADEN置位即启动ADC,否则ADC功能关闭。在转换过程中关闭ADC将立即中止正在进
(0039) //行的转换。
(0040) //=======================================================================
(0041) ADCSRA = (0 << ADEN); // 关闭数/模转换器
8F 9220 007A STS 0x007A,R2
(0042) //=======================================================================
(0043) //ACD 置位时,模拟比较器的电源被切断。可以在任何时候设置此位来关掉模拟比较器。这
(0044) //可以减少器件工作模式及空闲模式下的功耗。改变ACD 位时,必须清零ACSR 寄存器的
(0045) //ACIE 位来禁止模拟比较器中断。否则ACD 改变时可能会产生中断。
(0046) //当ACIE 位被置"1” 且状态寄存器中的全局中断标志I 也被置位时,模拟比较器中断被激
(0047) //活。否则中断被禁止。
(0048) //=======================================================================
(0049) ACSR = (1 << ACD) | (0 << ACIE); // 关闭模拟比较器
91 E880 LDI R24,0x80
92 BF80 OUT 0x30,R24
(0050) //=======================================================================
(0051) // EEWE复位值不定
(0052) //=======================================================================
(0053) EECR = 0;
93 BA2F OUT 0x1F,R2
94 9508 RET
(0054) }
(0055)
(0056)
(0057) //////////////////////////////////////////////////////////////////////
(0058) //TIMER0 initialize - prescale:1024
(0059) // WGM: CTC
(0060) // desired value: 1mSec
(0061) // actual value: 1.019mSec (-1.9%)
(0062) // 定时器0=2毫秒=寄存器比较值11059200*2/1024/1000-1=21.6-1=20.6=0x35
(0063) //--------------------------------------------------------------------
(0064) //FOC0A WGM00 COM0A1 COM0A0 WGM01 CS02 CS01 CS00
(0065) // 0 1 1 0 1
(0066) //////////////////////////////////////////////////////////////////////
(0067) void TIMER0_Init(void)
(0068) {
(0069) TCCR0 = 0x00; //stop
_TIMER0_Init:
95 2422 CLR R2
96 BC24 OUT 0x24,R2
(0070) ASSR = 0x00; //set async mode
97 9220 00B6 STS 0x00B6,R2
(0071) TCNT0 = 0xF9; //set count
99 EF89 LDI R24,0xF9
9A BD86 OUT 0x26,R24
(0072) OCR0 = 0x07;
9B E087 LDI R24,7
9C BD87 OUT 0x27,R24
(0073) TCCR0 = 0x0D; //start timer
9D E08D LDI R24,0xD
9E BD84 OUT 0x24,R24
(0074) TIMSK0 = (1 << OCIE0); // 使能T0=自动重装中断(1<<TOIE0)|
9F E082 LDI R24,2
A0 9380 006E STS 0x006E,R24
A2 9508 RET
(0075) }
(0076)
(0077)
(0078) //////////////////////////////////////////////////////////////////////
(0079) //TIMER2 initialize - prescale:1024
(0080) // WGM: CTC
(0081) // desired value: 5mSec
(0082) // actual value: 5.000mSec (0.0%)
(0083) // 256-11059200*5/1024/1000/10=256-54=202=0xCA(5毫秒)
(0084) // 定时器2=10毫秒=寄存器比较值11059200*10/1024/1000-1=108-1=107=0x6B
(0085) //--------------------------------------------------------------------
(0086) //FOC2A WGM20 COM2A1 COM2A0 WGM21 CS22 CS21 CS20
(0087) // 0 1 1 1 1
(0088) //////////////////////////////////////////////////////////////////////
(0089) void TIMER2_Init(void)
(0090) {
(0091) TCCR2 = 0x00; //stop
_TIMER2_Init:
A3 2422 CLR R2
A4 9220 00B0 STS 0x00B0,R2
(0092) TCNT2 = 0xD9; //setup
A6 ED89 LDI R24,0xD9
A7 9380 00B2 STS 0x00B2,R24
(0093) OCR2 = 0x27;
A9 E287 LDI R24,0x27
AA 9380 00B3 STS 0x00B3,R24
(0094) TCCR2 = 0x0F; //start
AC E08F LDI R24,0xF
AD 9380 00B0 STS 0x00B0,R24
(0095) TIMSK2 = (1 << OCIE2); // 使能T2=自动重装中断(1<<TOIE0)|
AF E082 LDI R24,2
B0 9380 0070 STS 0x0070,R24
B2 9508 RET
(0096) }
(0097)
(0098)
(0099) void Watchdog_Init(void)
(0100) {
(0101) WDR(); // 看门狗计数清零
_Watchdog_Init:
B3 95A8 WDR
(0102) WDTCR = (1 << WDE) | (1 << WDP2) | (1 << WDP1) | (0 << WDP0); // 使能watchdog,并且,采用128K分频,典型溢出时间5V时1S
B4 E08E LDI R24,0xE
B5 9380 0060 STS 0x0060,R24
B7 9508 RET
_ExChange:
K --> R10
K_Lo --> R20
K_Hi --> R22
KK2 --> R12
KK1 --> R14
i --> R10
num --> R16
B8 940E 035E CALL push_xgsetF0FC
(0103) }
(0104)
(0105)
(0106) //////////////////////////////////////////////////////////////////////
(0107) // a = PA7(pa0)
(0108) // b = PA6(pa1)
(0109) // c = PA5(pa2)
(0110) // d = PA4(pa3)
(0111) // e = PA3(pa4)
(0112) // f = PA2(pa5)
(0113) // g = PA1(pa6);
(0114) // h = PA0(pa7)
(0115) //////////////////////////////////////////////////////////////////////
(0116) uint8 ExChange(uint8 num)
(0117) {
(0118) uint8 i;
(0119) uint8 KK1 = num;
BA 2EE0 MOV R14,R16
(0120) uint8 KK2 = num;
BB 2EC0 MOV R12,R16
(0121) uint8 K_Hi = 0;
BC 2766 CLR R22
(0122) uint8 K_Lo = 0;
BD 2744 CLR R20
(0123) uint8 K;
(0124)
(0125) //-----------------------------------------------------------------
(0126) //bit0-->bit7 //bit1-->bit6 //bit2-->bit5 //bit3-->bit4
(0127) //-----------------------------------------------------------------
(0128) for (i=0;i<4;i++)
BE 24AA CLR R10
BF C006 RJMP 0x00C6
(0129) {
(0130) K_Hi <<= 1;
C0 0F66 LSL R22
(0131) if (KK1 & 0x01)
C1 FEE0 SBRS R14,0
C2 C001 RJMP 0x00C4
(0132) K_Hi |= 0x01;
C3 6061 ORI R22,1
(0133) KK1 >>= 1;
C4 94E6 LSR R14
C5 94A3 INC R10
C6 2D8A MOV R24,R10
C7 3084 CPI R24,4
C8 F3B8 BCS 0x00C0
(0134) }
(0135) //-----------------------------------------------------------------
(0136) //bit7-->bit0 //bit6-->bit1 //bit5-->bit2 //bit4-->bit3
(0137) //-----------------------------------------------------------------
(0138) for (i=0;i<4;i++)
C9 24AA CLR R10
CA C006 RJMP 0x00D1
(0139) {
(0140) K_Lo <<= 1;
CB 0F44 LSL R20
(0141) if (KK2 & 0x10)
CC FEC4 SBRS R12,4
CD C001 RJMP 0x00CF
(0142) K_Lo |= 0x01;
CE 6041 ORI R20,1
(0143) KK2 >>= 1;
CF 94C6 LSR R12
D0 94A3 INC R10
D1 2D8A MOV R24,R10
D2 3084 CPI R24,4
D3 F3B8 BCS 0x00CB
(0144) }
(0145) K = ((K_Hi << 4) | K_Lo);
D4 2F86 MOV R24,R22
D5 708F ANDI R24,0xF
D6 9582 SWAP R24
D7 2EA8 MOV R10,R24
D8 2AA4 OR R10,R20
(0146) return (K);
D9 2D0A MOV R16,R10
DA 940C 0353 JMP pop_xgsetF0FC
(0147) }
(0148)
(0149)
(0150) void DISPLAY_LED(void)
(0151) {
(0152) if (LED[0])
_DISPLAY_LED:
DC 9020 0103 LDS R2,LED
DE 2022 TST R2
DF F011 BEQ 0x00E2
(0153) LED1_ON();
E0 9844 CBI 0x08,4
E1 C001 RJMP 0x00E3
(0154) else
(0155) LED1_OFF();
E2 9A44 SBI 0x08,4
(0156)
(0157) if (LED[1])
E3 9020 0104 LDS R2,LED+1
E5 2022 TST R2
E6 F011 BEQ 0x00E9
(0158) LED2_ON();
E7 9843 CBI 0x08,3
E8 C001 RJMP 0x00EA
(0159) else
(0160) LED2_OFF();
E9 9A43 SBI 0x08,3
(0161)
(0162) if (LED[2])
EA 9020 0105 LDS R2,LED+2
EC 2022 TST R2
ED F011 BEQ 0x00F0
(0163) LED3_ON();
EE 9842 CBI 0x08,2
EF C001 RJMP 0x00F1
(0164) else
(0165) LED3_OFF();
F0 9A42 SBI 0x08,2
(0166)
(0167) if (LED[3])
F1 9020 0106 LDS R2,LED+3
F3 2022 TST R2
F4 F011 BEQ 0x00F7
(0168) LED4_ON();
F5 9841 CBI 0x08,1
F6 C001 RJMP 0x00F8
(0169) else
(0170) LED4_OFF();
F7 9A41 SBI 0x08,1
(0171)
(0172) if (LED[4])
F8 9020 0107 LDS R2,0x0107
FA 2022 TST R2
FB F011 BEQ 0x00FE
(0173) LED5_ON();
FC 9840 CBI 0x08,0
FD C001 RJMP 0x00FF
(0174) else
(0175) LED5_OFF();
FE 9A40 SBI 0x08,0
FF 9508 RET
_TIMER0_COMP_ISR:
100 920A ST R0,-Y
101 921A ST R1,-Y
102 922A ST R2,-Y
103 923A ST R3,-Y
104 924A ST R4,-Y
105 925A ST R5,-Y
106 926A ST R6,-Y
107 927A ST R7,-Y
108 928A ST R8,-Y
109 929A ST R9,-Y
10A 930A ST R16,-Y
10B 931A ST R17,-Y
10C 932A ST R18,-Y
10D 933A ST R19,-Y
10E 938A ST R24,-Y
10F 939A ST R25,-Y
110 93AA ST R26,-Y
111 93BA ST R27,-Y
112 93EA ST R30,-Y
113 93FA ST R31,-Y
114 B60F IN R0,0x3F
115 920A ST R0,-Y
116 934A ST R20,-Y
117 935A ST R21,-Y
(0176) }
(0177)
(0178)
(0179) #pragma interrupt_handler TIMER0_COMP_ISR:iv_TIMER0_COMP
(0180) void TIMER0_COMP_ISR(void)
(0181) {
(0182) CS++;
118 9180 0100 LDS R24,CS
11A 5F8F SUBI R24,0xFF
11B 9380 0100 STS CS,R24
(0183) if (CS > 1)
11D E081 LDI R24,1
11E 9020 0100 LDS R2,CS
120 1582 CP R24,R2
121 F418 BCC 0x0125
(0184) CS = 0;
122 2422 CLR R2
123 9220 0100 STS CS,R2
(0185) switch (CS)
125 9140 0100 LDS R20,CS
127 2755 CLR R21
128 3040 CPI R20,0
129 0745 CPC R20,R21
12A F029 BEQ 0x0130
12B 3041 CPI R20,1
12C E0E0 LDI R30,0
12D 075E CPC R21,R30
12E F021 BEQ 0x0133
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -