內附LCD12864子函数
单片机源程序如下:
- #include<reg52.h>
- #include<stdlib.h>
- #include<lcd12864.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define Random(x) (rand()%x)
- #define dgrade 11
- #define igrade 15
- #define up 9
- #define down 13
- #define left 12
- #define right 14
- #define passscore 50
- #define N 25
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
- sbit dula=P2^6;
- sbit wela=P2^7;
- uchar code score0[]={"score"};
- uchar code speed0[]={"speed"};
- uchar score = 0,speed = 5;
- uchar temp,key=16;
- struct Snake
- {
- uchar x[N];
- uchar y[N];
- uchar node;
- uchar direction;
- uchar life;
- }snake;
- struct Food
- {
- uchar x;
- uchar y;
- uint exist;
- }food;
- void delay(uint t)
- {
- uint i,j;
- for(i=0;i<t;i++)
- for(j=0;j<10;j++);
- }
- //矩阵键盘
- void ReadKey()
- {
- P3 = 0xfe;
- temp = P3;
- temp = temp & 0xf0;
- if(temp != 0xf0)
- {
- delay(100);
- if(temp != 0xf0)
- {
- temp = P3;
- switch(temp)
- {
- case 0xee:
- key = 0;
- break;
- case 0xde:
- key = 1;
- break;
- case 0xbe:
- key = 2;
- break;
- case 0x7e:
- key = 3;
- break;
- }
- while(temp != 0xf0)
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- }
- }
- P3 = 0xfd;
- temp = P3;
- temp = temp & 0xf0;
- if(temp != 0xf0)
- {
- delay(100);
- if(temp != 0xf0)
- {
- temp = P3;
- switch(temp)
- {
- case 0xed:
- key = 4;
- break;
- case 0xdd:
- key = 5;
- break;
- case 0xbd:
- key = 6;
- break;
- case 0x7d:
- key = 7;
- break;
- }
- while(temp != 0xf0)
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- }
- }
- P3 = 0xfb;
- temp = P3;
- temp = temp & 0xf0;
- if(temp != 0xf0)
- {
- delay(100);
- if(temp != 0xf0)
- {
- temp = P3;
- switch(temp)
- {
- case 0xeb:
- key = 8;
- break;
- case 0xdb:
- key = 9;
- break;
- case 0xbb:
- key = 10;
- break;
- case 0x7b:
- key = 11;
- break;
- }
- while(temp != 0xf0)
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- }
- }
- P3 = 0xf7;
- temp = P3;
- temp = temp & 0xf0;
- if(temp != 0xf0)
- {
- delay(100);
- if(temp != 0xf0)
- {
- temp = P3;
- switch(temp)
- {
- case 0xe7:
- key = 12;
- break;
- case 0xd7:
- key = 13;
- break;
- case 0xb7:
- key = 14;
- break;
- case 0x77:
- key = 15;
- break;
- }
- while(temp != 0xf0)
- {
- temp = P3;
- temp = temp & 0xf0;
- }
- }
- }
- }
- void Lcd_DisNode(uchar x,uchar y,uchar color)
- {
- Lcd_DisRectangle(2*x,2*y,2*x+1,2*y+1,color);
- }
- void Timer0_Init()
- {
- TMOD = 0x01;
- TH0 = (65536-1000)/256;
- TL0 = (65536-1000)%256;
- TR0 = 1;
- ET0 = 1;
- EA = 1;
- }
- //创建基本框架
- void CreatBasicFrame()
- {
- uchar n;
- for(n=0;n<128;n++)
- {
- Lcd_DisDot(n,0,1);
- Lcd_DisDot(n,1,1);
- Lcd_DisDot(n,62,1);
- Lcd_DisDot(n,63,1);
- }
- for(n=0;n<63;n++)
- {
- Lcd_DisDot(0,n,1);
- Lcd_DisDot(1,n,1);
- Lcd_DisDot(78,n,1);
- Lcd_DisDot(79,n,1);
- Lcd_DisDot(126,n,1);
- Lcd_DisDot(127,n,1);
- }
- }
- //显示成绩
- void DisScore()
- {
- uchar str[3];
- str[0] = (score/10)|0x30;
- str[1] = (score%10)|0x30;
- str[2] = 0;
- Lcd_WriteStr(5,0,score0);
- Lcd_WriteStr(6,1,str);
- }
- //显示速度
- void DisSpeed()
- {
- uchar str[3];
- str[0] = ' ';
- str[1] = speed|0x30;
- str[2] = 0;
- Lcd_WriteStr(5,2,speed0);
- Lcd_WriteStr(6,3,str);
- }
- //游戏结束
- void GameOver()
- {
- uchar n;
- Lcd_DisNode(food.x,food.y,0);
- for(n=1;n<snake.node;n++)
- {
- Lcd_DisNode(snake.x[n],snake.y[n],0);
- }
- if(snake.life==1)
- Lcd_WriteStr(1,1," PASS");
- else
- Lcd_WriteStr(1,1," LOSE");
- Lcd_WriteStr(0,2," GameOver");
- }
- void GamePlay()
- {
- uchar n;
-
- food.exist=0;
- snake.life=1;
- snake.direction=down;
- snake.x[0]=6;snake.y[0]=6;
- snake.x[1]=5;snake.y[1]=6;
- snake.x[2]=4;snake.y[2]=6;
- snake.node=3;
- DisScore();
- DisSpeed();
- while(1)
- {
- if(food.exist==0)
- {
- //产生食物
- while(1)
- {
- srand(TL0);
- food.x=Random(30);
- food.y=Random(38);
- for(n=0;n<snake.node;n++)
- {
- if((food.x==snake.x[n])&&(food.y==snake.y[n]))
- break;
- }
- if(n==snake.node)
- {
- if(food.x>0&&food.x<39&&food.y>0&&food.y<31)
- food.exist=1;
- break;
- }
- }
- }
- if(food.exist==1)
- {
- Lcd_DisNode(food.x,food.y,1);
- }
-
- for(n=snake.node-1;n>0;n--)
- {
- snake.x[n]=snake.x[n-1];
- snake.y[n]=snake.y[n-1];
- }
-
- switch(snake.direction)
- {
- case down:snake.y[0]++;break;
- case up:snake.y[0]--;break;
- case right:snake.x[0]++;break;
- case left:snake.x[0]--;break;
- default:break;
- }
- //判断是否死亡
- for(n=3;n<snake.node;n++)
- {
- if(snake.x[n]==snake.x[0]&&snake.y[n]==snake.y[0])
- {
- GameOver();
- snake.life=0;
- break;
- }
- }
- if(snake.x[0]<1||snake.x[0]>38||snake.y[0]<1||snake.y[0]>30)
- {
- GameOver();
- snake.life=0;
- }
- if(snake.life==0)
- break;
- //判断是否吃到食物
- if(snake.x[0]==food.x&&snake.y[0]==food.y)
- {
- Lcd_DisNode(food.x,food.y,0);
- snake.x[snake.node]=200;
- snake.y[snake.node]=200;
- snake.node++;
- food.exist=0;
- score=score+speed;
- if(score>=passscore)
- {
- DisScore();
- GameOver();
- break;
- }
- DisScore();
- }
-
- //画出蛇身
- for(n=0;n<snake.node;n++)
- {
- Lcd_DisNode(snake.x[n],snake.y[n],1);
- }
-
- delay((10-speed)*300);
- delay((10-speed)*300);
- Lcd_DisNode(snake.x[snake.node-1],snake.y[snake.node-1],0);
- switch(key)
- {
- case dgrade:
- key=0;
- if(--speed<=0)
- speed=9;
- DisScore();
- DisSpeed();
- break;
- case igrade:
- key=0;
- if(++speed>=10)
- speed=1;
- DisScore();
- DisSpeed();
- break;
- case down:
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
贪吃蛇.rar
(4.66 KB, 下载次数: 48)
|