这是我单片机设计
是用c51做的一个打地鼠的游戏
用了一个矩阵键盘和一个lcd12864来实现的
打地鼠实行的是积分过关制
20分一关,越到后面地鼠持续的速度越短
这样更会让自己感兴趣,师傅也会比较认可
单片机源程序如下:
- #include <stc15.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- sbit LCD_RS=P1^4;//定义引脚
- sbit LCD_RW=P1^3;
- sbit LCD_E=P1^2;
- sbit PSB =P1^1;//PSB脚为12864-12系列的串、并通讯功能切换,我们使用8位并行接口,PSB=1
- #define LCD_Data P2
- #define Busy 0x80 //用于检测LCD状态字中的Busy标识
- //----------------------------函数声明区----------------------------//
- void WriteDataLCD(unsigned char WDLCD);
- void WriteCommandLCD(unsigned char WCLCD,BuysC);
- unsigned char ReadDataLCD(void);
- unsigned char ReadStatusLCD(void);
- void LCDInit(void);
- void LCDClear(void);
- void LCDFlash(void);
- void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
- void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
- void DisplayImage (unsigned char code *DData);
- void DelayMS(unsigned int ms);
- unsigned char KeyScan();
- unsigned char RandomNumber();
- void Position(unsigned char a);
- void RightPosition(unsigned char a);
- void WrongPosition(unsigned char a);
- void DisPlayMessage();
- //----------------------------数组定义----------------------------//
- code unsigned char ColumnCode[4]={0xfe,0xfd,0xfb,0xf7};//0列起使的列扫描结果
- code unsigned char uctech[] = {" |难度"};
- code unsigned char net[] = {" | 01 "};
- code unsigned char mcu[] = {" |得分"};
- code unsigned char qq[] = {" | 99 "};
- code unsigned char tmp[]={//128*64点阵图形数据
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X1E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X5F,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X01,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X01,0XE1,0XFF,0XE0,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X0F,0XF9,0XFF,0XEF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X1F,0XFD,0XFF,0XFF,0XF8,0X00,0X00,0X18,0X00,0X87,0X00,0X18,0X00,0X00,0XC0,
- 0X00,0X1F,0XFE,0XFF,0XFF,0XF8,0X00,0X00,0X18,0X01,0X8D,0X80,0X18,0X01,0XF7,0XC0,
- 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0X8D,0XA0,0X18,0X00,0X03,0X80,
- 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X27,0XFF,0XF1,0XFF,0XC0,0X06,0X00,
- 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X03,0XFF,0XF1,0X9D,0X01,0X08,0XC0,0X0C,0X00,
- 0X00,0X3F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0X7D,0X61,0X18,0XC0,0X08,0X60,
- 0X00,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X18,0X01,0XDF,0XE1,0XFF,0XC7,0XFF,0XF0,
- 0X00,0X1F,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X1C,0X03,0XED,0X01,0X18,0XC0,0X08,0X00,
- 0X00,0X1F,0XFF,0X01,0XFF,0XF8,0X00,0X00,0X16,0X02,0X8D,0X61,0X18,0XC0,0X08,0X00,
- 0X00,0X0F,0XFE,0X00,0XFF,0XF8,0X00,0X00,0X32,0X02,0XAD,0X81,0XFF,0XC0,0X08,0X00,
- 0X00,0X07,0XF8,0X00,0X3F,0XD0,0X00,0X00,0X23,0X07,0X3D,0X01,0X18,0X20,0X08,0X00,
- 0X00,0XFD,0XF8,0X00,0X3F,0XE0,0X00,0X00,0X61,0X85,0XFD,0X20,0X18,0X20,0X08,0X00,
- 0X01,0XFF,0XF0,0X00,0X1F,0X40,0X00,0X00,0X80,0XF0,0X0F,0XE0,0X18,0X20,0X78,0X00,
- 0X03,0XFF,0XF0,0X00,0X0F,0X80,0X00,0X03,0X00,0X60,0X0C,0X00,0X0F,0XE0,0X18,0X00,
- 0X03,0XFF,0XE0,0X00,0X0F,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X07,0XFF,0XE0,0X00,0X0F,0XF4,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X07,0XFF,0XE0,0X00,0X0F,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X07,0XFF,0XE0,0X00,0X0F,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X03,0XFF,0XE0,0X00,0X0F,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X03,0XFF,0XE0,0X00,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X03,0XFF,0XF0,0X00,0X1F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X01,0XFF,0XF0,0X00,0X3F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X01,0XFF,0XF8,0X00,0X7F,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0XFF,0XFC,0X00,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X3F,0XFF,0X87,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X03,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X01,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0XFE,0X77,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X70,0X01,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X70,0X0F,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X70,0X3F,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X78,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X1F,0XFC,0X79,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X7F,0XFF,0X39,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0XFF,0XFF,0XFD,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0XFF,0XFF,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0XFF,0XFF,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X7F,0XFF,0XFE,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X3F,0XFF,0XEF,0X7E,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X0F,0XFF,0XEF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X07,0XFF,0XC7,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X01,0XFF,0X83,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X1E,0X01,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X01,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X60,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
- 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,};
- //----------------------------主函数----------------------------//
- static unsigned char Gate=1,Score=0;
- void main(void)
- {
- static unsigned char Rand=0,Counter=0,Key=16;
- P0M0=1;P0M1=0;
- P1M0=1;P1M1=0;
- P2M0=1;P2M1=0;
- P3M0=1;P3M1=0;
-
- DelayMS(400); //启动等待,等LCD讲入工作状态
- LCDInit(); //LCM初始化
- DelayMS(5); //延时片刻(可不要)
-
- Position(16);//初始时显示标准方框线
- Rand=RandomNumber();//初始时显示一次老鼠位置
- Position(Rand);//初始时显示一次老鼠位置
- DisplayListChar(5,1," 难度");//难度
- DisplayListChar(5,3," 得分");//分数
-
- TMOD=0x01;
- TH0=0x3c;
- TL0=0xb0;
- IE=0x82;
- TR0=1;
-
- while(1)
- {
- // LCDClear();
- // DisplayImage(tmp);//显示图形
- // LCDClear();
- // LCDFlash(); //闪烁效果
-
- Counter++;
- if(Counter==150)//1S出现一次//显示老鼠位置
- {
- if(Key==Rand)
- {
- Score++;
- RightPosition(Rand);
- DelayMS(1000);
- }
- else
- {
- WrongPosition(Rand);
- DelayMS(1000);
- }
-
- DelayMS(500);
-
- Rand=RandomNumber();
- Position(Rand);
- Counter=0;
- }
-
- Key=KeyScan();
- DisPlayMessage();//显示关卡和得分
- }
- }
- void T0Isr() interrupt 1
- {
- static unsigned char Counter1;
- Counter1++;
- if(Counter1==20)//定时1S
- {
- // if(Score>=15)
- // {
- // Gate++;
- // Score=0;
- // }
- // DisplayListChar(0,1," ");
- // DisplayListChar(0,2," ");
- // DisplayListChar(0,3," ");
- // DisplayListChar(0,4," ");
- }
- TH0=0x3c;
- TL0=0xb0;
- }
- //----------------------------显示等级和得分----------------------------//
- void DisPlayMessage()
- {
- unsigned char w,x,y,z;
- w=(((int)((Gate%100)/10))+48);
- x=((int)(Gate%10)+48);
- // DisplayOneChar(6,2,32);
- DisplayOneChar(7,2,w);
- DisplayOneChar(8,2,x);
- DelayMS(1);
- y=(((int)((Score%100)/10))+48);
- z=((int)(Score%10)+48);
- // DisplayOneChar(6,4,32);
- DisplayOneChar(7,4,y);
- DisplayOneChar(8,4,z);
- }
- //----------------------------老鼠位置----------------------------//
- void Position(unsigned char a)
- {
- DisplayListChar(0,1," | | | | |");//第一排
- DisplayListChar(0,2," | | | | |");//第二排
- DisplayListChar(0,3," | | | | |");//第三排
- DisplayListChar(0,4," | | | | |");//第四排
- switch(a)
- {
- case 0: DisplayListChar(0,1," |*| | | |");break;
- case 1: DisplayListChar(0,1," | |*| | |");break;
- case 2: DisplayListChar(0,1," | | |*| |");break;
- case 3: DisplayListChar(0,1," | | | |*|");break;
- case 4: DisplayListChar(0,2," |*| | | |");break;
- case 5: DisplayListChar(0,2," | |*| | |");break;
- case 6: DisplayListChar(0,2," | | |*| |");break;
- case 7: DisplayListChar(0,2," | | | |*|");break;
- case 8: DisplayListChar(0,3," |*| | | |");break;
- case 9: DisplayListChar(0,3," | |*| | |");break;
- case 10:DisplayListChar(0,3," | | |*| |");break;
- case 11:DisplayListChar(0,3," | | | |*|");break;
- case 12:DisplayListChar(0,4," |*| | | |");break;
- case 13:DisplayListChar(0,4," | |*| | |");break;
- case 14:DisplayListChar(0,4," | | |*| |");break;
- case 15:DisplayListChar(0,4," | | | |*|");break;
- default:break;
- }
- }
- //----------------------------打中老鼠----------------------------//
- void RightPosition(unsigned char a)
- {
- DisplayListChar(0,1," | | | | |");//第一排
- DisplayListChar(0,2," | | | | |");//第二排
- DisplayListChar(0,3," | | | | |");//第三排
- DisplayListChar(0,4," | | | | |");//第四排
- switch(a)
- {
- case 0: DisplayListChar(0,1," |+| | | |");break;
- case 1: DisplayListChar(0,1," | |+| | |");break;
- case 2: DisplayListChar(0,1," | | |+| |");break;
- case 3: DisplayListChar(0,1," | | | |+|");break;
- case 4: DisplayListChar(0,2," |+| | | |");break;
- case 5: DisplayListChar(0,2," | |+| | |");break;
- case 6: DisplayListChar(0,2," | | |+| |");break;
- case 7: DisplayListChar(0,2," | | | |+|");break;
- case 8: DisplayListChar(0,3," |+| | | |");break;
- case 9: DisplayListChar(0,3," | |+| | |");break;
- case 10:DisplayListChar(0,3," | | |+| |");break;
- case 11:DisplayListChar(0,3," | | | |+|");break;
- case 12:DisplayListChar(0,4," |+| | | |");break;
- case 13:DisplayListChar(0,4," | |+| | |");break;
- case 14:DisplayListChar(0,4," | | |+| |");break;
- case 15:DisplayListChar(0,4," | | | |+|");break;
- default:break;
- }
- }
- //----------------------------未打中老鼠----------------------------//
- void WrongPosition(unsigned char a)
- {
- DisplayListChar(0,1," | | | | |");//第一排
- DisplayListChar(0,2," | | | | |");//第二排
- DisplayListChar(0,3," | | | | |");//第三排
- DisplayListChar(0,4," | | | | |");//第四排
- switch(a)
- {
- case 0: DisplayListChar(0,1," |-| | | |");break;
- case 1: DisplayListChar(0,1," | |-| | |");break;
- case 2: DisplayListChar(0,1," | | |-| |");break;
- case 3: DisplayListChar(0,1," | | | |-|");break;
- case 4: DisplayListChar(0,2," |-| | | |");break;
- case 5: DisplayListChar(0,2," | |-| | |");break;
- case 6: DisplayListChar(0,2," | | |-| |");break;
- case 7: DisplayListChar(0,2," | | | |-|");break;
- case 8: DisplayListChar(0,3," |-| | | |");break;
- case 9: DisplayListChar(0,3," | |-| | |");break;
- case 10:DisplayListChar(0,3," | | |-| |");break;
- case 11:DisplayListChar(0,3," | | | |-|");break;
- case 12:DisplayListChar(0,4," |-| | | |");break;
- case 13:DisplayListChar(0,4," | |-| | |");break;
- case 14:DisplayListChar(0,4," | | |-| |");break;
- case 15:DisplayListChar(0,4," | | | |-|");break;
- default:break;
- }
- }
- //----------------------------产生随机数----------------------------//
- unsigned char RandomNumber()
- {
- int number;
- number = rand()%16;
- return number;
- }
- //----------------------------矩阵键盘扫描----------------------------//
- unsigned char KeyScan()
- {
- unsigned char temp=0,row=0,column=0,i=0;
- P3=0xf0;
- temp=P3&0xf0;
- if(temp!=0xf0)
- {
- DelayMS(10);
- temp=P3&0xf0;
- if(temp!=0xf0)
- {
- switch(temp)
- {
- case 0x70:row=3;break;
- case 0xb0:row=2;break;
- case 0xd0:row=1;break;
- case 0xe0:row=0;break;
- }
- for(i=0;i<4;i++)
- {
- P3=ColumnCode[i];
- temp=P3&0xf0;
- temp=~temp;
- if(temp!=0xf0)column=i;
- }
- return(row*4+column);
- }
- }
- else P3=0xff;
- return(16);
- }
- //----------------------------写数据----------------------------//
- void WriteDataLCD(unsigned char WDLCD)
- {
- ReadStatusLCD(); //检测忙
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_Data = WDLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- //----------------------------写命令----------------------------//
- void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测
- {
- if (BuysC) ReadStatusLCD(); //根据需要检测忙
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_Data = WCLCD;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 1;
- LCD_E = 0;
- }
- //----------------------------读数据----------------------------//
- unsigned char ReadDataLCD(void)
- {
- LCD_RS = 1;
- LCD_RW = 1;
- LCD_E = 0;
- LCD_E = 0;
- LCD_E = 1;
- return(LCD_Data);
- }
- //----------------------------读状态----------------------------//
- unsigned char ReadStatusLCD(void)
- {
- LCD_Data = 0xFF;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_E = 1;
- while (LCD_Data & Busy); //检测忙信号
- LCD_E = 0;
- return(LCD_Data);
- }
- //----------------------------LCM初始化----------------------------//
- void LCDInit(void)
- {
- WriteCommandLCD(0x30,1); //显示模式设置,开始要求每次检测忙信号
- WriteCommandLCD(0x01,1); //显示清屏
- WriteCommandLCD(0x06,1); // 显示光标移动设置
- WriteCommandLCD(0x0C,1); // 显示开及光标设置
- }
- //----------------------------清屏---------------------------//
- void LCDClear(void)
- {
- WriteCommandLCD(0x01,1); //显示清屏
- WriteCommandLCD(0x34,1); // 显示光标移动设置
- WriteCommandLCD(0x30,1); // 显示开及光标设置
- }
- //----------------------------闪烁效果----------------------------//
- void LCDFlash(void)
- {
- WriteCommandLCD(0x08,1); //显示清屏
- DelayMS(400);
- WriteCommandLCD(0x0c,1); // 显示开及光标设置
- DelayMS(400);
- WriteCommandLCD(0x08,1); //显示清屏
- DelayMS(400);
- WriteCommandLCD(0x0c,1); // 显示开及光标设置
- DelayMS(400);
- WriteCommandLCD(0x08,1); //显示清屏
- DelayMS(400);
- }
- //----------------------------在指定位置显示一个字符----------------------------//
- void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
- {
- if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; //限制X不能大于16,Y不能大于1
- switch(Y)
- {
- case 1:X|=0X80;break;
- case 2:X|=0X90;break;
- case 3:X|=0X88;break;
- case 4:X|=0X98;break;
- }
- WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码
- WriteDataLCD(DData);
- }
- //----------------------------在指定位置显示一串字符----------------------------//
- void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
- {
- unsigned char ListLength,X2;
- ListLength = 0;
- X2=X;
- if(Y<1)
- Y=1;
- if(Y>4)
- Y=4;
- X &= 0x0F; //限制X不能大于16,Y在1-4之内
- switch(Y)
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码 代码下载:
打地鼠20170615.zip
(77.97 KB, 下载次数: 76)
|