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

📄 main.lst

📁 自定义的USB设备单片机固件程序
💻 LST
字号:
C51 COMPILER V8.05a   MAIN                                                                 04/21/2009 19:44:20 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN Main.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /******************************************************************
   2             本程序只供学习使用,未经作者许可,不得用于其它任何用途
   3                                  
   4                  欢迎访问我的USB专区:http://group.ednchina.com/93/
   5                  欢迎访问我的blog:   http://www.ednchina.com/blog/computer00
   6                                       http://computer00.21ic.org
   7          
   8                  感谢PCB赞助商——电子园: http://bbs.cepark.com/
   9          
  10          main.c file
  11          
  12          作者:电脑圈圈
  13          建立日期: 2008.06.27
  14          修改日期: 2008.08.22
  15          版本:V1.1
  16          版权所有,盗版必究。
  17          Copyright(C) 电脑圈圈 2008-2018
  18          All rights reserved            
  19          *******************************************************************/
  20          
  21          #include <AT89X52.H>  //头文件
  22          #include "Key.h"
  23          #include "Led.h"
  24          #include "UART.h"
  25          #include "pdiusbd12.h"
  26          #include "UsbCore.h"
  27          #include "config.h"
  28          
  29          code uint8 HeadTable[][74]={
  30          "********************************************************************\r\n",
  31          "******         《圈圈教你玩USB》之 用户自定义的USB设备        ******\r\n",
  32          "******                      AT89S52 CPU                       ******\r\n",
  33          "******                  建立日期:",__DATE__,"                 ******\r\n",
  34          "******                   建立时间:",__TIME__,"                   ******\r\n",
  35          "******                    作者:电脑圈圈                      ******\r\n",
  36          "******                    欢迎访问作者的                      ******\r\n",
  37          "******           USB专区:http://group.ednchina.com/93/       ******\r\n",
  38          "******      BLOG1:http://www.ednchina.com/blog/computer00    ******\r\n",
  39          "******                BLOG2:http://computer00.21ic.org       ******\r\n",
  40          "******          打开上位机应用软件,然后按K1-K8分别进行测试   ******\r\n",
  41          "********************************************************************\r\n",
  42          };
  43          
  44          /********************************************************************
  45          函数功能:根据按键情况返回数据的函数。
  46          入口参数:无。
  47          返    回:无。
  48          备    注:无。
  49          ********************************************************************/
  50          void SendKeyData(void)
  51          {
  52   1       //需要返回8字节数据的缓冲区,这里仅使用前5字节
  53   1       uint8 Buf[8]={0,0,0,0,0,0,0,0};
  54   1       
  55   1       //每发送一次数据,则将Count增加一。
C51 COMPILER V8.05a   MAIN                                                                 04/21/2009 19:44:20 PAGE 2   

  56   1       Count++;
  57   1       
  58   1       //根据不同的按键设置输入数据。这里将8个按键情况放在第一字节。
  59   1       Buf[0]=KeyPress;
  60   1       
  61   1       //根据Count的值设置缓冲的第二到第四字节。
  62   1       Buf[1]=(Count&0xFF);       //最低字节
  63   1       Buf[2]=((Count>>8)&0xFF);  //次低字节
  64   1       Buf[3]=((Count>>16)&0xFF); //次高字节
  65   1       Buf[4]=((Count>>24)&0xFF); //最高字节
  66   1       
  67   1       //数据准备好了,通过端点1返回,长度为8字节。
  68   1       D12WriteEndpointBuffer(3,8,Buf);
  69   1       Ep1InIsBusy=1;  //设置端点忙标志。
  70   1       
  71   1       //记得清除KeyUp和KeyDown
  72   1       KeyUp=0;
  73   1       KeyDown=0;
  74   1      }
  75          ////////////////////////End of function//////////////////////////////
  76          
  77          /********************************************************************
  78          函数功能:将串口缓冲区中的数据发送到端点2的函数。
  79          入口参数:无。
  80          返    回:无。
  81          备    注:无。
  82          ********************************************************************/
  83          void SendUartDataToEp2(void)
  84          {
  85   1       uint8 Len;
  86   1       
  87   1       //暂时禁止串行中断,防止UartByteCount在中断中修改而导致不同步
  88   1       ES=0;
  89   1       //将串口缓冲区接收到的字节数复制出来
  90   1       Len=UartByteCount;
  91   1       //检查长度是否为0,如果没有收到,数据,则不需要处理,直接返回
  92   1       if(Len==0)
  93   1       {
  94   2        ES=1; //记得打开串口中断
  95   2        return;
  96   2       }
  97   1       //检查Len字节个数据是否跨越了缓冲区边界,如果跨越了,那么本次只发送
  98   1       //跨越边界之前的数据,剩余的数据留待下次发送。否则,可以一次发送全部。
  99   1       if((Len+UartBufferOutputPoint)>BUF_LEN)
 100   1       {
 101   2        Len=BUF_LEN-UartBufferOutputPoint;
 102   2       }
 103   1       //修改缓冲区数据字节数
 104   1       UartByteCount-=Len;
 105   1       
 106   1       //到这里可以打开串口中断了
 107   1       ES=1;
 108   1       
 109   1       //将数据写入到端点2输入缓冲区
 110   1       D12WriteEndpointBuffer(5,Len,UartBuffer+UartBufferOutputPoint);
 111   1       //修改输出数据的位置
 112   1       UartBufferOutputPoint+=Len;
 113   1       //如果已经到达缓冲区末尾,则设置回开头
 114   1       if(UartBufferOutputPoint>=BUF_LEN)
 115   1       {
 116   2        UartBufferOutputPoint=0;
 117   2       }
C51 COMPILER V8.05a   MAIN                                                                 04/21/2009 19:44:20 PAGE 3   

 118   1       //只有两个缓冲区都满时,才设置端点2输入忙
 119   1       if((D12ReadEndpointStatus(5)&0x60)==0x60)
 120   1       {
 121   2        Ep2InIsBusy=1;
 122   2       }
 123   1      }
 124          ////////////////////////End of function//////////////////////////////
 125          
 126          /********************************************************************
 127          函数功能:主函数。
 128          入口参数:无。
 129          返    回:无。
 130          备    注:无。
 131          ********************************************************************/
 132          void main(void)  //主函数
 133          {
 134   1       uint8 i;
 135   1       uint16 id;
 136   1       uint8 InterruptSource;
 137   1       
 138   1       EA=1; //打开中断
 139   1       InitKeyboard(); //初始化按键
 140   1       InitUART();  //初始化串口
 141   1       
 142   1       for(i=0;i<16;i++)        //显示信息
 143   1       {
 144   2        Prints(HeadTable[i]);
 145   2       }
 146   1       
 147   1       id=D12ReadID();
 148   1      
 149   1       Prints("Your D12 chip\'s ID is: ");
 150   1       PrintShortIntHex(id);
 151   1      
 152   1       if(id==0x1012)
 153   1       {
 154   2        Prints(". ID is correct! Congratulations!\r\n\r\n");
 155   2       }
 156   1       else
 157   1       {
 158   2        Prints(". ID is incorrect! What a pity!\r\n\r\n");
 159   2       }
 160   1       
 161   1       UsbDisconnect();  //先断开USB连接
 162   1       UsbConnect();  //将USB连接上
 163   1       ConfigValue=0; //配置值初始化为0
 164   1       
 165   1       while(1)  //死循环
 166   1       {
 167   2        if(D12GetIntPin()==0) //如果有中断发生
 168   2        {
 169   3         D12WriteCommand(READ_INTERRUPT_REGISTER);  //写读中断寄存器的命令
 170   3         InterruptSource=D12ReadByte(); //读回第一字节的中断寄存器
 171   3         if(InterruptSource&0x80)UsbBusSuspend(); //总线挂起中断处理
 172   3         if(InterruptSource&0x40)UsbBusReset();   //总线复位中断处理
 173   3         if(InterruptSource&0x01)UsbEp0Out();     //端点0输出中断处理
 174   3         if(InterruptSource&0x02)UsbEp0In();      //端点0输入中断处理
 175   3         if(InterruptSource&0x04)UsbEp1Out();     //端点1输出中断处理
 176   3         if(InterruptSource&0x08)UsbEp1In();      //端点1输入中断处理
 177   3         if(InterruptSource&0x10)UsbEp2Out();     //端点2输出中断处理
 178   3         if(InterruptSource&0x20)UsbEp2In();      //端点2输入中断处理
 179   3        }
C51 COMPILER V8.05a   MAIN                                                                 04/21/2009 19:44:20 PAGE 4   

 180   2        if(ConfigValue!=0) //如果已经设置为非0的配置,则可以返回数据
 181   2        {
 182   3         //如果端点1输入没有处于忙状态,则可以发送数据
 183   3         if(Ep1InIsBusy==0)
 184   3         {
 185   4          KeyCanChange=0;  //禁止按键扫描
 186   4          if(KeyUp||KeyDown) //如果有按键事件发生
 187   4          {
 188   5           SendKeyData();  //则返回键盘数据
 189   5          }
 190   4          KeyCanChange=1;  //允许按键扫描
 191   4         }
 192   3         
 193   3         //如果端点2空闲,则发送串口数据到端点2
 194   3         if(Ep2InIsBusy==0)
 195   3         {
 196   4          SendUartDataToEp2(); //调用函数将缓冲区数据发送到端点2
 197   4         }
 198   3         
 199   3         //端点2接收缓冲区中还有数据未发送,则发送到串口
 200   3         if(UsbEp2ByteCount!=0) 
 201   3         {
 202   4          //发送一字节到串口
 203   4          UartPutChar(UsbEp2Buffer[UsbEp2BufferOutputPoint]);
 204   4          UsbEp2BufferOutputPoint++; //发送位置后移1
 205   4          UsbEp2ByteCount--;   //计数值减1
 206   4         }
 207   3        }
 208   2       }
 209   1      }
 210          ////////////////////////End of function//////////////////////////////


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    440    ----
   CONSTANT SIZE    =   1290    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      13
   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 + -