📄 inject.lst
字号:
__text_start:
__start:
3F EFCF LDI R28,0xFF
40 E0D4 LDI R29,4
41 BFCD OUT 0x3D,R28
42 BFDE OUT 0x3E,R29
43 55C0 SUBI R28,0x50
44 40D0 SBCI R29,0
45 EA0A LDI R16,0xAA
46 8308 STD Y+0,R16
47 2400 CLR R0
48 E4EA LDI R30,0x4A
49 E0F1 LDI R31,1
4A E011 LDI R17,1
4B 37E9 CPI R30,0x79
4C 07F1 CPC R31,R17
4D F011 BEQ 0x0050
4E 9201 ST R0,Z+
4F CFFB RJMP 0x004B
50 8300 STD Z+0,R16
51 E3E4 LDI R30,0x34
52 E0F0 LDI R31,0
53 E0A0 LDI R26,0
54 E0B1 LDI R27,1
55 E010 LDI R17,0
56 E000 LDI R16,0
57 BF0B OUT 0x3B,R16
58 37EE CPI R30,0x7E
59 07F1 CPC R31,R17
5A F021 BEQ 0x005F
5B 95C8 LPM
5C 9631 ADIW R30,1
5D 920D ST R0,X+
5E CFF9 RJMP 0x0058
5F D34C RCALL _main
_exit:
60 CFFF RJMP _exit
FILE: C:\DOCUME~1\Administrator\桌面\程序\油泵油嘴实验台\可用\油泵油~2\uart.c
(0001) #include <iom88v.h>
(0002) #include <macros.h>
(0003) #include <uart.h>
(0004) #include <timer1.h>
(0005)
(0006) void FlashRxBuf(void)
(0007) {
(0008) rx_error0 = 0;
_FlashRxBuf:
61 2422 CLR R2
62 9220 0162 STS rx_error0,R2
(0009) rx_counter0 = 0;
64 9220 0163 STS rx_counter0,R2
(0010) rx_rd_index0 = 0;
66 9220 0164 STS rx_rd_index0,R2
(0011) FrameHead0 = 0;
68 9220 0161 STS FrameHead0,R2
6A 9508 RET
(0012) }
(0013)
(0014) //UART0 initialize
(0015) // desired baud rate: 9600
(0016) // actual: baud rate:9615 (0.2%)
(0017) // char size: 8 bit
(0018) // parity: Even
(0019) void uart0_init(void)
(0020) {
(0021) UCSR0B = 0x00; //disable while setting baud rate
_uart0_init:
6B 2422 CLR R2
6C 9220 00C1 STS 0x00C1,R2
(0022) UCSR0A = 0x00;
6E 9220 00C0 STS 0x00C0,R2
(0023) UCSR0C = 0x26;
70 E286 LDI R24,0x26
71 9380 00C2 STS 0x00C2,R24
(0024) UBRR0L = 0x33; //set baud rate lo
73 E383 LDI R24,0x33
74 9380 00C4 STS 0x00C4,R24
(0025) UBRR0H = 0x00; //set baud rate hi
76 9220 00C5 STS 0x00C5,R2
(0026) UCSR0B = 0xD8;
78 ED88 LDI R24,0xD8
79 9380 00C1 STS 0x00C1,R24
(0027) FlashRxBuf();
7B DFE5 RCALL _FlashRxBuf
7C 9508 RET
(0028) }
(0029)
(0030)
(0031)
(0032) char TestFrameHead(char data)
(0033) {
(0034) if(data == FRAMEFLAG1) //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
_TestFrameHead:
data --> R16
7D 3F0F CPI R16,0xFF
7E F411 BNE 0x0081
(0035) return 1;
7F E001 LDI R16,1
80 C001 RJMP 0x0082
(0036) else
(0037) return 0;
81 2700 CLR R16
82 9508 RET
_uart0_rx_isr:
data --> R10
status --> R20
83 920A ST R0,-Y
84 921A ST R1,-Y
85 922A ST R2,-Y
86 923A ST R3,-Y
87 924A ST R4,-Y
88 925A ST R5,-Y
89 926A ST R6,-Y
8A 927A ST R7,-Y
8B 928A ST R8,-Y
8C 929A ST R9,-Y
8D 92AA ST R10,-Y
8E 930A ST R16,-Y
8F 931A ST R17,-Y
90 932A ST R18,-Y
91 933A ST R19,-Y
92 934A ST R20,-Y
93 938A ST R24,-Y
94 939A ST R25,-Y
95 93AA ST R26,-Y
96 93BA ST R27,-Y
97 93EA ST R30,-Y
98 93FA ST R31,-Y
99 B60F IN R0,0x3F
9A 920A ST R0,-Y
9B 92AA ST R10,-Y
9C 934A ST R20,-Y
(0038) }
(0039) // USART0 Receiver interrupt service routine
(0040) #pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
(0041) void uart0_rx_isr(void)
(0042) {
(0043) char status,data;
(0044) status=UCSR0A;
9D 9140 00C0 LDS R20,0x00C0
(0045) data=UDR0;
9F 90A0 00C6 LDS R10,0x00C6
(0046) // putchar(251); //回传接收成功标志 debug
(0047) // putchar(251); //回传接收成功标志debug
(0048) // if(data == 0xFF) //DEBUG
(0049) // UDR0 = data; //DEBUG
(0050) if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
A1 2F84 MOV R24,R20
A2 718C ANDI R24,0x1C
A3 F531 BNE 0x00CA
(0051) {
(0052) if(FrameHead0 == 0 && rx_counter0 == 0) //判断是否帧头
A4 9020 0161 LDS R2,FrameHead0
A6 2022 TST R2
A7 F459 BNE 0x00B3
A8 9020 0163 LDS R2,rx_counter0
AA 2022 TST R2
AB F439 BNE 0x00B3
(0053) {
(0054) if(TestFrameHead(data)) //数据有效才设置FrameHead
AC 2D0A MOV R16,R10
AD DFCF RCALL _TestFrameHead
AE 2300 TST R16
AF F0E9 BEQ 0x00CD
(0055) {
(0056) FrameHead0 = data;
B0 92A0 0161 STS FrameHead0,R10
(0057) }
(0058) }
B2 C01A RJMP 0x00CD
(0059)
(0060) else
(0061) {
(0062) rx_buffer0[rx_counter0]=data;
B3 E685 LDI R24,0x65
B4 E091 LDI R25,1
B5 91E0 0163 LDS R30,rx_counter0
B7 27FF CLR R31
B8 0FE8 ADD R30,R24
B9 1FF9 ADC R31,R25
BA 82A0 STD Z+0,R10
(0063) // putchar(251); //回传接收成功标志 debug
(0064) // putchar(251); //回传接收成功标志debug
(0065) if (++rx_counter0 == RX_BUFFER_SIZE0)
BB 9180 0163 LDS R24,rx_counter0
BD 5F8F SUBI R24,0xFF
BE 2E28 MOV R2,R24
BF 9220 0163 STS rx_counter0,R2
C1 3184 CPI R24,0x14
C2 F451 BNE 0x00CD
(0066) {
(0067) rx_counter0 = 0;
C3 2422 CLR R2
C4 9220 0163 STS rx_counter0,R2
(0068) rx_error0 = 1;
C6 E081 LDI R24,1
C7 9380 0162 STS rx_error0,R24
(0069) }
(0070) }
(0071) }
C9 C003 RJMP 0x00CD
(0072) else rx_error0 = 1 ;
CA E081 LDI R24,1
CB 9380 0162 STS rx_error0,R24
CD 9149 LD R20,Y+
CE 90A9 LD R10,Y+
CF 9009 LD R0,Y+
D0 BE0F OUT 0x3F,R0
D1 91F9 LD R31,Y+
D2 91E9 LD R30,Y+
D3 91B9 LD R27,Y+
D4 91A9 LD R26,Y+
D5 9199 LD R25,Y+
D6 9189 LD R24,Y+
D7 9149 LD R20,Y+
D8 9139 LD R19,Y+
D9 9129 LD R18,Y+
DA 9119 LD R17,Y+
DB 9109 LD R16,Y+
DC 90A9 LD R10,Y+
DD 9099 LD R9,Y+
DE 9089 LD R8,Y+
DF 9079 LD R7,Y+
E0 9069 LD R6,Y+
E1 9059 LD R5,Y+
E2 9049 LD R4,Y+
E3 9039 LD R3,Y+
E4 9029 LD R2,Y+
E5 9019 LD R1,Y+
E6 9009 LD R0,Y+
E7 9518 RETI
(0073) }
(0074)
(0075)
(0076)
(0077) // Get a character from the USART0 Receiver buffer
(0078) char getchar(void)
(0079) {
(0080) char data;
(0081) char IisOn = 1;
_getchar:
data --> R16
IisOn --> R18
E8 E021 LDI R18,1
(0082) if((SREG & 0x80) == 0x00) //I之前是否置位
E9 B62F IN R2,0x3F
EA FC27 SBRC R2,7
EB C001 RJMP 0x00ED
(0083) IisOn = 0;
EC 2722 CLR R18
(0084)
(0085) while (rx_counter0==0);
ED 9020 0163 LDS R2,rx_counter0
EF 2022 TST R2
F0 F3E1 BEQ 0x00ED
(0086) data=rx_buffer0[rx_rd_index0];
F1 E685 LDI R24,0x65
F2 E091 LDI R25,1
F3 91E0 0164 LDS R30,rx_rd_index0
F5 27FF CLR R31
F6 0FE8 ADD R30,R24
F7 1FF9 ADC R31,R25
F8 8100 LDD R16,Z+0
(0087) if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
F9 9180 0164 LDS R24,rx_rd_index0
FB 5F8F SUBI R24,0xFF
FC 2E28 MOV R2,R24
FD 9220 0164 STS rx_rd_index0,R2
FF 3184 CPI R24,0x14
100 F419 BNE 0x0104
101 2422 CLR R2
102 9220 0164 STS rx_rd_index0,R2
(0088) CLI();
104 94F8 BCLR 7
(0089) --rx_counter0;
105 9180 0163 LDS R24,rx_counter0
107 5081 SUBI R24,1
108 9380 0163 STS rx_counter0,R24
(0090) if(IisOn)
10A 2322 TST R18
10B F009 BEQ 0x010D
(0091) SEI();
10C 9478 BSET 7
(0092) return data;
10D 9508 RET
_uart0_tx_isr:
10E 922A ST R2,-Y
10F 938A ST R24,-Y
110 939A ST R25,-Y
111 93EA ST R30,-Y
112 93FA ST R31,-Y
113 B62F IN R2,0x3F
114 922A ST R2,-Y
(0093) }
(0094)
(0095)
(0096)
(0097)
(0098) // USART0 Transmitter interrupt service routine
(0099) #pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
(0100) void uart0_tx_isr(void)
(0101) {
(0102) if (tx_counter0)
115 9020 014A LDS R2,tx_counter0
117 2022 TST R2
118 F0D1 BEQ 0x0133
(0103) {
(0104) --tx_counter0;
119 9180 014A LDS R24,tx_counter0
11B 5081 SUBI R24,1
11C 9380 014A STS tx_counter0,R24
(0105) UDR0=tx_buffer0[tx_rd_index0];
11E E48D LDI R24,0x4D
11F E091 LDI R25,1
120 91E0 014B LDS R30,tx_rd_index0
122 27FF CLR R31
123 0FE8 ADD R30,R24
124 1FF9 ADC R31,R25
125 8020 LDD R2,Z+0
126 9220 00C6 STS 0x00C6,R2
(0106) if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
128 9180 014B LDS R24,tx_rd_index0
12A 5F8F SUBI R24,0xFF
12B 2E28 MOV R2,R24
12C 9220 014B STS tx_rd_index0,R2
12E 3184 CPI R24,0x14
12F F419 BNE 0x0133
130 2422 CLR R2
131 9220 014B STS tx_rd_index0,R2
(0107) };
133 9029 LD R2,Y+
134 BE2F OUT 0x3F,R2
135 91F9 LD R31,Y+
136 91E9 LD R30,Y+
137 9199 LD R25,Y+
138 9189 LD R24,Y+
139 9029 LD R2,Y+
13A 9518 RETI
_putchar:
IisOn --> R20
c --> R16
13B 934A ST R20,-Y
(0108) }
(0109)
(0110)
(0111)
(0112) // Write a character to the USART0 Transmitter buffer
(0113) void putchar(char c)
(0114) {
(0115) char IisOn = 1;
13C E041 LDI R20,1
(0116) if((SREG & 0x80) == 0x00) //I之前是否置位
13D B62F IN R2,0x3F
13E FC27 SBRC R2,7
13F C001 RJMP 0x0141
(0117) IisOn = 0;
140 2744 CLR R20
(0118) while (tx_counter0 == TX_BUFFER_SIZE0);
141 9180 014A LDS R24,tx_counter0
143 3184 CPI R24,0x14
144 F3E1 BEQ 0x0141
(0119) CLI();
145 94F8 BCLR 7
(0120) if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
146 9020 014A LDS R2,tx_counter0
148 2022 TST R2
149 F421 BNE 0x014E
14A 9020 00C0 LDS R2,0x00C0
14C FC25 SBRC R2,5
14D C019 RJMP 0x0167
(0121) {
(0122) tx_buffer0[tx_wr_index0]=c;
14E E48D LDI R24,0x4D
14F E091 LDI R25,1
150 91E0 014C LDS R30,tx_wr_index0
152 27FF CLR R31
153 0FE8 ADD R30,R24
154 1FF9 ADC R31,R25
155 8300 STD Z+0,R16
(0123) if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
156 9180 014C LDS R24,tx_wr_index0
158 5F8F SUBI R24,0xFF
159 2E28 MOV R2,R24
15A 9220 014C STS tx_wr_index0,R2
15C 3184 CPI R24,0x14
15D F419 BNE 0x0161
15E 2422 CLR R2
15F 9220 014C STS tx_wr_index0,R2
(0124) ++tx_counter0;
161 9180 014A LDS R24,tx_counter0
163 5F8F SUBI R24,0xFF
164 9380 014A STS tx_counter0,R24
(0125) }
166 C002 RJMP 0x0169
(0126) else
(0127) UDR0=c;
167 9300 00C6 STS 0x00C6,R16
(0128) if(IisOn)
169 2344 TST R20
16A F009 BEQ 0x016C
(0129) SEI();
16B 9478 BSET 7
16C 9149 LD R20,Y+
16D 9508 RET
_DisposeBufDatas:
spray2NumH --> R14
spray2NumL --> R12
spray1NumH --> Y,+6
spray1NumL --> Y,+5
tPump1On --> R10
tSpray1Cyc --> Y,+3
tSpray1On --> Y,+2
tPump1Cyc --> Y,+1
IisOn --> Y,+0
16E D2BA RCALL push_xgsetF0FC
16F 9727 SBIW R28,7
(0130) }
(0131)
(0132) void DisposeBufDatas(void)
(0133) {
(0134) //定义变量
(0135) unsigned char tPump1Cyc; //油泵1周期,单位ms
(0136) unsigned char tSpray1On; //喷射脉宽,单位0.1ms
(0137) //unsigned char tSpray1OnH;
(0138) unsigned int tSpray1Cyc; //喷射周期,单位ms
(0139) unsigned char tPump1On; //油泵1脉宽,单位0.1ms
(0140) char spray1NumL; //SprayNum低字节
(0141) char spray1NumH; //SprayNum高字节
(0142)
(0143) //unsigned char tPump2Cyc; //油泵2周期,单位ms
(0144) //unsigned char tSpray2On; //喷射脉宽,单位0.1ms
(0145) //unsigned int tSpray2Cyc; //喷射周期,单位ms
(0146) //unsigned char tPump2On; //油泵2脉宽,单位0.1ms
(0147) char spray2NumL; //SprayNum低字节
(0148) char spray2NumH; //SprayNum高字节
(0149)
(0150) char IisOn = 1;
170 2400 CLR R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -