📄 main.lst
字号:
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 + -