📄 snake.lst
字号:
173 ---------------------------------------------------------*/
174 void PlacedFood()
175 {
176 1 uchar i=0;
177 1 srand(16); //随机数发生器初始值
178 1 if (FoodFlag==0)
179 1 {
C51 COMPILER V8.08 SNAKE 06/20/2007 12:20:21 PAGE 4
180 2 RandCounter++;
181 2 if (RandCounter==28) RandCounter=0;
182 2 do
183 2 { //rand ()产生一个0-32767之间的虚拟随机数
184 3 i = rand (); //赋给一个字符型,取低8位
185 3 i+=RandCounter;//由于产生的随机数非常的有规律所以加一个
186 3 if (i<111&&Map[i]==0)
187 3 {//产生的随机数在坐标范围以内且没刷到墙和蛇上就刷出.
188 4 Map[i] = 2; //放食物
189 4 break;//跳出循环
190 4 }
191 3 }
192 2 while(1);
193 2 FoodFlag = 1;//食物标志位置1,表明放了食物
194 2 }
195 1 }
196 /*---------------------------------------------------------
197 函数:Init()
198 说明:初始化
199 ---------------------------------------------------------*/
200 void Init()
201 {
202 1 IE = 0x83; //开外中断0,定时器0,总中断允许
203 1 IP = 0x01; //外中断INT0中断优先
204 1 TMOD = 0x01;//定时器0模式1
205 1 TH0 = 0xB1; //定时10mS
206 1 TL0 = 0xE0;
207 1 TCON = 0x11;//启动定时器0,外中断INT0边沿触发
208 1 }
209 /**********************************************************
210 *延时400us
211 **********************************************************/
212 void Delay400us() //晶振=12MHz 延时时间=404us
213 { //晶振=11.0592MHz 延时时间≈438us
214 1 uchar i,j; //总的延时时间=[(2*i)+1]*j+1+1
215 1 for (j=4;j>0;j--) //j=2用12MHz,j=4 是24MHz晶振
216 1 for (i=100;i>0;i--);
217 1 }
218 /**********************************************************
219 *函数名:Sound()
220 *功 能:音效子程序
221 **********************************************************/
222 void Sound()
223 {
224 1 uchar i;
225 1 for (i=40;i>0;i--)
226 1 {
227 2 Beep=~Beep;
228 2 Delay400us();
229 2 }
230 1 }
231 /*---------------------------------------------------------
232 函数:main()
233 说明:主函数
234 ---------------------------------------------------------*/
235 main ()
236 {
237 1 LCDInit();//液晶初始化
238 1 Init(); //初始化
239 1 CopyMap();//复制地图
240 1 MapCreate(); //生成地图
241 1 GameDisplay(GDRAM);//地图刷新显示
C51 COMPILER V8.08 SNAKE 06/20/2007 12:20:21 PAGE 5
242 1 while(1)
243 1 {
244 2 switch (KeyCoding[2]) //可以放到主程序的while(1)循环中.
245 2 {//按键判断
246 3 case 0x51: //确定键
247 3 if (Pause==0)
248 3 {
249 4 Pause = 1;
250 4 TR0 = 0; //暂停
251 4 }
252 3 else
253 3 {
254 4 Pause = 0;
255 4 TR0 = 1; //继续
256 4 }
257 3 KeyCoding[2] = 0;
258 3 break;
259 3 case 0x06: //向上键
260 3 if (DownMove ==0)//防止向相反的方向运动
261 3 {
262 4 UpMove = 1;//向上移动标志位
263 4 DownMove = 0;//向下移动标志位
264 4 LeftMove = 0;//向左移动标志位
265 4 RightMove = 0;//向右移动标志位
266 4 MoveDirection=1;
267 4 }
268 3 KeyCoding[2] = 0;
269 3 break;
270 3 case 0x44: //向下键
271 3 if (UpMove ==0)
272 3 {
273 4 UpMove = 0;//向上移动标志位
274 4 DownMove = 1;//向下移动标志位
275 4 LeftMove = 0;//向左移动标志位
276 4 RightMove = 0;//向右移动标志位
277 4 MoveDirection=2;
278 4 }
279 3 KeyCoding[2] = 0;
280 3 break;
281 3 case 0x47: //向左键
282 3 if (RightMove==0)
283 3 {
284 4 UpMove = 0;//向上移动标志位
285 4 DownMove = 0;//向下移动标志位
286 4 LeftMove = 1;//向左移动标志位
287 4 RightMove = 0;//向右移动标志位
288 4 MoveDirection=3;
289 4 }
290 3 KeyCoding[2] = 0;
291 3 break;
292 3 case 0x40: //向右键
293 3 if (LeftMove==0)
294 3 {
295 4 UpMove = 0;//向上移动标志位
296 4 DownMove = 0;//向下移动标志位
297 4 LeftMove = 0;//向左移动标志位
298 4 RightMove = 1;//向右移动标志位
299 4 MoveDirection=4;
300 4 }
301 3 KeyCoding[2] = 0;
302 3 break;
303 3 case 0x02: //第一次按进入设置,第二次退出设置状态
C51 COMPILER V8.08 SNAKE 06/20/2007 12:20:21 PAGE 6
304 3 KeyCoding[2] = 0;
305 3 break;
306 3 case 0x07: //系统设定键
307 3 KeyCoding[2] = 0;
308 3 break;
309 3 }
310 2 }
311 1 }
312 /*---------------------------------------------------------
313 函数:Int0()
314 说明:定时器0溢出中断
315 ---------------------------------------------------------*/
316 Int0() interrupt 0
317 {
318 1 uchar i,k;
319 1 EA = 0; //关外中断0
320 1 if (P3_2==0) //P3.2低电平继续
321 1 {
322 2 for (i=8;i>0;i--) //循环检测10次,低电平引导信号干扰检测(9ms)
323 2 {
324 3 Delay400us(); //延时438us
325 3 if (P3_2==1) //低电平引导信号出现高电平就跳出
326 3 {
327 4 EA = 1; //开外中断
328 4 return;
329 4 }
330 3 }
331 2 while(P3_2==0); //等待高电平引导信号到了.
332 2 for (i=8;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
333 2 {
334 3 Delay400us();
335 3 if (P3_2==0) //高电平引导信号出现低电平就跳出
336 3 {
337 4 EA = 1; //开外中断
338 4 return;
339 4 }
340 3 }
341 2 while(P3_2==1); //等待高电平引导信号结束.
342 2 //接收4个字节的数据
343 2 for (k=0;k<4;k++)
344 2 {
345 3 for (i=8;i>0;i--) //8位数据
346 3 {
347 4 while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
348 4 Delay400us();
349 4 Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
350 4 KeyCoding[k]>>= 1; //右移1位
351 4 if(P3_2==1) //仍是1,最高位写入1,0跳过
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -