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