標(biāo)題:
我的打地鼠單片機設(shè)計(矩陣鍵盤和cd12864實現(xiàn)的)含源碼
[打印本頁]
作者:
qwerqwerqwer
時間:
2018-7-9 15:17
標(biāo)題:
我的打地鼠單片機設(shè)計(矩陣鍵盤和cd12864實現(xiàn)的)含源碼
這是我單片機設(shè)計
是用c51做的一個打地鼠的游戲
用了一個矩陣鍵盤和一個lcd12864來實現(xiàn)的
打地鼠實行的是積分過關(guān)制
20分一關(guān),越到后面地鼠持續(xù)的速度越短
這樣更會讓自己感興趣,師傅也會比較認可
單片機源程序如下:
#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狀態(tài)字中的Busy標(biāo)識
//----------------------------函數(shù)聲明區(qū)----------------------------//
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();
//----------------------------數(shù)組定義----------------------------//
code unsigned char ColumnCode[4]={0xfe,0xfd,0xfb,0xf7};//0列起使的列掃描結(jié)果
code unsigned char uctech[] = {" |難度"};
code unsigned char net[] = {" | 01 "};
code unsigned char mcu[] = {" |得分"};
code unsigned char qq[] = {" | 99 "};
code unsigned char tmp[]={//128*64點陣圖形數(shù)據(jù)
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,};
//----------------------------主函數(shù)----------------------------//
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講入工作狀態(tài)
LCDInit(); //LCM初始化
DelayMS(5); //延時片刻(可不要)
Position(16);//初始時顯示標(biāo)準(zhǔn)方框線
Rand=RandomNumber();//初始時顯示一次老鼠位置
Position(Rand);//初始時顯示一次老鼠位置
DisplayListChar(5,1," 難度");//難度
DisplayListChar(5,3," 得分");//分數(shù)
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
IE=0x82;
TR0=1;
while(1)
{
// LCDClear();
// DisplayImage(tmp);//顯示圖形
// LCDClear();
// LCDFlash(); //閃爍效果
Counter++;
if(Counter==150)//1S出現(xiàn)一次//顯示老鼠位置
{
if(Key==Rand)
{
Score++;
RightPosition(Rand);
DelayMS(1000);
}
else
{
WrongPosition(Rand);
DelayMS(1000);
}
DelayMS(500);
Rand=RandomNumber();
Position(Rand);
Counter=0;
}
Key=KeyScan();
DisPlayMessage();//顯示關(guān)卡和得分
}
}
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;
}
}
//----------------------------產(chǎn)生隨機數(shù)----------------------------//
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);
}
//----------------------------寫數(shù)據(jù)----------------------------//
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(); //根據(jù)需要檢測忙
LCD_RS = 0;
LCD_RW = 0;
LCD_Data = WCLCD;
LCD_E = 1;
LCD_E = 1;
LCD_E = 1;
LCD_E = 0;
}
//----------------------------讀數(shù)據(jù)----------------------------//
unsigned char ReadDataLCD(void)
{
LCD_RS = 1;
LCD_RW = 1;
LCD_E = 0;
LCD_E = 0;
LCD_E = 1;
return(LCD_Data);
}
//----------------------------讀狀態(tài)----------------------------//
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); //顯示模式設(shè)置,開始要求每次檢測忙信號
WriteCommandLCD(0x01,1); //顯示清屏
WriteCommandLCD(0x06,1); // 顯示光標(biāo)移動設(shè)置
WriteCommandLCD(0x0C,1); // 顯示開及光標(biāo)設(shè)置
}
//----------------------------清屏---------------------------//
void LCDClear(void)
{
WriteCommandLCD(0x01,1); //顯示清屏
WriteCommandLCD(0x34,1); // 顯示光標(biāo)移動設(shè)置
WriteCommandLCD(0x30,1); // 顯示開及光標(biāo)設(shè)置
}
//----------------------------閃爍效果----------------------------//
void LCDFlash(void)
{
WriteCommandLCD(0x08,1); //顯示清屏
DelayMS(400);
WriteCommandLCD(0x0c,1); // 顯示開及光標(biāo)設(shè)置
DelayMS(400);
WriteCommandLCD(0x08,1); //顯示清屏
DelayMS(400);
WriteCommandLCD(0x0c,1); // 顯示開及光標(biāo)設(shè)置
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); //這里不檢測忙信號,發(fā)送地址碼
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之內(nèi)
switch(Y)
{
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
代碼下載:
打地鼠20170615.zip
(77.97 KB, 下載次數(shù): 76)
2018-7-9 15:17 上傳
點擊文件名下載附件
源碼
下載積分: 黑幣 -5
作者:
yilinghai
時間:
2021-1-4 15:33
哪位大神能根據(jù)這個畫一個仿真圖呢?
作者:
KSh
時間:
2022-6-3 12:50
不是C51的程序嗎,怎么是C15的
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1