久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機俄羅斯方塊代碼 12864液晶顯示
[打印本頁]
作者:
792544979
時間:
2018-7-19 16:32
標題:
51單片機俄羅斯方塊代碼 12864液晶顯示
用51單片機和12864顯示屏,60s2芯片,獨立按鍵做的俄羅斯方塊程序,用的話改一下端口即可。
QQ圖片20180719162052.jpg
(265.27 KB, 下載次數: 32)
下載附件
2018-7-19 16:30 上傳
單片機源程序:
//說明******************************
//此程序包含一個俄羅斯方塊.c 文件和一個12864.h 文件
//********************俄羅斯方塊.c文件**************************
//
#include <reg51.h>
#include "12864.h"
static unsigned long Seed = 1;
#define A 48271L
#define M 2147483647L
#define Q (M / A)//44488
#define R (M % A)//3399
sbit K1=P3^5;
sbit K2=P3^4;
sbit K3=P3^3;
sbit K4=P3^2;
unsigned int idata num[19+2]={
0xfff,//第1行,最下面
0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,
0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,0x801,//第2行到第20行共19行
0xfff//第21行,最上面
};
//定義共21行,其中num[0]為下墻壁行,num[20]為上墻壁行,每行12格,最左一格為左墻壁列,最右一格為右墻壁列
/*
0 1 2 3 4 5 6 7 8 9 10 11
0 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
1 ■ □ □ □ □ □ □ □ □ □ □ ■
2 ■ □ □ □ □ □ □ □ □ □ □ ■
3 ■ □ □ □ □ □ □ □ □ □ □ ■
4 ■ □ □ □ □ □ □ □ □ □ □ ■
5 ■ □ □ □ □ □ □ □ □ □ □ ■
6 ■ □ □ □ □ □ □ □ □ □ □ ■
7 ■ □ □ □ □ □ □ □ □ □ □ ■
8 ■ □ □ □ □ □ □ □ □ □ □ ■
9 ■ □ □ □ □ □ □ □ □ □ □ ■
10 ■ □ □ □ □ □ □ □ □ □ □ ■
11 ■ □ □ □ □ □ □ □ □ □ □ ■
12 ■ □ □ □ □ □ □ □ □ □ □ ■
13 ■ □ □ □ □ □ □ □ □ □ □ ■
14 ■ □ □ □ □ □ □ □ □ □ □ ■
15 ■ □ □ □ □ □ □ □ □ □ □ ■
16 ■ □ □ □ □ □ □ □ □ □ □ ■
17 ■ □ □ □ □ □ □ □ □ □ □ ■
18 ■ □ □ □ □ □ □ □ □ □ □ ■
19 ■ □ □ □ □ □ □ □ □ □ □ ■
20 ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
*/
unsigned char code Block[28][2]={
/*
* 口 口口口 口口
* 口 口 口 口
* 口口 口 口口口
*/
{0x88,0xc0},{0xe8,0x00},{0x62,0x20},{0x02,0xe0},
/*
* 口 口口 口口口
* 口 口 口 口
* 口口 口口口 口
*/
{0x22,0x60},{0x08,0xe0},{0xc8,0x80},{0xe2,0x00},
/*
* 口
* 口口 口口
* 口 口口
*/
{0x8c,0x40},{0x6c,0x00},{0x8c,0x40},{0x6c,0x00},
/*
* 口 口口
* 口口 口口
* 口
*/
{0x4c,0x80},{0xc6,0x00},{0x4c,0x80},{0xc6,0x00},
/*
* 口 口
* 口 口口 口口口 口口
* 口口口 口 口 口
*/
{0x04,0xe0},{0x8c,0x80},{0xe4,0x00},{0x26,0x20},
/*口
* 口
* 口 口口口口
* 口
*/
{0x44,0x44},{0x0f,0x00},{0x44,0x44},{0x0f,0x00},
/*
* 口口
* 口口
*/
{0x06,0x60},{0x06,0x60},{0x06,0x60},{0x06,0x60}
};
#define PASSSCORE 20
struct Jimu
{
unsigned int dat;
char x;
unsigned char y;
unsigned char type;
unsigned char change;
}Sign[3];//積木結構體
unsigned char SysFlag=0;
#define NEWSIGNFLAG 0
#define DEADFLAG 1
#define PAUSEFLAG 2
unsigned char Score=0;
unsigned char Level=1;
unsigned char DelayCnt=5;
/*********************************************************/
#define N 25
/************************************
偽隨機數發生器
*************************************/
double Random(void)
{
long TmpSeed;
TmpSeed=A*(Seed%Q)-R*(Seed/Q);
if(TmpSeed>=0)
Seed=TmpSeed;
else
Seed=TmpSeed+M ;
return (double)Seed/M;
}
/**************************************
為偽隨機數發生器播種
***************************************/
void InitRandom(unsigned long InitVal)
{
Seed=InitVal;
}
//延時子程序
void Delay(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
for(j=0;j<10;j++);
}
/*********************************
初始化MPU
**********************************/
void InitCpu(void)
{
TMOD=0x0;
TH0=0;
TL0=0;
TR0=1;
ET0=1;
EX1=1;
EA=1;
TCON|=0x04;
}
/****************************
welcome 游戲選擇界面
/**********************/
void welcome()
{
Lcd_WriteStr(0,0,"歡迎來玩");
Lcd_WriteStr(0,1,"俄羅斯方塊 ");
Lcd_WriteStr(0,2,"設置按K1");
Lcd_WriteStr(0,2,"開玩按K2");
}
/**************************************************俄羅斯方塊部分******************************************************8**********/
/******************************畫墻壁,初始化界面*******************************/
void DrawBoard(void)
{
unsigned char n;
for(n=0;n<12;n++)
{
Lcd_Rectangle(3*n,0,3*n+2,2,1);
Lcd_Rectangle(3*n,60,3*n+2,62,1);
}
for(n=0;n<20;n++)
{
Lcd_Rectangle(0,3*n,2,3*n+2,1);
Lcd_Rectangle(33,3*n,35,3*n+2,1);
}
Lcd_WriteStr(4,0,"經典游戲");
Lcd_WriteStr(3,2,"Score:");
Lcd_WriteStr(3,3,"Level:");
}
/***********************************
游戲結束處理
************************************/
void GameOver(void)
{
if((SysFlag&(1<<DEADFLAG))!=0)
Lcd_WriteStr(3,1,"You Fail");
else
Lcd_WriteStr(3,1,"You Pass");
}
unsigned int code MaskTab[16]={
0x0001,0x0002,0x0004,0x0008,0x0010,0x0020,0x0040,0x0080,
0x0100,0x0200,0x0400,0x0800,0x1000,0x2000,0x4000,0x8000
};
/**********************************
根據積木圖標左下坐標X,Y來畫出積木圖標
***********************************/
void DrawSign(struct Jimu Temp,unsigned char DrawMode)
{
unsigned char m,n;
for(m=0;m<4;m++)
for(n=0;n<4;n++)
{
if((Temp.dat&MaskTab[4*m+n])!=0)
Lcd_Rectangle(Temp.x+n*3,Temp.y-2-3*m,Temp.x+n*3+2,Temp.y-3*m,DrawMode);
}
}
/********************************
將積木圖標值融入num數據中
也即把積木圖標固定,無法再下降
*********************************/
void FixSign(void)
{
unsigned char m,n;
for(m=0;m<4;m++)//行循環
for(n=0;n<4;n++)//列循環
{
if((Sign[0].dat&MaskTab[4*m+n])!=0)
{
num[20-(Sign[0].y-2)/3+m]|=MaskTab[11-Sign[0].x/3-n];
}
}
}
/********************************
判斷積木圖標中方塊是否與障礙方塊重合
*********************************/
unsigned char CheckIf(void)
{
unsigned char m,n;
for(m=0;m<4;m++)//行循環
for(n=0;n<4;n++)//列循環
{
if((Sign[1].dat&MaskTab[4*m+n])!=0)
{
if((num[20-(Sign[1].y-2)/3+m]&MaskTab[11-Sign[1].x/3-n])!=0)
return 0;
}
}
return 1;
}
/********************************
判斷積木圖標是否可以繼續下降一格
********************************/
unsigned char CheckIfDown(void)
{
Sign[1]=Sign[0];//
Sign[1].y+=3;//假設下降一格
return CheckIf();
}
/********************************
判斷積木圖標是否可以向左移動
*********************************/
unsigned char CheckIfLeft(void)
{
Sign[1]=Sign[0];
Sign[1].x-=3;
return CheckIf();
}
/********************************
判斷積木圖標是否可以向右移動
*********************************/
unsigned char CheckIfRight(void)
{
Sign[1]=Sign[0];
Sign[1].x+=3;
return CheckIf();
}
/********************************
判斷是否可以旋轉
*********************************/
unsigned char CheckIfRoll(void)
{
unsigned char i;
unsigned int Temp;
Sign[1]=Sign[0];
if(++Sign[1].change>3)
Sign[1].change=0;
i=Sign[1].type*4+Sign[1].change;
Temp=(unsigned int)Block[i][0]<<8;
Temp=Temp|Block[i][1];
Sign[1].dat=Temp;
return CheckIf();
}
/********************************
尋找滿格的行并做消除處理
最多尋找4個滿行并做消除
*********************************/
void DelFull(void)
{
unsigned char m,n;
unsigned char Temp;
unsigned char Flag=0;
Temp=(Sign[0].y-2)/3;
if(Temp>=20)//防止越過了下邊界
Temp=1;
else
Temp=20-Temp;
for(n=Temp+3;n>=Temp;n--)//積木圖標的最頂行開始尋找滿行比較有利于運算
{
if(num[n]==0xfff)
{
Flag=1;
for(m=n+1;m<=19;m++)
{
num[m-1]=num[m];
}
num[m]=0x801;
Score++;//每找到一個滿行,則分數加1
}
}
if(Flag)//為加速而設置并判斷的標志,有已固定的積木有滿格消行變化則重畫積木界面
{
for(m=Temp;m<=19;m++)//為加速,不必要重第一行重畫起,只需要從積木圖標最下行開始往上的重畫
for(n=1;n<=10;n++)
{
if((num[m]&MaskTab[n])==0)
{
if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)!=0)//為加速而做的讀象素操作
{
Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,0);
}
}
else
{
if(Lcd_ReadPixel(30-(n-1)*3,57-(m-1)*3)==0)//為加速而做的讀象素操作
{
Lcd_Rectangle(30-(n-1)*3,57-(m-1)*3,30-(n-1)*3+2,57-(m-1)*3+2,1);
}
}
}
}
}
/*******************************
隨機產生一個積木圖標放到預產生區域并顯示出來
********************************/
void CreatSign(void)
{
unsigned char n;
unsigned int Temp;
DrawSign(Sign[2],0);//先清除
n=Random()*28;
Temp=(unsigned int)Block[n][0]<<8;
Temp=Temp|Block[n][1];
Sign[2].dat=Temp;
Sign[2].x=45;
Sign[2].y=4*3+2;
Sign[2].type=n/4;
Sign[2].change=n%4;
DrawSign(Sign[2],1);//后畫出
}
void PrintScore(void)
{
unsigned char Str[3];
Str[0]=(Score/10)|0x30;
Str[1]=(Score%10)|0x30;
Str[2]=0;
Lcd_WriteStr(6,2,Str);
}
復制代碼
全部資料51hei下載地址:
參考代碼--俄羅斯游戲代碼.zip
(62.52 KB, 下載次數: 76)
2018-7-19 16:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
asjcoi
時間:
2018-9-26 19:25
12864,俄羅斯方塊
作者:
K808
時間:
2018-11-26 20:55
樓主,有對應的電路圖。
作者:
hby123
時間:
2018-11-28 19:47
有電路圖嗎?樓主
作者:
天涯明月刀
時間:
2018-12-10 16:14
八個數據傳輸口是哪個?p1還是p2
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲毛片一区二区
|
日本一区二区高清不卡
|
国产成人精品久久二区二区91
|
精品一二三区
|
色狠狠桃花综合
|
青青草久久
|
日韩美女在线看免费观看
|
av在线一区二区三区
|
国产中文字幕在线
|
国产粉嫩尤物极品99综合精品
|
国内精品视频免费观看
|
亚洲日韩中文字幕一区
|
精品日本中文字幕
|
围产精品久久久久久久
|
日韩中文字幕高清
|
在线观看视频一区
|
av毛片
|
久久亚洲春色中文字幕久久久
|
日韩在线视频一区二区三区
|
欧美日韩国产精品一区
|
欧美精品一区二区三区在线播放
|
97国产精品视频人人做人人爱
|
奇米av
|
日韩第一夜
|
尤物视频在线免费观看
|
久久小视频
|
天天拍天天草
|
欧美激情在线精品一区二区三区
|
伊人网影院
|
波多野结衣中文视频
|
毛片软件
|
日本一二区视频
|
欧美第一区
|
久草网视频
|
福利av在线
|
精品一区二区三区不卡
|
狠狠亚洲
|
91精品在线播放
|
久久久成人网
|
国产91亚洲精品一区二区三区
|
日本精品视频在线
|