?? serial.lst
字號:
C51 COMPILER V7.02b SERIAL 01/18/2005 21:45:42 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE SERIAL
OBJECT MODULE PLACED IN SERIAL.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE SERIAL.C DEBUG OBJECTEXTEND
stmt level source
1 /****************************************/
2 /* Copyright (c) 2004, 63研究所 苗龍 */
3 /* All rights reserved. */
4 /* 作 者:苗龍 */
5 /****************************************/
6
7 /******************************************************************************/
8 /* */
9 /* SERIAL.C: Interrupt Controlled Serial Interface for RTX-51 tiny */
10 /* */
11 /******************************************************************************/
12
13
14 #include <reg52.h> /* special function register 8052 */
15 #include <rtx51tny.h> /* RTX-51 tiny functions & defines */
16
17 #define OLEN 8 /* size of serial transmission buffer */
18 unsigned char ostart=0; /* transmission buffer start index */
19 unsigned char oend=0; /* transmission buffer end index */
20 char outbuf[OLEN]; /* storage for transmission buffer */
21 unsigned char otask = 0xff; /* task number of output task */
22
23 #define ILEN 8 /* size of serial receiving buffer */
24 unsigned char istart=0; /* receiving buffer start index */
25 unsigned char iend=0; /* receiving buffer end index */
26 char inbuf[ILEN]; /* storage for receiving buffer */
27 unsigned char itask = 0xff; /* task number of output task */
28
29
30 bit sendfull=0; /* flag: marks transmit buffer full */
31 bit sendactive=0; /* flag: marks transmitter active */
32
33 /******************************************************************************/
34 /* putbuf: write a character to SBUF or transmission buffer */
35 /******************************************************************************/
36 void putbuf (char c) {
37 1 if (!sendfull) { /* transmit only if buffer not full */
38 2 if (!sendactive) { /* if transmitter not active: */
39 3 sendactive = 1; /* transfer the first character direct */
40 3 SBUF = c; /* to SBUF to start transmission */
41 3 }
42 2 else { /* otherwize: */
43 3 outbuf[ostart++ % OLEN] = c;
44 3 ostart=ostart% OLEN;
45 3 if (((ostart+1)%OLEN)==oend) sendfull = 1;
46 3 }
47 2 }
48 1 }
49
50
51 /******************************************************************************/
52 /* putchar: interrupt controlled putchar function */
53 /******************************************************************************/
54 char putchar (char c) {
55 1
C51 COMPILER V7.02b SERIAL 01/18/2005 21:45:42 PAGE 2
56 1 while (sendfull) {
57 2 otask = os_running_task_id ();
58 2 os_wait (K_SIG, 0, 0);
59 2 otask = 0xff;
60 2 }
61 1 putbuf (c); /* send character */
62 1 return (c); /* return character: ANSI requirement */
63 1 }
64
65
66 /******************************************************************************/
67 /* _getkey: interrupt controlled _getkey */
68 /******************************************************************************/
69 char _getkey (void) {
70 1 char tmp;
71 1 while (iend == istart) {
72 2 itask = os_running_task_id (); /* set input task number */
73 2 os_wait (K_SIG, 0, 0); /* RTX-51 call: wait for signal */
74 2 itask = 0xff; /* clear input task number */
75 2 }
76 1 tmp=inbuf[iend++% ILEN];
77 1 iend=iend% ILEN;
78 1 return (tmp);
79 1 }
80
81
82 /******************************************************************************/
83 /* serial: serial receiver / transmitter interrupt */
84 /******************************************************************************/
85 serial () interrupt 4 using 2 { /* use registerbank 2 for interrupt */
86 1 unsigned char c;
87 1 bit start_trans = 0;
88 1
89 1 if (RI) { /* if receiver interrupt */
90 2 c = SBUF; /* read character */
91 2 RI = 0; /* clear interrupt request flag */
92 2 if(((istart+1)%ILEN)!=iend){
93 3 inbuf[istart++ % ILEN] = c;
94 3 istart=istart % ILEN;
95 3 }
96 2 if (itask != 0xFF) isr_send_signal (itask);
97 2 }
98 1
99 1 if (TI || start_trans) {
100 2 TI = 0;
101 2 if(ostart!=oend){
102 3 SBUF = outbuf[oend++ %OLEN];
103 3 oend=oend%OLEN;
104 3 sendfull = 0;
105 3 if (otask != 0xFF) isr_send_signal (otask);
106 3 }
107 2 else sendactive = 0;
108 2 }
109 1
110 1 }
111 /******************************************************************************/
112 /* serial_init: initialize serial interface */
113 /******************************************************************************/
114 void serial_init (void) {
115 1 SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */
116 1 TMOD |= 0x20; /* timer 1 mode 2: 8-Bit reload */
117 1 TH1 = 0xf4; /* reload value 2400 baud */
C51 COMPILER V7.02b SERIAL 01/18/2005 21:45:42 PAGE 3
118 1 TR1 = 1; /* timer 1 run */
119 1 ES = 1; /* enable serial port interrupt */
120 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 236 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 22 1
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -