home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1996 September / pcwk_09_96.iso / demo / wgelectr / pk51demo / files.2 / EXAMPLES / TDP / SERIAL.C < prev    next >
C/C++ Source or Header  |  1995-06-08  |  6KB  |  221 lines

  1. /*------------------------------------------------------------------------------
  2. SERIAL.C:  Serial Communication Routines.
  3.  
  4. Copyright 1995 KEIL Software, Inc.
  5. ------------------------------------------------------------------------------*/
  6.  
  7. #include "tdp.h"
  8. #include <reg51.h>
  9. #include <string.h>
  10.  
  11. /*------------------------------------------------------------------------------
  12. ------------------------------------------------------------------------------*/
  13. #define TBUF_SIZE    256        /* DO NOT CHANGE */
  14. #define RBUF_SIZE    256        /* DO NOT CHANGE */
  15.  
  16. static xdata unsigned char tbuf [TBUF_SIZE];
  17. static xdata unsigned char rbuf [RBUF_SIZE];
  18.  
  19. static xdata unsigned char t_in = 0;
  20. static xdata unsigned char t_out = 0;
  21. static xdata unsigned char t_disabled = 0;
  22.  
  23. static xdata unsigned char r_in = 0;
  24. static xdata unsigned char r_out = 0;
  25.  
  26. /*------------------------------------------------------------------------------
  27. ------------------------------------------------------------------------------*/
  28. static void com_isr (void) interrupt 4 using 2
  29. {
  30. /*------------------------------------------------
  31. Received data interrupt.
  32. ------------------------------------------------*/
  33. if (RI != 0)
  34.   {
  35.   RI = 0;
  36.  
  37.   if ((r_in + 1) != r_out)
  38.     rbuf [r_in++] = SBUF;
  39.   }
  40.  
  41. /*------------------------------------------------
  42. Transmitted data interrupt.
  43. ------------------------------------------------*/
  44. if (TI != 0)
  45.   {
  46.   TI = 0;
  47.  
  48.   if (t_in != t_out)
  49.     SBUF = tbuf [t_out++];
  50.   else
  51.     t_disabled = 1;
  52.   }
  53.  
  54. }
  55.  
  56. /*------------------------------------------------------------------------------
  57. ------------------------------------------------------------------------------*/
  58. void com_initialize (void)
  59. {
  60. /*------------------------------------------------
  61. Setup TIMER1 to generate the proper baud rate.
  62. ------------------------------------------------*/
  63. com_baudrate (1200);
  64.  
  65. /*------------------------------------------------
  66. Clear com buffer indexes.
  67. ------------------------------------------------*/
  68. INT_DISABLE;
  69.  
  70. t_in = 0;
  71. t_out = 0;
  72. t_disabled = 1;
  73.  
  74. r_in = 0;
  75. r_out = 0;
  76.  
  77. /*------------------------------------------------
  78. Setup serial port registers.
  79. ------------------------------------------------*/
  80. SM0 = 0; SM1 = 1;        /* serial port MODE 1 */
  81. SM2 = 0;
  82. REN = 1;            /* enable serial receiver */
  83.  
  84. TI = 0;                /* clear transmit interrupt */
  85. RI = 0;                /* clear receiver interrupt */
  86.  
  87. ES = 1;                /* enable serial interrupts */
  88. PS = 0;                /* set serial interrupts to low priority */
  89.  
  90. INT_ENABLE;
  91. }
  92.  
  93. /*------------------------------------------------------------------------------
  94. ------------------------------------------------------------------------------*/
  95. void com_baudrate (
  96.   unsigned baudrate)
  97. {
  98. INT_DISABLE;
  99.  
  100. /*------------------------------------------------
  101. Clear transmit interrupt and buffer.
  102. ------------------------------------------------*/
  103. TI = 0;                    /* clear transmit interrupt */
  104. t_in = 0;                /* empty transmit buffer */
  105. t_out = 0;
  106. t_disabled = 1;                /* disable transmitter */
  107.  
  108. /*------------------------------------------------
  109. Set timer 1 up as a baud rate generator.
  110. ------------------------------------------------*/
  111. TR1 = 0;                /* stop timer 1 */
  112. ET1 = 0;                /* disable timer 1 interrupt */
  113.  
  114. PCON |= 0x80;                /* 0x80=SMOD: set serial baudrate doubler */
  115.  
  116. TMOD &= ~0xF0;                /* clear timer 1 mode bits */
  117. TMOD |= 0x20;                /* put timer 1 into MODE 2 */
  118.  
  119. TH1 = (unsigned char) (256 - (TCLK / (16L * 12L * baudrate)));
  120.  
  121. TR1 = 1;                /* start timer 1 */
  122.  
  123. INT_ENABLE;
  124. }
  125.  
  126. /*------------------------------------------------------------------------------
  127. ------------------------------------------------------------------------------*/
  128. char com_putchar (
  129.   unsigned char c)
  130. {
  131. /*------------------------------------------------
  132. If the buffer is full, return an error value.
  133. ------------------------------------------------*/
  134. if ((TBUF_SIZE - com_tbuflen ()) <= 2)
  135.   return (-1);
  136.  
  137. /*------------------------------------------------
  138. Add the data to the transmit buffer.  If the
  139. transmit interrupt is disabled, then enable it.
  140. ------------------------------------------------*/
  141. INT_DISABLE;
  142.  
  143. tbuf [t_in++] = c;
  144.  
  145. if (t_disabled)            /* if transmitter is disabled */
  146.   {
  147.   t_disabled = 0;
  148.   TI = 1;            /* enable it */
  149.   }
  150.  
  151. INT_ENABLE;
  152.  
  153. return (0);
  154. }
  155.  
  156. /*------------------------------------------------------------------------------
  157. ------------------------------------------------------------------------------*/
  158. char com_puts (
  159.   char *s)
  160. {
  161. /*------------------------------------------------
  162. Calculate the string length.
  163. ------------------------------------------------*/
  164. if ((TBUF_SIZE - com_tbuflen ()) <= strlen (s))
  165.   return (-1);
  166.  
  167. /*------------------------------------------------
  168. Add the data to the transmit buffer.  If the
  169. transmit interrupt is disabled, then enable it.
  170. ------------------------------------------------*/
  171. INT_DISABLE;
  172.  
  173. for (; *s != '\0'; s++)
  174.   tbuf [t_in++] = *s;
  175.  
  176. if (t_disabled)            /* if transmitter is disabled */
  177.   {
  178.   t_disabled = 0;
  179.   TI = 1;            /* enable it */
  180.   }
  181.  
  182. INT_ENABLE;
  183.  
  184. return (0);
  185. }
  186.  
  187. /*------------------------------------------------------------------------------
  188. ------------------------------------------------------------------------------*/
  189. int com_getchar (void)
  190. {
  191. xdata int c;
  192.  
  193. if (com_rbuflen () == 0)
  194.   return (-1);
  195.  
  196. INT_DISABLE;
  197. c = rbuf [r_out++];
  198. INT_ENABLE;
  199.  
  200. return (c);
  201. }
  202.  
  203. /*------------------------------------------------------------------------------
  204. ------------------------------------------------------------------------------*/
  205. unsigned char com_rbuflen (void)
  206. {
  207. return (r_in - r_out);
  208. }
  209.  
  210. /*------------------------------------------------------------------------------
  211. ------------------------------------------------------------------------------*/
  212. unsigned char com_tbuflen (void)
  213. {
  214. return (t_in - t_out);
  215. }
  216.  
  217. /*------------------------------------------------------------------------------
  218. ------------------------------------------------------------------------------*/
  219.  
  220.  
  221.