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

📄 main.lst

📁 硬件平台:C8051F314 包括键盘扫描程序
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  09/17/2008 10:45:02 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe main.c DB OE

line level    source

   1          
   2          //c8051 datasheet推荐的系统时钟选择流程
   3          //Step 1. Force the XTAL1 and XTAL2 pins low by writing 0s to the port latch.
   4          //Step 2. Configure XTAL1 and XTAL2 as analog inputs.
   5          //Step 3. Enable the external oscillator.
   6          //Step 4. Wait at least 1 ms.
   7          //Step 5. Poll for XTLVLD => '1'.
   8          //Step 6. Switch the system clock to the external oscillator.
   9          
  10          
  11          //------------------------------------------------------------------------------------
  12          //
  13          // FILE NAME      : main.c
  14          // TARGET DEVICE  : C8051F314
  15          // CREATED ON     : 07/14/06
  16          // CREATED BY     : Jzp
  17          //
  18          // Revision 1.0  
  19          //
  20          //------------------------------------------------------------------------------------
  21          
  22          #include <C8051F310.H>
  23          #include <stdio.h>
  24          #include "..\\inc\\define.h"
  25          #include "..\\inc\\key_scan.h"
  26          #include "..\\inc\\ow_comm.h"
  27          
  28          //#define  SMB_MASTER     1
  29          //#define  SMB_SLAVE      0
  30          // sfr定义
  31          //sfr16  TMR3RL = 0x92;                  // Timer2 reload registers
  32          //sfr16  TMR3 = 0x94;                    // Timer3 counter registers
  33          //sfr16  TMR0 = 0X8A;                    // Timer0
  34          //sbit KbBlCtl = P3^2;      //键盘有动作,键盘灯点亮,否则经过延时后,熄灭
  35          
  36          UCHAR Tmr0High;
  37          UCHAR Tmr0Low;
  38          
  39          UCHAR *ptr_snd;
  40          UCHAR gSndLen;
  41          UCHAR gSndFlag;
  42          UCHAR xdata gSndBuf[16];
  43          //UCHAR xdata gOwdevNum;
  44          
  45          extern UCHAR KbIsValid;
  46          extern UCHAR ow_reset(void);
  47          extern void delay_us(UINT us);
  48          //extern void ow_test(void);
  49          
  50          
  51          //extern KbBlCtl;
  52          
  53          // Peripheral specific initialization functions,
  54          // Called from the Init_Device() function
  55          void Oscillator_Init()
C51 COMPILER V8.02   MAIN                                                                  09/17/2008 10:45:02 PAGE 2   

  56          {
  57   1        OSCICN = 0x83;         // 复位后,默认为内部振荡器。
  58   1                               // bit7:=1 使能内部振荡器 bit1:0 = 0x11 系统时钟为24.5M
  59   1        CKCON = 0X00;          // 所有的定时器都取(SCACS1:0 = 00)1/12为时钟源
  60   1      }
  61          
  62          void Timer0_Init()
  63          {
  64   1      //  TMR2CN = 0x00;                 // Timer0工作在16位重装模式
  65   1      //  TMR2 = -(SYSCLK/12/100);       // Timer0溢出率为10ms
  66   1      //  TMR2RL = -(SYSCLK/12/100);
  67   1      ////  TL0 = -(SYSCLK/12/100);       
  68   1      //  TR2 = 1;                      // Timer0运行
  69   1          TMOD |= 0X01;
  70   1          TL0 = 0X40;
  71   1          TH0 = 0XB0;
  72   1          Tmr0High = 0xb0;
  73   1          Tmr0Low = 0x40;
  74   1          TR0 = 1;
  75   1      }
  76          
  77          
  78          /************************************************************
  79          -----IIC设备初始化程序-----
  80          入口参数:flag = 1则初始化为从机 flag = 0则初始化为主机,缺省方式为从机
  81          只有当需要回复数据时,才将它设为主机
  82          
  83          //void iic_init(void)
  84          *************************************************************/
  85          void iic_init(void)
  86          {
  87   1        SMB0CF = 0x1C;   //|ENSMB|INH|BUSY|EXTHOLD|SMBTOE|SMBFTE|SMBCS1|SMBCS0
  88   1                            //00011100
  89   1                            // timer 0 溢出作为时钟源 CS = 0:0 
  90   1                            // 因为工作与从方式,总线速度有主机决定,所以该设置对从机无意义
  91   1                            // 允许总线工作于从模式 INH = 0
  92   1                            // 允许建立/保持时间扩展 EXTHOLD = 1
  93   1                            // 禁止总线空闲超时检测 SMBFTE = 0
  94   1                            // 允许总线低电平超时检测 SMBTOE = 1
  95   1        SMB0CF |= 0x80;     // 总线允许;
  96   1      }
  97          
  98          /************************************************************
  99          -----TIMER1初始化程序-----
 100          Timer1 溢出作为UART0波特率发生器
 101          
 102          //void Timer1_Init(void)
 103          *************************************************************/
 104          void UART0_Init (void)
 105          {
 106   1      //  CKCON &= ~0x13;                     // bit1:0 = 00 SYSCLK / 12作为timer 1的时钟源
 107   1        TMOD |= 0x20;                         // Timer 1工作在8位重装模式
 108   1        TH1 = -(SYSCLK/BAUD_RATE/12/2);       // Timer1溢出率为波特率的2倍
 109   1        TL1 = -(SYSCLK/BAUD_RATE/12/2);       
 110   1        TR1 = 1;                              // Timer1 enabled
 111   1        TI0 = 0;
 112   1        RI0 = 0;
 113   1        SCON0 = 0x10;                         // bit7 = 0:8bit 方式,bit4 = 1:允许接收
 114   1      }
 115          
 116          
 117          /************************************************************
C51 COMPILER V8.02   MAIN                                                                  09/17/2008 10:45:02 PAGE 3   

 118          -----TIMER3初始化程序-----
 119          Timer3配置如下:
 120          工作在16bit自动重装模式
 121          sysclk/12作为它的时钟源
 122          溢出率设置为25ms,即检测到SCL为低电平超过25ms则产生中断
 123          //void Timer3_Init(void)
 124          *************************************************************/
 125          void Timer3_Init (void)
 126          {
 127   1        TMR3CN = 0x00;              // 工作在16bit自动重装模式
 128   1        TMR3 = -(SYSCLK/12/40);     // 溢出率设置为25ms,即检测到SCL为低电平超过25ms则产生中断
 129   1        TMR3RL = -(SYSCLK/12/40);   // 
 130   1        CKCON &= ~0x40;             // 复位后缺省为sysclk/12作为它的时钟源
 131   1        TMR3CN |= 0x04;           // Timer3 left disabled. This line should be uncommented if using SCL low time
             -out detection
 132   1      }
 133          
 134          
 135          void Port_IO_Init()
 136          {
 137   1          // P0.0  -  SDA (SMBus), Open-Drain, Digital
 138   1          // P0.1  -  SCL (SMBus), Open-Drain, Digital
 139   1          // P0.4  -  TX0 (UART0), Open-Drain, Digital
 140   1          // P0.5  -  RX0 (UART0), Open-Drain, Digital
 141   1      
 142   1          P0MDOUT = 0xC0;
 143   1          P1MDOUT = 0xF0;
 144   1          P2MDOUT = 0xFF;
 145   1          P3MDOUT = 0x1D;
 146   1          P0SKIP  = 0xC0;
 147   1          XBR0 = 0x05;
 148   1          XBR1 = 0x40;
 149   1      }
 150          
 151          void Interrupts_Init()
 152          {
 153   1        EIE1 = 0x81;     // 使能定时器3中断,使能SMBUS中断
 154   1        IE = 0x12;       // 使能串行中断,注意此时全局中断仍未打开
 155   1        EA = 1;          // 此处使能所有中断
 156   1        EA = 1;
 157   1      }
 158          
 159          // Initialization function for device,
 160          // Call Init_Device() from your main program
 161          void Init_Device(void)
 162          {
 163   1        Oscillator_Init();
 164   1        Port_IO_Init();
 165   1        Timer0_Init();
 166   1        UART0_Init();
 167   1        Timer3_Init();
 168   1        iic_init();
 169   1        Interrupts_Init();
 170   1      }
 171          
 172          
 173          void main(void)
 174          {
 175   1        UCHAR i,j;
 176   1        static UCHAR sndbat_flag = 1;   //debug
 177   1        PCA0MD &= ~0x40;      // WDTE = 0 (Disable watchdog timer)
 178   1      //  debug one-wire protocol
C51 COMPILER V8.02   MAIN                                                                  09/17/2008 10:45:02 PAGE 4   

 179   1      //  gSndFlag = 1;
 180   1      //  Init_Device();
 181   1      //  KbBlCtl = 0;
 182   1      ////  while(1)
 183   1      ////  {
 184   1      //    ow_test();
 185   1      //    delay_us(1000);
 186   1      ////  }
 187   1      //  // 串口发送rom addr
 188   1      //  for(i = 0; i < 8; i++)
 189   1      //  {
 190   1      //    gSndBuf[i] = g_testaddr.romaddr[i];
 191   1      //  }
 192   1      //  gSndLen = 8;
 193   1      //  gSndFlag = 0;
 194   1      //  ptr_snd = &gSndBuf[0];
 195   1      //  TI0 = 1;
 196   1      //  while(gSndFlag == 1);
 197   1      //  while(1);
 198   1      //   end debug one-wire protocol
 199   1        for(j = 0; j <8; j++)
 200   1        {
 201   2          g_romaddr[0].romaddr[j] = 0;   //将所有器件地址清零
 202   2          g_romaddr[1].romaddr[j] = 0;
 203   2        }
 204   1        gOwdevNum = 0;          //初始化无OW器件
 205   1        HasDs2762 = 0;         //
 206   1        HasDs2415 = 0;
 207   1      
 208   1        Init_Device();          //初始化C8051
 209   1        init_keyscan();
 210   1        KbBlCtl = 0;
 211   1        gOwdevNum = find_ow_dev();
 212   1        if(gOwdevNum != 0)
 213   1          KbBlCtl = 0;
 214   1        else
 215   1          KbBlCtl = 1;
 216   1        for(i = 0; i < 8; i++)
 217   1        {
 218   2          gSndBuf[i] = g_romaddr[0].romaddr[i];
 219   2        }
 220   1        for(i = 8; i < 16; i++)
 221   1        {
 222   2          gSndBuf[i] = g_romaddr[1].romaddr[i-8];
 223   2        }
 224   1        gSndLen = 16;
 225   1        gSndFlag = 0;
 226   1        ptr_snd = &gSndBuf[0];
 227   1        TI0 = 1;
 228   1        while(gSndFlag == 1);
 229   1      //  while(1);
 230   1        while(1)
 231   1        {
 232   2          task_owcomm();
 233   2          task_keyscan();
 234   2          if(KbIsValid == 1)
 235   2          {
 236   3            for(i = 0; i < 2; i++)
 237   3            {
 238   4              gSndBuf[i] = KeyBuffer[i];
 239   4            }
 240   3            gSndLen = 2;
C51 COMPILER V8.02   MAIN                                                                  09/17/2008 10:45:02 PAGE 5   

 241   3            gSndFlag = 0;
 242   3            ptr_snd = &gSndBuf[0];
 243   3            TI0 = 1;                       //强制进入发送中断
 244   3            while(gSndFlag == 1);          //等待发送完成
 245   3            KbIsValid = 0;
 246   3          }
 247   2          if(sndbat_flag == 1)
 248   2          {
 249   3            for(i = 0; i < 4; i++)
 250   3            {
 251   4              gSndBuf[i] = RtcClk[i];
 252   4            }
 253   3            for(i = 4; i < 6; i++)
 254   3            {
 255   4              gSndBuf[i] = BatVol[i-4];
 256   4            }
 257   3            for(i = 6; i < 8; i++)
 258   3            {
 259   4              gSndBuf[i] = BatCur[i-6];
 260   4            }
 261   3            gSndLen = 8;
 262   3            gSndFlag = 0;
 263   3            ptr_snd = &gSndBuf[0];
 264   3            TI0 = 1;                       //强制进入发送中断
 265   3            while(gSndFlag == 1);          //等待发送完成
 266   3            sndbat_flag = 0;
 267   3          }
 268   2          
 269   2        }
 270   1      }
 271           
 272          
 273          void UART0_ISR (void) interrupt 4
 274          {
 275   1        ES0 = 0;
 276   1      //  EA = 0;
 277   1        
 278   1      //  ptr_snd = &gSndBuf[0];
 279   1        if(TI0)
 280   1        {
 281   2              TI0 = 0;
 282   2              if(gSndLen > 0)
 283   2              {
 284   3                SBUF0 = *ptr_snd++;
 285   3                gSndLen--;
 286   3              }
 287   2              else
 288   2                gSndFlag = 1;
 289   2        }
 290   1        else if(RI0)
 291   1        {
 292   2          RI0 = 0;
 293   2        }
 294   1        else
 295   1        {
 296   2          TI0 = 0;
 297   2          RI0 = 0;
 298   2        }
 299   1        ES0 = 1;
 300   1      //  EA = 1;
 301   1      }

C51 COMPILER V8.02   MAIN                                                                  09/17/2008 10:45:02 PAGE 6   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    588    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =     16    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      8       1
   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 + -