⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sio.lst

📁 F020单片机各模块代码实例
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.22f  SIO                                                                   02/14/2002 12:21:24 PAGE 1   


C51 COMPILER V6.22f, COMPILATION OF MODULE SIO
OBJECT MODULE PLACED IN SIO.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SIO.C OPTIMIZE(6,SPEED) BROWSE DEFINE(XTAL=12000000) DEBUG OBJECTEXTEND COD
                    -E SYMBOLS

stmt level    source

   1          /*------------------------------------------------------------------------------
   2          SIO.C:  Serial Communication Routines.
   3          
   4          Copyright 1995-2002 KEIL Software, Inc.
   5          ------------------------------------------------------------------------------*/
   6          
   7          #include <reg51.h>
   8          #include <string.h>
   9          #include "sio.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   1      /*------------------------------------------------
  31   1      Received data interrupt.
  32   1      ------------------------------------------------*/
  33   1      if (RI != 0)
  34   1        {
  35   2        RI = 0;
  36   2      
  37   2        if ((r_in + 1) != r_out)
  38   2          rbuf [r_in++] = SBUF;
  39   2        }
  40   1      
  41   1      /*------------------------------------------------
  42   1      Transmitted data interrupt.
  43   1      ------------------------------------------------*/
  44   1      if (TI != 0)
  45   1        {
  46   2        TI = 0;
  47   2      
  48   2        if (t_in != t_out)
  49   2          SBUF = tbuf [t_out++];
  50   2        else
  51   2          t_disabled = 1;
  52   2        }
  53   1      
  54   1      }
C51 COMPILER V6.22f  SIO                                                                   02/14/2002 12:21:24 PAGE 2   

  55          
  56          /*------------------------------------------------------------------------------
  57          ------------------------------------------------------------------------------*/
  58          void com_initialize (void)
  59          {
  60   1      /*------------------------------------------------
  61   1      Setup TIMER1 to generate the proper baud rate.
  62   1      ------------------------------------------------*/
  63   1      com_baudrate (1200);
  64   1      
  65   1      /*------------------------------------------------
  66   1      Clear com buffer indexes.
  67   1      ------------------------------------------------*/
  68   1      EA = 0;                         /* Disable Interrupts */
  69   1      
  70   1      t_in = 0;
  71   1      t_out = 0;
  72   1      t_disabled = 1;
  73   1      
  74   1      r_in = 0;
  75   1      r_out = 0;
  76   1      
  77   1      /*------------------------------------------------
  78   1      Setup serial port registers.
  79   1      ------------------------------------------------*/
  80   1      SM0 = 0; SM1 = 1;               /* serial port MODE 1 */
  81   1      SM2 = 0;
  82   1      REN = 1;                        /* enable serial receiver */
  83   1      
  84   1      TI = 0;                         /* clear transmit interrupt */
  85   1      RI = 0;                         /* clear receiver interrupt */
  86   1      
  87   1      ES = 1;                         /* enable serial interrupts */
  88   1      PS = 0;                         /* set serial interrupts to low priority */
  89   1      
  90   1      EA = 1;                         /* Enable Interrupts */
  91   1      }
  92          
  93          /*------------------------------------------------------------------------------
  94          ------------------------------------------------------------------------------*/
  95          void com_baudrate (
  96            unsigned baudrate)
  97          {
  98   1      EA = 0;                             /* Disable Interrupts */
  99   1      
 100   1      /*------------------------------------------------
 101   1      Clear transmit interrupt and buffer.
 102   1      ------------------------------------------------*/
 103   1      TI = 0;                             /* clear transmit interrupt */
 104   1      t_in = 0;                           /* empty transmit buffer */
 105   1      t_out = 0;
 106   1      t_disabled = 1;                     /* disable transmitter */
 107   1      
 108   1      /*------------------------------------------------
 109   1      Set timer 1 up as a baud rate generator.
 110   1      ------------------------------------------------*/
 111   1      TR1 = 0;                            /* stop timer 1 */
 112   1      ET1 = 0;                            /* disable timer 1 interrupt */
 113   1      
 114   1      PCON |= 0x80;                       /* 0x80=SMOD: set serial baudrate doubler */
 115   1      
 116   1      TMOD &= ~0xF0;                      /* clear timer 1 mode bits */
C51 COMPILER V6.22f  SIO                                                                   02/14/2002 12:21:24 PAGE 3   

 117   1      TMOD |= 0x20;                       /* put timer 1 into MODE 2 */
 118   1      
 119   1      TH1 = (unsigned char) (256 - (XTAL / (16L * 12L * baudrate)));
 120   1      
 121   1      TR1 = 1;                            /* start timer 1 */
 122   1      
 123   1      EA = 1;                             /* Enable Interrupts */
 124   1      }
 125          
 126          /*------------------------------------------------------------------------------
 127          ------------------------------------------------------------------------------*/
 128          char com_putchar (
 129            unsigned char c)
 130          {
 131   1      /*------------------------------------------------
 132   1      If the buffer is full, return an error value.
 133   1      ------------------------------------------------*/
 134   1      if ((TBUF_SIZE - com_tbuflen ()) <= 2)
 135   1        return (-1);
 136   1      
 137   1      /*------------------------------------------------
 138   1      Add the data to the transmit buffer.  If the
 139   1      transmit interrupt is disabled, then enable it.
 140   1      ------------------------------------------------*/
 141   1      EA = 0;                         /* Disable Interrupts */
 142   1      
 143   1      tbuf [t_in++] = c;
 144   1      
 145   1      if (t_disabled)                 /* if transmitter is disabled */
 146   1        {
 147   2        t_disabled = 0;
 148   2        TI = 1;                       /* enable it */
 149   2        }
 150   1      
 151   1      EA = 1;                         /* Enable Interrupts */
 152   1      
 153   1      return (0);
 154   1      }
 155          
 156          /*------------------------------------------------------------------------------
 157          ------------------------------------------------------------------------------*/
 158          int com_getchar (void)
 159          {
 160   1      int c;
 161   1      
 162   1      if (com_rbuflen () == 0)
 163   1        return (-1);
 164   1      
 165   1      EA = 0;                         /* Disable Interrupts */
 166   1      c = rbuf [r_out++];
 167   1      EA = 1;                         /* Enable Interrupts */
 168   1      
 169   1      return (c);
 170   1      }
 171          
 172          /*------------------------------------------------------------------------------
 173          ------------------------------------------------------------------------------*/
 174          unsigned char com_rbuflen (void)
 175          {
 176   1      return (r_in - r_out);
 177   1      }
 178          
C51 COMPILER V6.22f  SIO                                                                   02/14/2002 12:21:24 PAGE 4   

 179          /*------------------------------------------------------------------------------
 180          ------------------------------------------------------------------------------*/
 181          unsigned char com_tbuflen (void)
 182          {
 183   1      return (t_in - t_out);
 184   1      }
 185          
 186          /*------------------------------------------------------------------------------
 187          ------------------------------------------------------------------------------*/
 188          
C51 COMPILER V6.22f  SIO                                                                   02/14/2002 12:21:24 PAGE 5   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION com_isr (BEGIN)
0000 C0E0              PUSH    ACC
0002 C083              PUSH    DPH
0004 C082              PUSH    DPL
0006 C0D0              PUSH    PSW
0008 75D010            MOV     PSW,#010H
                                           ; SOURCE LINE # 28
                                           ; SOURCE LINE # 33
000B 309828            JNB     RI,?C0001
                                           ; SOURCE LINE # 34
                                           ; SOURCE LINE # 35
000E C298              CLR     RI
                                           ; SOURCE LINE # 37
0010 900000      R     MOV     DPTR,#r_in
0013 E0                MOVX    A,@DPTR
0014 2401              ADD     A,#01H
0016 FF                MOV     R7,A
0017 E4                CLR     A
0018 33                RLC     A
0019 FE                MOV     R6,A
001A A3                INC     DPTR
001B E0                MOVX    A,@DPTR
001C 6F                XRL     A,R7
001D 7001              JNZ     ?C0016
001F EE                MOV     A,R6
0020         ?C0016:
0020 6014              JZ      ?C0001
                                           ; SOURCE LINE # 38
0022 900000      R     MOV     DPTR,#r_in
0025 E0                MOVX    A,@DPTR
0026 FF                MOV     R7,A
0027 04                INC     A
0028 F0                MOVX    @DPTR,A
0029 7400        R     MOV     A,#LOW rbuf
002B 2F                ADD     A,R7
002C F582              MOV     DPL,A
002E E4                CLR     A
002F 3400        R     ADDC    A,#HIGH rbuf
0031 F583              MOV     DPH,A
0033 E599              MOV     A,SBUF
0035 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 39
0036         ?C0001:
                                           ; SOURCE LINE # 44
0036 309927            JNB     TI,?C0006
                                           ; SOURCE LINE # 45
                                           ; SOURCE LINE # 46
0039 C299              CLR     TI
                                           ; SOURCE LINE # 48
003B 900000      R     MOV     DPTR,#t_out
003E E0                MOVX    A,@DPTR
003F FF                MOV     R7,A
0040 900000      R     MOV     DPTR,#t_in
0043 E0                MOVX    A,@DPTR
0044 6F                XRL     A,R7
0045 6013              JZ      ?C0004
                                           ; SOURCE LINE # 49
0047 A3                INC     DPTR
0048 E0                MOVX    A,@DPTR
C51 COMPILER V6.22f  SIO                                                                   02/14/2002 12:21:24 PAGE 6   

0049 04                INC     A
004A F0                MOVX    @DPTR,A
004B 7400        R     MOV     A,#LOW tbuf
004D 2F                ADD     A,R7
004E F582              MOV     DPL,A
0050 E4                CLR     A
0051 3400        R     ADDC    A,#HIGH tbuf
0053 F583              MOV     DPH,A
0055 E0                MOVX    A,@DPTR
0056 F599              MOV     SBUF,A
0058 8006              SJMP    ?C0006
005A         ?C0004:
                                           ; SOURCE LINE # 51
005A 900000      R     MOV     DPTR,#t_disabled
005D 7401              MOV     A,#01H
005F F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 52
                                           ; SOURCE LINE # 54
0060         ?C0006:
0060 D0D0              POP     PSW
0062 D082              POP     DPL
0064 D083              POP     DPH
0066 D0E0              POP     ACC
0068 32                RETI    
             ; FUNCTION com_isr (END)

             ; FUNCTION com_initialize (BEGIN)
                                           ; SOURCE LINE # 58
                                           ; SOURCE LINE # 59
                                           ; SOURCE LINE # 63
0000 7FB0              MOV     R7,#0B0H
0002 7E04              MOV     R6,#04H
0004 120000      R     LCALL   _com_baudrate
                                           ; SOURCE LINE # 68
0007 C2AF              CLR     EA
                                           ; SOURCE LINE # 70
0009 E4                CLR     A
000A 900000      R     MOV     DPTR,#t_in
000D F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 71
000E A3                INC     DPTR
000F F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 72
0010 900000      R     MOV     DPTR,#t_disabled
0013 04                INC     A
0014 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 74

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -