📄 f06x_uart1_interrupt.lst
字号:
154 // Return Value : None
155 // Parameters : None
156 //
157 // This function configures the crossbar and GPIO ports.
158 //
159 // Pinout:
160 //
161 // P0.0 digital push-pull UART TX
162 // P0.1 digital open-drain UART RX
163 //-----------------------------------------------------------------------------
164 void PORT_Init (void)
165 {
166 1 char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
167 1
168 1 SFRPAGE = CONFIG_PAGE; // Set SFR page
169 1
170 1 XBR0 = 0x00;
171 1 XBR1 = 0x00;
172 1 XBR2 = 0x44; // Enable crossbar and weak pull-up
173 1 // Enable UART1
174 1
175 1 P0MDOUT |= 0x01; // Set TX pin to push-pull
176 1
177 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
178 1 }
179
C51 COMPILER V8.08 F06X_UART1_INTERRUPT 02/02/2008 09:37:19 PAGE 4
180 //-----------------------------------------------------------------------------
181 // UART1_Init
182 //-----------------------------------------------------------------------------
183 //
184 // Return Value : None
185 // Parameters : None
186 //
187 // Configure the UART1 using Timer1, for <BAUDRATE> and 8-N-1.
188 //
189 //-----------------------------------------------------------------------------
190 void UART1_Init (void)
191 {
192 1 char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
193 1
194 1 SFRPAGE = UART1_PAGE;
195 1 SCON1 = 0x10; // SCON1: mode 0, 8-bit UART, enable RX
196 1
197 1 SFRPAGE = TIMER01_PAGE;
198 1 TMOD &= ~0xF0;
199 1 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
200 1
201 1
202 1 if (SYSTEMCLOCK/BAUDRATE/2/256 < 1) {
203 2 TH1 = -(SYSTEMCLOCK/BAUDRATE/2);
204 2 CKCON |= 0x10; // T1M = 1; SCA1:0 = xx
205 2 } else if (SYSTEMCLOCK/BAUDRATE/2/256 < 4) {
206 2 TH1 = -(SYSTEMCLOCK/BAUDRATE/2/4);
207 2 CKCON &= ~0x13; // Clear all T1 related bits
208 2 CKCON |= 0x01; // T1M = 0; SCA1:0 = 01
209 2 } else if (SYSTEMCLOCK/BAUDRATE/2/256 < 12) {
210 2 TH1 = -(SYSTEMCLOCK/BAUDRATE/2/12);
211 2 CKCON &= ~0x13; // T1M = 0; SCA1:0 = 00
212 2 } else {
213 2 TH1 = -(SYSTEMCLOCK/BAUDRATE/2/48);
214 2 CKCON &= ~0x13; // Clear all T1 related bits
215 2 CKCON |= 0x02; // T1M = 0; SCA1:0 = 10
216 2 }
217 1
218 1 TL1 = TH1; // init Timer1
219 1 TR1 = 1; // START Timer1
220 1 TX_Ready = 1; // Flag showing that UART can transmit
221 1 EIE2 = 0x40; // Enable UART1 interrupts
222 1
223 1 SFRPAGE = UART1_PAGE;
224 1 EIP2 = 0x40; // Make UART high priority
225 1
226 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
227 1 }
228
229 //-----------------------------------------------------------------------------
230 // Interrupt Service Routines
231 //-----------------------------------------------------------------------------
232
233 //-----------------------------------------------------------------------------
234 // UART1_Interrupt
235 //-----------------------------------------------------------------------------
236 //
237 // This routine is invoked whenever a character is entered or displayed on the
238 // Hyperterminal.
239 //
240 //-----------------------------------------------------------------------------
241
C51 COMPILER V8.08 F06X_UART1_INTERRUPT 02/02/2008 09:37:19 PAGE 5
242 void UART1_Interrupt (void) interrupt 20
243 {
244 1 SFRPAGE = UART1_PAGE;
245 1
246 1 if (RI1 == 1)
247 1 {
248 2 if( UART_Buffer_Size == 0) { // If new word is entered
249 3 UART_Input_First = 0; }
250 2
251 2 RI1 = 0; // Clear interrupt flag
252 2
253 2 Byte = SBUF1; // Read a character from UART
254 2
255 2 if (UART_Buffer_Size < UART_BUFFERSIZE)
256 2 {
257 3 UART_Buffer[UART_Input_First] = Byte; // Store in array
258 3
259 3 UART_Buffer_Size++; // Update array's size
260 3
261 3 UART_Input_First++; // Update counter
262 3 }
263 2 }
264 1
265 1 if (TI1 == 1) // Check if transmit flag is set
266 1 {
267 2 TI1 = 0; // Clear interrupt flag
268 2
269 2 if (UART_Buffer_Size != 1) // If buffer not empty
270 2 {
271 3 // If a new word is being output
272 3 if ( UART_Buffer_Size == UART_Input_First ) {
273 4 UART_Output_First = 0; }
274 3
275 3 // Store a character in the variable byte
276 3 Byte = UART_Buffer[UART_Output_First];
277 3
278 3 if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If upper case letter
279 4 Byte -= 32; }
280 3
281 3 SBUF1 = Byte; // Transmit to Hyperterminal
282 3
283 3 UART_Output_First++; // Update counter
284 3
285 3 UART_Buffer_Size--; // Decrease array size
286 3
287 3 }
288 2 else
289 2 {
290 3 UART_Buffer_Size = 0; // Set the array size to 0
291 3 TX_Ready = 1; // Indicate transmission complete
292 3 }
293 2 }
294 1 }
295
296 //-----------------------------------------------------------------------------
297 // End Of File
298 //-----------------------------------------------------------------------------
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 261 ----
CONSTANT SIZE = ---- ----
C51 COMPILER V8.08 F06X_UART1_INTERRUPT 02/02/2008 09:37:19 PAGE 6
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -