1、单片机打地鼠代码单片机打地鼠代码/*单片机为 at89s52 ,显示用 12864 液晶显示屏。 黄书敏2012.5#include#include #include #define uchar unsigned char #define uint unsigned int #include stdlib.h#define FSOC 12000000L / 晶振频率#define TIMS1 (65536-FSOC/12/1000*5) / 每 5ms溢出全局变量#define TIMS0 (65536-200) / 计数器每中断 200 次溢出一次/uchar score = 0; / ui
2、nt top = 0; / uchar level = 1; / uchar life = 3;uchar pos = 0 ; / uchar prepos = 0;uchar flag = 0; /uint count; / uchar remtime = 33 ; sbit triger = P33 ;/分数最高分关数/ 生命数地鼠/ 地雷位置/ 上一只地鼠 / 地雷位置地鼠 or 地雷标志位计时器/ 每局剩余秒数 30s/ 单片机 P33口接 P34 口/数声明 / void DelayUs2x(uint t);void DelayMs(uint t);void delay_50us(u
3、int t);void delay_1s(uint t);void delay_0_5s(uint t);void CheckBusy(void);void write_12864com(uchar com);void write_12864date(uchar date) ;void initinal(void) ;void ClrScreen();void Set_Cursor(uchar x, uchar y) ;void writeCGRAM(uchar pos,uchar code *pic) ;void displayCGRAM(uchar x,uchar y,uchar pos)
4、 ;void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s) ;void LCD_PutGraphic(unsigned char code *img); / 显示满屏图 片void showpic(uchar x,uchar y,uchar code *pic); void show_welcome() ;在指定位置显示老鼠在指定位置显示锤子在指定位置显示炸弹在指定位置显示方框void show_life(uchar life) ; void show_level(uchar level) ; void
5、 show_time(uchar time) ; void show_score(uint score) ; void IniScreen() ; void show_mouse(uchar pos); / void show_strike(uchar pos) ; / void show_bomb(uchar pos); / void show_squre(uchar pos); / void show_level_up(uchar level,uint score);void show_gameover(uint score); void show_congratulation(uint
6、score);void show_win_newrecord(uint score, uint top); void show_lose_newrecord (uint score,uint top) ;/ void Timers_Init() ; void Timer1reset() ; void Timer0reset() ;void Timer0_ISR() ; / 中断处理函数 void Timer1_ISR() ;void close_timers() ; void delay_ms(uint t); unsigned char Key_Scan() ; uint long_dela
7、y (uchar s) ; uint StarAGame() ; void level_going() ; unsigned char end() ;/12864队友写的,未经允许不做公开 / / void Timers_Init() / 配置 Timer1 为计时器, timer0 为计数 器,timer1 每 5ms送出一个 interrupt 3 , 使 count+ ,timer0+void Timer0reset()TR0 = 1 ; /timer0 允许记时 remtime = 33 ;void Timer1reset()TR1 = 1 ; /timer1 允许计时 count =
8、 0 ;void Timer0_ISR() interrupt 1 / 用于每局 30s 计时 remtime- ; / 时间减一秒show_time(remtime-3); / 打印时间 TH0 = TIMS08;TL0 = TIMS0;void Timer1_ISR() interrupt 3 / 用于每只老鼠时间计时,具 体时间依关数不同。triger = 0;triger = 1;count+;TH1 = TIMS18;TL1 = TIMS1;void close_timers()TR0 = 0;TR1 = 0;/ 矩阵键盘/void delay_ms(uint t)uint i;fo
9、r(;t0;t-)i = 120;while (i-) ;unsigned char Key_Scan()unsigned char X=0,Y=0,key=255; P1 = 0x0f;if(P1!=0x0f) delay_ms(10); / 消抖 if(P1!=0x0f)X = P1;P1 = 0xf0;Y = P1; key = X|Y; switch(key) 对键值赋值case 0xee: key=12; break; / case 0xde: key=8; break; case 0xbe: key=4; break; case 0x7e: key=0; break; case 0
10、xed: key=13; break; case 0xdd: key=9; break; case 0xbd: key=5; break; case 0x7d: key=1; break; case 0xeb: key=14; break; case 0xdb: key=10; break; case 0xbb: key=6;break; case 0x7b: key=2;break; case 0xe7: key=15;break; case 0xd7: key=13;break; case 0xb7: key=7;break; case 0x77: key=3;break;default:
11、 key = 255;break;while(P1!=0xf0);return key;/ 游戏进行时 /uint long_delay (uchar s) / 延时函数uchar i,j;while(s-)for(i=0;i10;i+)for(j=0;j250;j+) if(Key_Scan()!=255) / 按键可结束延时,并将 rand_seed 值定格srand(j); / 种随即种子return 1 ;return 0; / 开机超时未响应uint StarAGame()initinal();writeCGRAM(0,mouse); writeCGRAM(1,squre); wri
12、teCGRAM(2,strike); writeCGRAM(3,bomb);ClrScreen(); show_welcome(); life = 3; /score = 0; level = 1;if (long_delay(1000)=1)Timers_Init() ;return 1;elsereturn 0;void creat_a_mouse() / 处理一只老鼠uchar getkey;show_squre(prepos); / 清除上一次图像 Timer1reset();if(flag!=0)show_mouse(pos); / 画出一只老鼠 while(count=400-5*
13、level)getkey = Key_Scan();if(getkey!=255)if(getkey=pos)score+;show_strike(pos);return;else/ life-;show_squre(pos) ;return;/ life-; / 超时扣分 show_squre(pos); return;elseshow_bomb(pos); / 出现炸弹,几率五分之一 while(count=400-5*level )getkey = Key_Scan();if(getkey=pos)life-;return;show_squre(pos) ;return;void lev
14、el_going() if(life3) show_life(life);show_score(score); delay_ms(500-8*level);if (life 0)prepos = pos; pos = rand()%16; flag = rand()%7;creat_a_mouse(); else close_timers() ;return; close_timers(); return ; unsigned char end()if(level20) / 游戏失败 if(score=top) ClrScreen();show_gameover(score) ;elseClr
15、Screen(); show_lose_newrecord(score,top) ; top = score ;else / 通关if (score0;) 选择是退出还是再来一局。unsigned char temp;Timer0reset() ;temp = Key_Scan() ;if (temp=8 & temp=13*level & level0) level+ ; ClrScreen();show_level_up(level,score) ; delay_1s(8);level_going() ;if (end()=1) close_timers() ; continue;else close_timers() ;ClrScreen(); break; else ClrScreen();break;while(1);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1