📄 main.lst
字号:
256
257 {5,2,2,2,(*Stat5)}, //关于这个游戏
258 {6,3,3,3,(*Stat6)}, //开窗游戏
259 {7,7,7,1,(*Stat7)} //关于开窗游戏
260 };
261 /*-------------------------------------------------------------*/
262 void MenuOperate(unsigned char key)
263 {
264 1 switch(key)
265 1 {
266 2 case 0: //向上的键
267 2 {
268 3 KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
269 3 break;
270 3 }
271 2 case 1: //回车键
272 2 {
273 3 KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnterState;
274 3 break;
275 3 }
276 2 case 3: //向下的键
277 2 {
278 3 KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDownState;
279 3 break;
280 3 }
281 2 //此处添加按键错误代码
282 2 }
283 1 //下面是执行按键的操作
284 1 KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
285 1
286 1 (*KeyFuncPtr)(); //执行当前的按键操作
287 1 } //*/
288 /*-------------------------------------------------------------*/
289 unsigned char keyscan()
290 {
291 1 unsigned char key;
292 1 P2=0xFF;
293 1 key=P2&0xF8;
294 1 delayms(8);
295 1 //在这里加去抖动
296 1 switch (key)
297 1 {
298 2 case 0xF0: key=0;break; //P23 up
299 2 case 0xE8: key=1;break; //P24 enter
300 2 case 0xD8: key=2;break; //P25 cancel
301 2 case 0xB8: key=3;break; //P26 down
302 2 case 0x78: key=4;break; //P27 left
C51 COMPILER V8.05a MAIN 02/17/2008 15:54:11 PAGE 6
303 2 case 0xF8: //P17 right
304 2 {
305 3 key=P1&0x80;
306 3 if(key==0) key=5;
307 3 else key=10; //key==10时代表没有按键按下
308 3 }
309 2 }
310 1 return key;
311 1 }
312 /*--------------------------------------------------------------*/
313 //游戏数据中的0的个数的统计函数
314 //n=25的时候通过游戏关
315 unsigned char number_0(void)
316 {
317 1 unsigned char i,j,n;
318 1 n=0;
319 1 for (j=0;j<5;j++)
320 1 for (i=0;i<5;i++)
321 1 {
322 2 if(CurLevDat[j][i]==0)
323 2 n=n+1;
324 2 }
325 1 return n;
326 1 }
327 /*--------------------------------------------------------------*/
328 void GameOperate(unsigned char key)
329 {
330 1 switch(key)
331 1 {
332 2 case 0: // up
333 2 {
334 3 FocusStore(); //存放窗户原来的焦点坐标
335 3 if(FocusY==0)
336 3 {
337 4 FocusY=4;
338 4 }
339 3 else if(FocusY>0&&FocusY<=4)
340 3 {
341 4 FocusY-=1;
342 4 }
343 3 break;
344 3 }
345 2 case 1: //enter :在这里要对游戏数组数据进行修改
346 2 {
347 3 GameEnter();
348 3 WindowStateDisp();
349 3 //在这里对游戏数据进行检查如果窗户都打开则
350 3 //游戏玩家顺利过关
351 3 if(number_0()==25)
352 3 {
353 4 //"You do Good";
354 4 en_disp(3,16,12,Asc,s6,1);
355 4 delayms(700);
356 4 //
357 4 Level++;
358 4 if(Level==LEVELMAX)
359 4 Level=0;
360 4 // intial the game data
361 4 initGameDat();
362 4 //draw the game ground
363 4 drawGameGnd();
364 4 //draw the window focus
C51 COMPILER V8.05a MAIN 02/17/2008 15:54:11 PAGE 7
365 4 FocusDis();
366 4 //将游戏数据中窗户的开关状态显示在lcd上
367 4 WindowStateDisp();
368 4 //Draw the Level Text
369 4 LevelText();
370 4
371 4 }
372 3 break;
373 3 }
374 2 case 2: //cancel
375 2 {
376 3 //退出到MenuState
377 3 keyInputState=0;
378 3 //update the LCD
379 3 KeyFuncIndex=2; //重新设置菜单的索引
380 3 break;
381 3 }
382 2 case 3: //down
383 2 {
384 3 FocusStore();
385 3 if(FocusY==4)
386 3 {
387 4 FocusY=0;
388 4 }
389 3 else if (FocusY>=0&&FocusY<4)
390 3 {
391 4 FocusY+=1;
392 4 }
393 3 break;
394 3 }
395 2 case 4: //left
396 2 {
397 3 FocusStore();
398 3 if(FocusX==0)
399 3 {
400 4 FocusX=4;
401 4 }
402 3 else if(FocusX>0&&FocusX<=4)
403 3 {
404 4 FocusX-=1;
405 4 }
406 3 break;
407 3 }
408 2 case 5: //right
409 2 {
410 3 FocusStore();
411 3 if(FocusX==4)
412 3 {
413 4 FocusX=0;
414 4 }
415 3 else if (FocusX>=0&&FocusX<4)
416 3 {
417 4 FocusX+=1;
418 4 }
419 3 break;
420 3 }
421 2 }
422 1
423 1 //在这里更新液晶显示
424 1 FocusDis();
425 1 WindowStateDisp();
426 1 }
C51 COMPILER V8.05a MAIN 02/17/2008 15:54:11 PAGE 8
427 /*--------------------------------------------------------------*/
428 void SetOperate(key)
429 {
430 1 switch (key)
431 1 {
432 2 case 0: //up
433 2 {
434 3 Level++;
435 3 if(Level==LEVELMAX)
436 3 Level=0;
437 3 break;
438 3 }
439 2 case 1: //enrer
440 2 {
441 3 keyInputState=0;
442 3 MenuOperate(1); //模拟回车按键的动作
443 3 break;
444 3 }
445 2 case 2: //cancel
446 2 {
447 3 Level=LevelTemp;
448 3 keyInputState=0;
449 3 MenuOperate(1);
450 3 break;
451 3 }
452 2 case 3: //down
453 2 {
454 3
455 3 if(Level==0)
456 3 Level=LEVELMAX;
457 3 Level--;
458 3 break;
459 3 }
460 2 case 4: //left
461 2 {
462 3 Level=0;
463 3 break;
464 3 }
465 2 case 5: //right
466 2 {
467 3 Level=LEVELMAX-1;
468 3 break;
469 3 }
470 2 }
471 1 //update the LCD display
472 1 if(!((key==1)||(key==2)))
473 1 LevelText();
474 1 }
475 /*--------------------------------------------------------------*/
476 void int_0(void) interrupt 0 using 0
477 {
478 1 unsigned char key;
479 1 key=keyscan();
480 1
481 1 switch (keyInputState)
482 1 {
483 2 case 0 : MenuOperate(key);break;
484 2 case 1 : GameOperate(key);break;
485 2 case 2 : SetOperate(key); break;
486 2 }
487 1 }
488 /*-------------------------------------------------------------*/
C51 COMPILER V8.05a MAIN 02/17/2008 15:54:11 PAGE 9
489 void main(void)
490 {
491 1 LCD12864_init();
492 1 ClearLCD();
493 1 //开中断
494 1 EX0=1;
495 1 //设置电平触发方式
496 1 IT0=1;
497 1 //开所有中断
498 1 EA=1;
499 1 //
500 1 MenuOperate(10);
501 1 while(1)
502 1 {
503 2 }
504 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3227 ----
CONSTANT SIZE = 3172 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 50
IDATA SIZE = 35 ----
BIT SIZE = ---- 7
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -