完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
没有蓝牙,不要蓝牙控制的,最好是把下面的程序改一下,谢谢大神
#include #include "msp430.h" #include "HAL_Buttons.h" #include "HAL_Board.h" #include "HAL_Dogs102x6.h" #include "HAL_Menu.h" #include "HAL_Wheel.h" #include "Snake.h" #include "Random.h" #include "CTS_Layer.h" #include "Menu.h" #include "Tetris.h" unsigned char Snake_Temp=0; unsigned char Snake_downflag=0; unsigned char Score_bai=48,Score_shi=48,Score_ge=48;//设置得分score的初始值“000” unsigned char Best_bai=48,Best_shi=48,Best_ge=48;//设置最高分best的初始值“000” //================================================================================ void spot (void)//游戏场景布局 { uint8_t a; //绘制最外层的框子 for(a=0;a<102;a++) { Dogs102x6_pixelDraw(a, 0, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(a, 1, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(a, 62, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(a, 63, DOGS102x6_DRAW_NORMAL); }//横向的两行 for(a=1;a<63;a++) { Dogs102x6_pixelDraw(0, a, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(1, a, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(2, a, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(99, a, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(100, a, DOGS102x6_DRAW_NORMAL); Dogs102x6_pixelDraw(101, a, DOGS102x6_DRAW_NORMAL); }//竖向的两行 } /* * */ void Display3x3Pixel(uint8_t x,uint8_t y,uint8_t mode) { x=3*x+3; y=3*y+2; 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); } /* * */ void SnakeGame(void) { uint8_t newsnake_X[999] = {10,11,12}; uint8_t newsnake_Y[999] = {10,10,10};//用数组表示贪吃蛇,初始化贪吃蛇 uint8_t snake_X[999] = {10,11,12}; uint8_t snake_Y[999] = {10,10,10};//用于记录上一条贪吃蛇的状态,用于贪吃蛇的更新 int8_t head_X = 10; int8_t head_Y = 10;//蛇头 uint8_t food_X = 4; uint8_t food_Y = 10;//食物初始化 uint8_t snake_size=3;//蛇长 unsigned short score,Best=0;//初始化得分,最高分 unsigned char dead=0;//贪吃蛇死亡状态变量 unsigned int food_X_create; unsigned int food_Y_create;//产生的新食物的位置 uint8_t Temp_reg=3;//触摸按键键值的记忆变量,用于与每次的键值作对比,防止出现蛇后退的现象 signed char dX,dY; dX=-1; dY=0;//位置偏移量,控制蛇的上下左右方向变化 buttonsPressed = 0; Dogs102x6_clearScreen(); spot(); uint8_t i; while (!(buttonsPressed & BUTTON_S2)) { //Dogs102x6_clearScreen(); //spot(); //画出贪吃蛇 for(i=0;i Display3x3Pixel(newsnake_X[i], newsnake_Y[i], DOGS102x6_DRAW_NORMAL); } //画出食物 Display3x3Pixel(food_X, food_Y, DOGS102x6_DRAW_NORMAL); Snake_Temp=Key; if(Snake_downflag) { if(Snake_Temp==1&&Temp_reg!=2)//向上运动 { dX=0; dY=-1; Temp_reg=Snake_Temp; } else if(Snake_Temp==2&&Temp_reg!=1)//向下运动 { dX=0; dY=1; Temp_reg=Snake_Temp; } else if(Snake_Temp==3&&Temp_reg!=4)//向左运动 { dX=-1; dY=0; Temp_reg=Snake_Temp; } else if(Snake_Temp==4&&Temp_reg!=3)//向右运动 { dX=1; dY=0; Temp_reg=Snake_Temp; } clear_background(); spot(); head_X=head_X+dX; head_Y=head_Y+dY; //吃到实物 if ((head_X==food_X)&&(head_Y==food_Y)) { food_X_create=(food_X_create+head_X+head_Y)%32; food_Y_create=(food_X_create+head_X+head_Y)%20; snake_size++;//蛇的长度加1 newsnake_X[0] = head_X; newsnake_Y[0] = head_Y; for(i = 0; i newsnake_X[i+1] = snake_X[i]; newsnake_Y[i+1] = snake_Y[i]; } for(i = 0; i snake_X[i] = newsnake_X[i]; snake_Y[i] = newsnake_Y[i]; } food_X= food_X_create; food_Y= food_Y_create; score=snake_size-3;//根据蛇长(或吃到食物的个数)来计算出得分 //得到score的千百十各位,并转化为ASCII码(+48) Score_bai=score/100+48; Score_shi=(score/10)%10+48; Score_ge=score%10+48; //如果当前得分大于最高分Best,则更新最高分 if(score>=Best) { Best=score; } //得到best的千百十各位,并转化为ASCII码(+48) Best_bai=Best/100+48; Best_shi=(Best/10)%10+48; Best_ge=Best%10+48; } //没有吃到食物的操作 else { for(i = 0; i<(snake_size-1); i++) { newsnake_X[i+1] = snake_X[i]; newsnake_Y[i+1] = snake_Y[i]; } newsnake_X[0] = head_X; newsnake_Y[0] = head_Y; for(i = 0; i snake_X[i] = newsnake_X[i]; snake_Y[i] = newsnake_Y[i]; } } //蛇头碰到蛇身或边界,蛇死亡 for(i=2;i<=snake_size;i++) { if((head_X==newsnake_X[i])&&(head_Y==newsnake_Y[i])) { dead=1; } else { dead= 0; } } if ((head_X<0)||(head_X==32)||(head_Y<0)||(head_Y==20)) { dead=1; } Snake_downflag=0; if(dead==1) { Snake_Game_Over(); delay_ms(2000); //Main(); break; } } } } void clear_background(void) { char i,j; for(i=2;i<62;i++) for(j=3;j<99;j++) Dogs102x6_pixelDraw(j, i, 1); } void Snake_Game_Over() { Dogs102x6_clearScreen(); Dogs102x6_stringDraw(3, 0, " Game Over ", DOGS102x6_DRAW_NORMAL); } #include #include "msp430.h" #include "HAL_PMM.h" #include "HAL_UCS.h" #include "HAL_Board.h" #include "HAL_Buttons.h" #include "HAL_Cma3000.h" #include "HAL_Dogs102x6.h" #include "HAL_Menu.h" #include "HAL_Wheel.h" #include "LPM.h" #include "PMM.h" #include "Random.h" #include "CTS_Layer.h" #include "Tetris.h" #include "Menu.h" #define MAXHANG 20 //游戏显示行数 #define MAXLIE 16 //游戏显示列数 #define MapWide 48 //地图宽 #define MapHigh 60 //地图高 #define ON 0 #define OFF 1 #define BIT(n) (1<<(n)) uchar Gameover=0; uchar temp=0; uchar m=1; volatile uint cubeMap[MAXHANG]; //地图显示存存 typedef struct{ uchar const * box; //方块图形字模数据指针 uchar cube : 4; //方块形态(占用4个位域) uchar state : 4; //方块状态(占用4个位域) char row; //方块所在行 char column; //方块所在列 } block; block this; uchar liang=1; uchar Speed=1,Score=0; uint timeA=0; uchar downflag=0; uchar randomNumber=0; const uchar cube[]= { 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 }; void delay_ms(uint z)//毫秒级延时函数 { uint i,m; for(i=z;i>0;i--) for(m=4500;m>0;m--) { _NOP(); } } /* * */ void DisplayRamClear() { uchar i; for(i=0;i<20;i++) { cubeMap[i]=0x0; } } /* * */ void Number2BitDisplay(uchar Row,uchar Column,uchar Number) { uchar tempShi,tempGe; tempShi=Number/10; tempGe=Number%10; Dogs102x6_charDraw(Row, Column,tempShi+'0',ON); Dogs102x6_charDraw(Row, Column+6,tempGe+'0',ON); } /* * */ void GameBackground() { uchar i; 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); } for(i=MapWide+3;i<102;i++) { Dogs102x6_pixelDraw(i, 34, ON); Dogs102x6_pixelDraw(i, 36, ON); } DisplayRamClear(); Dogs102x6_stringDraw(0, 51, "Author:",ON); Dogs102x6_stringDraw(1, 51, " Liuzw",ON); Dogs102x6_stringDraw(2, 51, "Number:",ON); Dogs102x6_stringDraw(3, 51, " 1301-20",ON); Dogs102x6_stringDraw(3, 10, "START",ON); Dogs102x6_stringDraw(5, 51, "NEXT: ",ON); Dogs102x6_stringDraw(6, 51, "SPEED:--",ON); Dogs102x6_stringDraw(7, 51, "SCORE:--",ON); Number2BitDisplay(6,87,Speed); Number2BitDisplay(7,87,Score); } /* * */ void GameMapClear() { uchar i,j; for(i=0;i for(j=0;j Dogs102x6_pixelDraw(j+1, i+1, OFF); } } } /* * */ void SystemInit() { WDTCTL = WDTPW + WDTHOLD; P8DIR|=BIT1+BIT2; P8OUT|=BIT1+BIT2; P1DIR|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5; P1OUT|=BIT0+BIT1+BIT2+BIT3+BIT4+BIT5; UCSCTL3 = SELREF_2; // Set DCO FLL reference = REFO UCSCTL4 |= SELA_2; // Set ACLK = REFO __bis_SR_register(SCG0); // Disable the FLL control loop UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx UCSCTL1 = DCORSEL_7; // Select DCO range 50MHz operation UCSCTL2 = FLLD_1 + 609; // Set DCO Multiplier for 25MHz(这里设置为20MHz适应液晶的SPI通信) // (N + 1) * FLLRef = Fdco // (762 + 1) * 32768 = 25MHz // Set FLL Div = fDCOCLK/2 __bic_SR_register(SCG0); // Enable the FLL control loop TA1CCTL0 = CCIE; // CCR0 interrupt enabled TA1CCR0 = 328-1; TA1CTL = TASSEL_1 + MC_1 + TACLR; // ACLK, upmode, clear TAR _BIS_SR(GIE); Dogs102x6_init(); Dogs102x6_clearScreen(); Dogs102x6_backlightInit(); Dogs102x6_setContrast(11); Dogs102x6_setBacklight(liang); } /* * */ void Display3x3Pixels(uchar x,uchar y,uchar mode) { 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); } /* * */ void ChangeRamBit(uchar Row,uchar Column,uchar mode) { uint tempData; tempData=(0x8000>>(Column%16)); if(mode==ON) cubeMap[Row]|=tempData; else cubeMap[Row]&=~tempData; } /* * */ uchar ReadDisplayRamBit(uchar Row,uchar Column) { uint tempData; tempData=(0x8000>>(Column%16)); if(cubeMap[Row]&tempData) return 1; else return 0; } /* * */ void showNextCube(uchar const * p,uchar x,uchar y) #define NexPoinX 27 //下一个图形显示的X坐标 #define NexPoinY 12 //下一个图形显示的Y坐标 { uchar i,j,temp; for(i=0;i<3;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 showCubeMap(void) { uchar hang,lie; for(hang=0;hang if(cubeMap[hang]!=0) //跳过某行全为零的地方 for(lie=0;lie if(cubeMap[hang]&(0x8000>>(lie%16))) Display3x3Pixels(lie,hang,ON); } } } /* * */ void createCube(void) { static uchar next=0; this.cube=next; next=randomNumber%7; //产生随机数 this.row=0; //初始行为0 this.column=6; //初始列为6 this.state=0; //初始状态为0 this.box=cube+16*this.cube; //设定方块指针起始地址 showNextCube(cube+16*next,NexPoinX,NexPoinY); //提示区显示下一个方块 timeA=0; downflag=0; } /* * */ void writeCubeToMap(uchar mode) { uchar tempData,tempRow,tempColumn,i,j,k=0; for(i=0;i<4;i++) { tempData=this.box[i]; if(tempData==0) continue; for(j=0;j<4;j++) { if(tempData&0x08) { tempRow=this.row+k; tempColumn=this.column+j; ChangeRamBit(tempRow,tempColumn,mode); Display3x3Pixels(tempColumn,tempRow,mode); } tempData<<=1; } k++; } } /* * */ uchar checkClask(void) { uchar tempData,tempRow,tempColumn,i,j,k=0; for(i=0;i<4;i++) { tempData=this.box[i]; if(tempData==0) //跳过全为零的行 continue; for(j=0;j<4;j++) { if(tempData&0x08) { tempRow=this.row+k; tempColumn=this.column+j; if ( ReadDisplayRamBit(tempRow,tempColumn) //与边上的方块接触 ||(tempRow>=MAXHANG) //到了最底部 ||(tempColumn>=MAXLIE) //到了最右边 ||(tempColumn==255) //到了最左边 ) return 1; //返回1,停止移动 } tempData<<=1; } k++; } return 0; //返回0,可以继续移动 } /* * */ void CheckMap() { uchar fullFlag=0; static uchar tempScore=0,tempSpeed=0; char i,j; for(i=MAXHANG-1;i>0;i--) { if(cubeMap[i]==0xffff) { fullFlag++; for(j=i;j>0;j--) { if(j>0) cubeMap[j]=cubeMap[j-1]; else cubeMap[j]=0; } i++; } } tempScore=Score; tempSpeed=Speed; switch(fullFlag) { case 1:Score++;break; case 2:Score+=2;break; case 3:Score+=4;break; case 4:Score+=6;break; default:break; } if(Score>99) { Speed++; if(Speed>9) Speed=1; Score=0; } if(tempScore!=Score) Number2BitDisplay(7,87,Score); if(tempSpeed!=Speed) Number2BitDisplay(6,87,Speed); if(fullFlag) { GameMapClear(); showCubeMap(); } } /* * */ void moveLeft(void) { writeCubeToMap(OFF); this.column--; if(checkClask()) this.column++; writeCubeToMap(ON); } /* * */ void moveRigh(void) { writeCubeToMap(OFF); this.column++; if(checkClask()) this.column--; writeCubeToMap(ON); } /* * */ uchar moveDown(void) { writeCubeToMap(OFF); this.row++; if(checkClask()) //到底 { this.row--; writeCubeToMap(ON); CheckMap(); //是否消行 return 1; } else { writeCubeToMap(ON); return 0; } } /* * */ void cubeRotation(void) { uchar temp; temp=this.state; writeCubeToMap(OFF); this.state=++this.state%4; this.box=cube+16*this.cube+4*this.state; if(checkClask()) { this.state=temp; this.box=cube+16*this.cube+4*this.state; } writeCubeToMap(ON); } /* * */ void TetrisGameOver() { DisplayRamClear(); GameMapClear(); Dogs102x6_stringDraw(3, 13, "GAME",ON); Dogs102x6_stringDraw(4, 13, "OVER",ON); } /* * */ void TetrisGame() { Key=0; buttonsPressed = 0; Gameover=0; temp=0; while (!(buttonsPressed & BUTTON_S2)) { static uchar Flag=0; if(Flag==0) { createCube(); if(checkClask()) { TetrisGameOver(); delay_ms(100); GameMapClear(); Gameover=1; break; } else writeCubeToMap(ON); Flag=1; } temp=Key; switch(temp) { case 1:cubeRotation(); break; case 2:while(moveDown()==0);Flag=0; break; case 3:moveLeft(); break; case 4:moveRigh(); break; default: break; } Key=0; temp=0; if(downflag&&Flag) { downflag=0; if(moveDown()) { Flag=0; } } } } |
|
相关推荐
9个回答
|
|
好厉害,大神,能教教我用MSP430F5529怎么让LCD1602显示字符吗?我写的程序感觉没有问题,但是液晶屏就是不显示,单步调试,发现写数据时在检查忙那里一直循环,可是写命令时检查忙就很正常,求教这是怎么回事
|
|
|
|
好可爱的小多C 发表于 2016-5-25 23:03 12864与1602写程序都是相似的 都是从51的移植过来的 现在为了方便都是用12864串行显示 |
|
|
|
我写的那个程序也是从51单片机上移植过来的,而且在51上成功的显示了,但是移植过来之后就显示不了了,我也不知道是哪里出了问题 |
|
|
|
延时和时钟配置
|
|
|
|
楼主,您的问题解决了吗?我也想看看5529的贪吃蛇的程序
|
|
|
|
|
|
|
|
楼主的问题解决了吗?求分享~
|
|
|
|
louzhuwentijiejulma fenxiang
|
|
|
|
楼主,解决后,分享一下经验哦
|
|
|
|
只有小组成员才能发言,加入小组>>
3057个成员聚集在这个小组
加入小组2989 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3715 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2367 浏览 1 评论
4835 浏览 1 评论
2595 浏览 1 评论
1636浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3717浏览 2评论
2989浏览 1评论
1828浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 03:34 , Processed in 1.402324 second(s), Total 62, Slave 56 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号