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

📄 f06x_uart1_interrupt.lst

📁 // This program demonstrates how to configure the C8051F060 to write to and read // from the UART i
💻 LST
📖 第 1 页 / 共 2 页
字号:
 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 + -