基于MSP430F5529俄罗斯方块游戏程序文件.docx
《基于MSP430F5529俄罗斯方块游戏程序文件.docx》由会员分享,可在线阅读,更多相关《基于MSP430F5529俄罗斯方块游戏程序文件.docx(17页珍藏版)》请在冰豆网上搜索。
基于MSP430F5529俄罗斯方块游戏程序文件
/*基于MSP430F5529俄罗斯方块游戏程序*/
//作者:
詹磊
//功能:
基于MSP430F5529俄罗斯方块游戏程序
//说明:
运行环境:
TI官方MSP-EXP5529开发板(外接4个带上拉电阻独立按键)
// 非原创,思路是从51单片机上移植过来的
// 底层液晶驱动是TI官方提供的LCDAPI
// 游戏算法部分的底层程序多处已经修改,与原版会有较大的差别
//版本:
测试版V1.0(基本能流畅运行,但需要进一步的美化和优化)
#include"MSP430F5529.h"
#include"LCD_102x64.h"
#include"main.h"
#include"Key.h"
#defineMAXHANG20 //游戏显示行数
#defineMAXLIE 16 //游戏显示列数
#defineMapWide 48 //地图宽
#defineMapHigh 60 //地图高
#defineON 0
#defineOFF 1
#defineBIT(n) (1<<(n))
volatileuintcubeMap[MAXHANG]; //地图显示存存
typedefstruct{
ucharconst*box; //方块图形字模数据指针
ucharcube:
4; //方块形态(占用4个位域)
ucharstate:
4; //方块状态(占用4个位域)
charrow; //方块所在行
charcolumn; //方块所在列
}block;
blockthis;
ucharliang=11;
ucharSpeed=1,Score=0;
uinttimeA=0;
uchardownflag=0;
ucharrandomNumber=0;
constucharcube[]=
{
/*■
■■■
*/
0,4,0xe,0, 0,2,6,2, 0,7,2,0, 4,6,4,0,
/*■
■■■
*/
0,8,0xe,0, 0,4,4,0xc, 0,0,0xe,2, 0,6,4,4,
/*■■■
■
*/
0,0xe,8,0, 0,4,4,6, 0,1,7,0, 6,2,2,0,
/*■■
■■
*/
0,0xc,6,0, 0,2,6,4, 0,6,3,0, 2,6,4,0,
/* ■■
■■
*/
0,6,0xc,0, 0,4,6,2, 0,3,6,0, 4,6,2,0,
/*■■■■
*/
0,0xf,0,0, 4,4,4,4, 0,0,0xf,0, 2,2,2,2,
/*■■
■■
*/
0,6,6,0, 0,6,6,0, 0,6,6,0, 0,6,6,0
};
voiddelay_ms(uintz)//毫秒级延时函数
{
uinti,m;
for(i=z;i>0;i--)
for(m=4500;m>0;m--)
{
_NOP();
}
}
//-------------------------------------------//
//函数名:
八位LED灯控制函数
//入口:
Number:
Number哪位为一则哪位LED点亮
//出口:
Void
//功能:
//-------------------------------------------//
voidDigitalLedControl(ucharNumber)
{
if(Number&BIT7)
P1OUT|=BIT0;
else
P1OUT&=~BIT0;
if(Number&BIT6)
P8OUT|=BIT1;
else
P8OUT&=~BIT1;
if(Number&BIT5)
P8OUT|=BIT2;
else
P8OUT&=~BIT2;
if(Number&BIT4)
P1OUT|=BIT1;
else
P1OUT&=~BIT1;
if(Number&BIT3)
P1OUT|=BIT2;
else
P1OUT&=~BIT2;
if(Number&BIT2)
P1OUT|=BIT3;
else
P1OUT&=~BIT3;
if(Number&BIT1)
P1OUT|=BIT4;
else
P1OUT&=~BIT4;
if(Number&BIT0)
P1OUT|=BIT5;
else
P1OUT&=~BIT5;
}
//-------------------------------------------//
//函数名:
显存清空函数
//入口:
Void
//出口:
Void
//功能:
清空显存
//-------------------------------------------//
voidDisplayRamClear()
{
uchari;
for(i=0;i<20;i++)
{
cubeMap[i]=0x0;
}
}
//-------------------------------------------//
//函数名:
两位十进制数字显示函数
//入口:
Row:
显示的行数
// Column:
显示的列数
// Number:
需要显示的数字<100&&>=0
//出口:
Void
//功能:
//-------------------------------------------//
voidNumber2BitDisplay(ucharRow,ucharColumn,ucharNumber)
{
uchartempShi,tempGe;
tempShi=Number/10;
tempGe=Number%10;
Dogs102x6_charDraw(Row,Column,tempShi+'0',ON);
Dogs102x6_charDraw(Row,Column+6,tempGe+'0',ON);
}
//-------------------------------------------//
//函数名:
游戏背景函数
//入口:
Void
//出口:
Void
//功能:
绘制游戏背景地图
//-------------------------------------------//
voidGameBackground()
{
uchari;
for(i=0;i {
Dogs102x6_pixelDraw(0,i,ON);
Dogs102x6_pixelDraw(MapWide+1,i,ON);
}
for(i=0;i {
Dogs102x6_pixelDraw(i,0,ON);
Dogs102x6_pixelDraw(i,MapHigh+1,ON);
}
DisplayRamClear();
Dogs102x6_stringDraw(3,10,"START",ON);
Dogs102x6_stringDraw(1,51,"NEXT:
",ON);
Dogs102x6_stringDraw(3,51,"SPEED:
--",ON);
Dogs102x6_stringDraw(5,51,"SCORE:
--",ON);
Number2BitDisplay(3,87,Speed);
Number2BitDisplay(5,87,Score);
}
//-------------------------------------------//
//函数名:
游戏Map清空
//入口:
Void
//出口:
Void
//功能:
清空游戏背景地图(不清空显存)
//-------------------------------------------//
voidGameMapClear()
{
uchari,j;
for(i=0;i {
for(j=0;j {
Dogs102x6_pixelDraw(j+1,i+1,OFF);
}
}
}
//-------------------------------------------//
//函数名:
系统初始化
//入口:
Void
//出口:
Void
//功能:
//-------------------------------------------//
voidSystemInit()
{
WDTCTL=WDTPW+WDTHOLD;
P8DIR|=BIT1+BIT2;
P8OUT|=BIT1+BIT2;
P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5;
P1OUT|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5;
InitKey();
UCSCTL3=SELREF_2; //SetDCOFLLreference=REFO
UCSCTL4|=SELA_2; //SetACLK=REFO
__bis_SR_register(SCG0); //DisabletheFLLcontrolloop
UCSCTL0=0x0000; //SetlowestpossibleDCOx,MODx
UCSCTL1=DCORSEL_7; //SelectDCOrange50MHzoperation
UCSCTL2=FLLD_1+609; //SetDCOMultiplierfor25MHz(这里设置为20MHz适应液晶的SPI通信)
//(N+1)*FLLRef=Fdco
//(762+1)*32768=25MHz
//SetFLLDiv=fDCOCLK/2
__bic_SR_register(SCG0); //EnabletheFLLcontrolloop
TA1CCTL0=CCIE; //CCR0interruptenabled
TA1CCR0=328-1;
TA1CTL=TASSEL_1+MC_1+TACLR; //ACLK,upmode,clearTAR
_BIS_SR(GIE);
Dogs102x6_init();
Dogs102x6_clearScreen();
Dogs102x6_backlightInit();
Dogs102x6_setContrast(11);
Dogs102x6_setBacklight(liang);
}
//-------------------------------------------//
//函数名:
3x3点显示函数
//入口:
x:
x轴坐标
// y:
y轴坐标
// mode:
ON打点;OFF消点
//出口:
Void
//功能:
//-------------------------------------------//
voidDisplay3x3Pixels(ucharx,uchary,ucharmode)
{
x=3*x+1;
y=3*y+1;
Dogs102x6_pixelDraw(x,y,mode);
Dogs102x6_pixelDraw(x+1,y,mode);
Dogs102x6_pixelDraw(x+2,y,mode);
Dogs102x6_pixelDraw(x,y+1,mode);
Dogs102x6_pixelDraw(x+1,y+1,mode);
Dogs102x6_pixelDraw(x+2,y+1,mode);
Dogs102x6_pixelDraw(x,y+2,mode);
Dogs102x6_pixelDraw(x+1,y+2,mode);
Dogs102x6_pixelDraw(x+2,y+2,mode);
}
//-------------------------------------------//
//函数名:
显示像素点更改函数
//入口:
Row:
行数
// Column:
列数
// mode:
ON打点;OFF消点
//出口:
Void
//功能:
//-------------------------------------------//
voidChangeRamBit(ucharRow,ucharColumn,ucharmode)
{
uinttempData;
tempData=(0x8000>>(Column%16));
if(mode==ON)
cubeMap[Row]|=tempData;
else
cubeMap[Row]&=~tempData;
}
//-------------------------------------------//
//函数名:
读取某个显示像素点位值函数
//入口:
Row:
行数
// Column:
列数
//出口:
uchar1:
所选点位1,0:
所选的点位0
//功能:
//-------------------------------------------//
ucharReadDisplayRamBit(ucharRow,ucharColumn)
{
uinttempData;
tempData=(0x8000>>(Column%16));
if(cubeMap[Row]&tempData)
return1;
else
return0;
}
//-------------------------------------------//
//函数名:
下一个方块显示函数
//入口:
x:
x轴坐标
// y:
y轴坐标
// *p:
图形字模数据指针
//出口:
Void
//功能:
//-------------------------------------------//
voidshowNextCube(ucharconst*p,ucharx,uchary)
#defineNexPoinX 27 //下一个图形显示的X坐标
#defineNexPoinY 2 //下一个图形显示的Y坐标
{
uchari,j,temp;
for(i=0;i<4;i++)
{
temp=0x08;
for(j=0;j<4;j++)
{
if(p[i]&temp)
Display3x3Pixels(x+j,y+i,ON);
else
Display3x3Pixels(x+j,y+i,OFF);
temp>>=1;
}
}
}
//-------------------------------------------//
//函数名:
显示函数
//入口:
Void
//出口:
Void
//功能:
将显存的内容写入显示器显示
//-------------------------------------------//
voidshowCubeMap(void)
{
ucharhang,lie;
for(hang=0;hang {
if(cubeMap[hang]!
=0) //跳过某行全为零的地方
for(lie=0;lie {
if(cubeMap[hang]&(0x8000>>(lie%16)))
Display3x3Pixels(lie,hang,ON);
}
}
}
//-------------------------------------------//
//函数名:
产生新方块函数
//入口:
Void
//出口:
Void
//功能:
//-------------------------------------------//
voidcreateCube(void)
{
staticucharnext=0;
this.cube=next;
next=randomNumber%7; //产生随机数
this.row=0; //初始行为0
this.column=6;