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

📄 main.lst

📁 我自己写的一个C51双机通信的程序,是一个双人猜数字的小游戏,使用方法见压缩包里的键盘手册
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.50   MAIN                                                                  04/07/2006 23:02:33 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include "reg51.h"
   2          #include "define.h"
   3          #include "function.h"
   4          #include "stdio.h"
   5          unsigned int tmr;
   6          unsigned char start,nbit,agree,request,nok,sok,guess=0,nbset,mnset,ynset,repeat;
   7          signed char nn,y[5],m[5],r1[1],r2[1],n[5],r=2,c,a;
   8          //request标志位,请求游戏
   9          //agree 标志位,同意游戏 
  10          //nok   标志位,是否输入了nbit
  11          //sok   标志位,双方都已全部设置,开始互相验证
  12          //start 开始标志位,当双方同意游戏start=1
  13          //nbit  猜的位数,最大为5,最小为1
  14          //nn    中间变量,用来控制数组y[n]
  15          //y[5]  数组,用来存放对主发过来的数
  16          //m[5]  数组,用来存放已方设置的数
  17          //guess 标志位,判断对方猜了没有,因为这个游戏是回合制的
  18          //r1[1] 数组,用来存放结果,即已方猜对多少个
  19          //r2[1] 数组,用来存放结果,即对方猜对多少个
  20          //r=2   中间变量,用来控制数组r1[1],r2[2]
  21          //c             中间变量,用来控制数字的发送
  22          //nbset 标志位,是否已设置了要猜的位数,只能由提出游戏的人设定
  23          //mnset 标志位,判断已方设置了要给对方猜的数没有
  24          //ynset 标志位,判断对方设置了要给已方猜的数没有
  25          //repeat标志位,判断输入的数字是否有重复,因为这个游戏是由不重复的数字组成的
  26          //n[5]  数组,记录输入的一串数字,然后将值传给y[5]或m[
  27          
  28          
  29          //************************外部中断2函数*********************************
  30          //***                 进行时钟数值的设置                             ***
  31          //**********************************************************************
  32          void keyboard (void) interrupt 2 
  33          {
  34   1              signed char key_number,b,num,i,p;
  35   1              //key_number键值
  36   1              //b                     标志,判断是否输入有效的数字
  37   1              //num           中间变量,用来记录输入的值
  38   1              //a                     中间变量,控制数组n[5]
  39   1              //i                     中间变量,控制循环,判断输入的数是否和前面输入的数重复
  40   1              //p                     中间变量,和i配合使用
  41   1      
  42   1      
  43   1              key_number=read7279(CMD_READ);
  44   1              a=0;
  45   1              n[0]=0;
  46   1              n[1]=0;
  47   1              n[2]=0;
  48   1              n[3]=0;
  49   1              n[4]=0;
  50   1              if (key_number==0x04) //是否邀请或同意游戏***********************************
  51   1              {       
  52   2                      if (request==0) 
  53   2                      {
  54   3                              request=1;
  55   3                              SBUF=0x11;
C51 COMPILER V7.50   MAIN                                                                  04/07/2006 23:02:33 PAGE 2   

  56   3                              delay10ms(10);
  57   3                              send_byte(CMD_RESET)
  58   3                              ;write7279(DECODE0+6, 1);
  59   3                              nbset=1;
  60   3                      }                               
  61   2                      else
  62   2                      {
  63   3                              agree=1;
  64   3                              SBUF=0x11;
  65   3                              delay10ms(10);
  66   3                              send_byte(CMD_RESET);
  67   3                              write7279(DECODE0+6, 1);
  68   3                      }
  69   2                      if (request==1 && agree==1)
  70   2                      {
  71   3                              write7279(UNDECODE+6, 0x01);
  72   3                              start=1;
  73   3                      }
  74   2              }
  75   1      
  76   1              if (start==1 && nbset==1)//输入数值
  77   1              {                       
  78   2                      if (guess!=1) guess=0;
  79   2                      if (start!=0) start=1;
  80   2                      key_number=0xff;                        
  81   2                      b=0;
  82   2                      if (nbit==0) {a=1;write7279(UNDECODE+6, 0x01);}
  83   2                      else {a=nbit+1;write7279(DECODE0+6, nbit+ynset);}
  84   2              do//开始输入数值
  85   2              {
  86   3                      if (!key) 
  87   3                      {                                               
  88   4                                      key_number=read7279(CMD_READ);
  89   4                                      if (guess!=1) guess=0;//有点诡异,guesst和start的值会乱飞,用这两句来控制
  90   4                                      if (start!=0) start=1;
  91   4                                      if (a==nbit+1 && nbit!=0) 
  92   4                                      {
  93   5                                              write7279(UNDECODE+4, 0x00);
  94   5                                              write7279(UNDECODE+3, 0x00);
  95   5                                              write7279(UNDECODE+2, 0x00);
  96   5                                              write7279(UNDECODE+1, 0x00);
  97   5                                              write7279(UNDECODE, 0x00);
  98   5                                              write7279(DECODE0+6, nbit+ynset);
  99   5                                      }
 100   4                                      
 101   4                                      if (key_number==0x07) {num=7;a--;b=1;};//是否有效输入及判断数值
 102   4                                      if (key_number==0x06) {num=8;a--;b=1;};
 103   4                                      if (key_number==0x05) {num=9;a--;b=1;};
 104   4                                      if (key_number==0x0F) {num=4;a--;b=1;};
 105   4                                      if (key_number==0x0E) {num=5;a--;b=1;};
 106   4                                      if (key_number==0x0D) {num=6;a--;b=1;};
 107   4                                      if (key_number==0x17) {num=1;a--;b=1;};
 108   4                                      if (key_number==0x16) {num=2;a--;b=1;};
 109   4                                      if (key_number==0x15) {num=3;a--;b=1;};
 110   4                                      if (key_number==0x1f) {num=0;a--;b=1;};
 111   4                                      if (b==1) 
 112   4                                      {
 113   5                                              p = a;
 114   5                                              for (i=nbit-1;i>p-1;i--)//循环,判断输入的数是否重复
 115   5                                              {
 116   6                                                      if (num==n[i]) 
 117   6                                                      {
C51 COMPILER V7.50   MAIN                                                                  04/07/2006 23:02:33 PAGE 3   

 118   7                                                              a++;
 119   7                                                              repeat=1;       
 120   7                                                              write7279(BLINKCTL,0xe0);
 121   7                                                              delay10ms(50);
 122   7                                                              write7279(BLINKCTL,0xff);
 123   7                                                              break;
 124   7                                                      }       
 125   6                                              }
 126   5                                      }
 127   4      
 128   4                                      if (a!=0 && a!=nbit)    
 129   4                                      {
 130   5                                              if (b==1 && repeat==0)
 131   5                                              {
 132   6                                                      send_byte(RTL_UNCYL);//输入有效数字时左移一位                           
 133   6                                                      if (nbit==0) 
 134   6                                                      write7279(UNDECODE+6, 0x01);
 135   6                                                      else 
 136   6                                                      write7279(DECODE0+6, nbit+ynset);
 137   6                                                      if (nok==1 && mnset==0) write7279(UNDECODE+5, 0x01);
 138   6                                                      if (mnset==1 && guess==0) write7279(UNDECODE+5, 0x48);
 139   6                                                      if (mnset==1 && guess==1) write7279(UNDECODE+5, 0x49);
 140   6                                              }
 141   5                                      }
 142   4                                      if (b==1 && repeat==0) write7279(0x80, num);//显示输入的数值
 143   4                                      b=0;
 144   4                                      if (nbit!=0 && repeat==0)
 145   4                                      {
 146   5                                      if (a==nbit && a>=0) 
 147   5                                      n[a-1]=num;
 148   5                                      if (a==(nbit-1) && a>=0) 
 149   5                                      n[a-1]=num;
 150   5                                      if (a==(nbit-2) && a>=0)
 151   5                                      n[a-1]=num;
 152   5                                      if (a==(nbit-3) && a>=0) 
 153   5                                      n[a-1]=num;
 154   5                                      if (a==(nbit-4) && a>=0) 
 155   5                                      n[a-1]=num;
 156   5                                      }
 157   4                                                              
 158   4                                      if (key_number==0x14) //如果设置不好,可以退回重新设置上一个
 159   4                                      {
 160   5                                              write7279(UNDECODE+6, 0x00);
 161   5                                              write7279(UNDECODE+5, 0x00);
 162   5                                              send_byte(RTR_UNCYL);
 163   5                                              a++;
 164   5                                              if (nbit==0) 
 165   5                                              write7279(UNDECODE+6, 0x01);
 166   5                                              else 
 167   5                                              write7279(DECODE0+6, nbit+ynset);
 168   5                                              
 169   5                                              if (nok==1 && mnset==0) write7279(UNDECODE+5, 0x01);
 170   5                                              if (mnset==1 && guess==0) write7279(UNDECODE+5, 0x48);
 171   5                                              if (mnset==1 && guess==1) write7279(UNDECODE+5, 0x49);
 172   5                                              
 173   5                                      }                               
 174   4                                      while (!key);//等待键盘扫描结束以便输入下个数值
 175   4                                      
 176   4                                      if (a<1) 
 177   4                                      a=1;//控制a的范围
 178   4                                      if (nbit!=0 && a>nbit+1) 
 179   4                                      a=nbit+1;
C51 COMPILER V7.50   MAIN                                                                  04/07/2006 23:02:33 PAGE 4   

 180   4                                      repeat=0;                               
 181   4                      }
 182   3              }
 183   2              while (key_number!=0x0c && key_number!=0x1c);//确认发送或投降认输
 184   2      
 185   2              if (key_number==0x0c)//确定或发送
 186   2              {               
 187   3                      if (nbit!=0 && a==1)//输入了完整的数组
 188   3                      {
 189   4                              if (mnset!=0 && ynset==0)           
 190   4                              {
 191   5                                      write7279(BLINKCTL,0xe0);
 192   5                                      delay10ms(50);
 193   5                                      write7279(BLINKCTL,0xff);
 194   5                              };
 195   4      
 196   4                                      if (sok==1 && guess==0 && ynset!=0)//如果全部就绪,就将数组发给对方去验证
 197   4                                      {
 198   5                                              c=nbit;
 199   5                                              do
 200   5                                              {
 201   6                                                      SBUF=0x50+n[c-1];
 202   6                                                      delay10ms(10);
 203   6                                                      c--;                    
 204   6                                              }
 205   5                                              while (c>0);
 206   5                                              guess=1;
 207   5                                              write7279(UNDECODE+5, 0x49);
 208   5                                      }
 209   4              
 210   4                              if (nok==1 && mnset==0)//如果自己的数组还没设,就将输入的数组赋给它

⌨️ 快捷键说明

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