楼主的代码:- #include "reg52.h"
- #include "stdlib.h"
- #include "intrins.h"
- #include "12.h"
- typedef unsigned char u8;
- typedef unsigned int u16;
- //*******函数声明***********//
- void T0_Init(void); // 定时器初始化函数
- void snake_Move(void); // 蛇前行函数
- void delay(u16 i);
- // 软件延时函数,不精确
- void creatFood(); // 创建食物
- void snake_Grow(void); // 蛇成长函数
- void Send_Byte(u8 dat); // 595发送数据函数
- void JudgeDeath(void); // 判断是否死亡函数
- void TurnDirection(void);
- // 改变方向函数
- /*sbit UP = P3 ^ 1;
- sbit DOWN = P3 ^ 0;
- sbit LEFT = P3 ^ 2;
- sbit RIGHT = P3 ^ 3;*/
- sbit LEDARRAY_LAT = P3^6;
- sbit LEDARRAY_CLK = P3^5;
- sbit LEDARRAY_DI = P3^4;
- sbit sw=P1^2;
- u16 i,j,n,temp,w,heng,shu;
- unsigned char code Display_word[5][8] = {
- 0x0C,0x1E,0x3E,0x7C,0x7C,0x3E,0x1E,0x0C, //心
- 0x18,0x3C,0x7C,0xF8,0xF8,0x7C,0x3C,0x18,//心
- 0x00,0x44,0x86,0x92,0x92,0x9E,0x6C,0x00,//3
- 0x00,0xC4,0xC6,0xA2,0xA2,0x92,0x8C,0x00,//2
- 0x00,0x80,0x82,0xFF,0xFF,0x80,0x80,0x00,//1
- };
- //画桃心的码表
- unsigned char code Display_xin[16][8] = {
- 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,//未命名文件0
- 0x00,0x00,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
- 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
- 0x04,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
- 0x0C,0x02,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
- 0x0C,0x12,0x02,0x04,0x00,0x00,0x00,0x00,//未命名文件0
- 0x0C,0x12,0x22,0x04,0x00,0x00,0x00,0x00,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x00,0x00,0x00,0x00,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x40,0x00,0x00,0x00,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x40,0x20,0x00,0x00,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x00,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x08,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x40,0x20,0x10,0x0C,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x40,0x20,0x12,0x0C,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x40,0x22,0x12,0x0C,//未命名文件0
- 0x0C,0x12,0x22,0x44,0x44,0x22,0x12,0x0C,//未命名文件0
- };
- u8 count; // 移动速度
- u8 foodx,foody; // 食物坐标
- u8 snake_Len=4; // 蛇的总长度
- u8 direction=1;
- // 蛇的移动方向 1, 向上;2, 向下;3, 向左; 4, 向右
- // 设置开发板上8*8点阵 右下角为坐标原点
- // 向上为Y轴,向左为X轴
- u8 code Hc595_Coordx[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- // 0111 1111
- u8 code Hc595_Coordy[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
- // 1000 0000
- ///////////////////////////////////////////////////////////
- // 51内核单片机内存较小,蛇的总长度暂定最大40
- // 可予以忽略,重点是效果
- // 初始化蛇长为4,如下数组中定义
- u8 snake_Coordx[40]= {1, 1, 1, 1}; // 蛇的每一点的横坐标
- u8 snake_Coordy[40]= {3, 2, 1, 0}; // 蛇的每一点的纵坐标
- /*******************************************************************************
- * 函 数 名 : T0_Init(void)
- * 函数功能 : 定时器T0初始化函数
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void T0_Init(void)
- {
- TMOD = 0X01;
- TL0 = (65535-50000)%256;
- TH0 = (65535-50000)/256;
- ET0 = 1;
- TR0 = 1;
- EA = 1;
- }
- /*******************************************************************************
- * 函 数 名 : interrupt_T0(void)
- * 函数功能 : 定时器T0中断服务函数
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void interrupt_T0() interrupt 1
- {
- TL0 = (65535-50000)%256; // 50ms定时
- TH0 = (65535-50000)/256;
- count++;
- if(count == 15) //15
- {
- count = 0;
- snake_Move();
- }
- }
- /*******************************************************************************
- * 函 数 名 : delay(u16 i)
- * 函数功能 : 软件延时函数
- * 输 入 : u16 i
- * 输 出 : None
- * 相关说明 :软件延时,不精确
- *******************************************************************************/
- void delay (u16 i)
- {
- while(i--);
- }
- void Send_Byte(u8 dat)
- {
- unsigned char i;
- LEDARRAY_CLK = 0;
- _nop_();
- LEDARRAY_LAT = 0;
- _nop_();
- for( i = 0 ; i < 8 ; i++ )
- {
- if( dat&0x01 )
- {
- LEDARRAY_DI = 1;
- }
- else
- {
- LEDARRAY_DI = 0;
- }
-
- LEDARRAY_CLK = 1; //上升沿发送数据
- // _nop_();
- LEDARRAY_CLK = 0;
- // _nop_();
-
- dat >>= 1;
- }
- }
-
- void xin(void)
- {
-
- for(j = 0 ; j < 16 ; j++)
- {
- for(i = 0 ; i < 10 ; i++)
- {
- temp = 0x7f;
- for(w = 0 ; w < 8 ; w++) //一个字母8BYTE
- {
- Send_Byte(temp); //列选择
- Send_Byte(Display_xin[j][w]); //行数据
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
- LEDARRAY_LAT = 0;
- _nop_();
- temp = (temp>>1)|0x80;
- }
- }
- }
- while(1)
- {
- //H心
- for(i = 0 ; i < 900 ; i++)
- {
- temp = 0x7f;
- for(w = 0 ; w < 8 ; w++) //一个字母8BYTE
- {
- Send_Byte(temp); //列选择
- Send_Byte(Display_word[0][w]); //行数据
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- temp = (temp>>1)|0x80;
- }
- }
- //L心
- for(i = 0 ; i < 400 ; i++)
- {
- temp = 0x7f;
- for(w = 0 ; w < 8 ; w++) //一个字母8BYTE
- {
- Send_Byte(temp); //列选择
- Send_Byte(Display_word[1][w]); //行数据
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- temp = (temp>>1)|0x80;
- }
- }
-
- }}
- /*******************************************************************************
- * 函 数 名 : snake_Move(void)
- * 函数功能 : 蛇前进函数
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void snake_Move(void)
- {
- u8 len = snake_Len - 1;
- for(len; len > 0; len--)
- {
- snake_Coordx[len] = snake_Coordx[len - 1];
- snake_Coordy[len] = snake_Coordy[len - 1];
- }
- switch(direction)
- {
- case 1:
- snake_Coordy[0]++;
- break;
- case 2:
- snake_Coordy[0]--;
- break;
- case 3:
- snake_Coordx[0]++;
- break;
- case 4:
- snake_Coordx[0]--;
- break;
- default:
- break;
- }
- }
- /*******************************************************************************
- * 函 数 名 : Hc595SendByte(u8 dat)
- * 函数功能 : 74HC595发送数据函数
- * 输 入 : dat 8位数据
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void Clear_LEDmatrix()
- {
- char i,temp;
- temp = 0x7f;
- for(i = 0 ; i < 8 ; i++) //一个字母8BYTE
- {
- Send_Byte(temp); //列选择
- Send_Byte(0); //行数据
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- temp = (temp>>1)|0x80;
- }
- }
- /*******************************************************************************
- * 函 数 名 : creatFood()
- * 函数功能 : 创建食物函数
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void creatFood()
- {
- u8 i;
- foodx=rand()%8;
- foody=rand()%8;
-
-
-
- for(i=0; i<snake_Len; i++)
- {
- if((foodx==snake_Coordx[i])&&(foody==snake_Coordy[i]))
- {
- creatFood();
- }
- }
- }
- /*******************************************************************************
- * 函 数 名 : JudgeDeath()
- * 函数功能 : 判断死亡函数
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void JudgeDeath(void)
- {
- u8 i;
- // 判断蛇撞墙死亡
- if((snake_Coordx[0]>7)||(snake_Coordy[0]>7))
- {
- xin();
- }
- // 判断蛇撞到自身死亡
- for(i=4; i<snake_Len; i++)
- {
- if((snake_Coordx[0]==snake_Coordx[i])&&(snake_Coordy[0]==snake_Coordy[i]))
- {
- xin();
- }
- }
- }
- /*******************************************************************************
- * 函 数 名 : void TurnDirection(void)
- * 函数功能 : 方向改变函数
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void TurnDirection(void)
- {
- initadc();
- //inituart();
- heng=getadcresult(0);
- shu=getadcresult(1);
- if(shu<70)
- {
- if(direction==3||direction==4)
- {
- direction=2;
- }
- }
-
-
- if(shu>225)
- {
- if(direction==3||direction==4)
- {
- direction=1;
- }
- }
-
-
- if(heng>225)
- {
- if(direction==1||direction==2)
- {
- direction=3;
- }
- }
-
-
- if(heng<70)
- {
- if(direction==1||direction==2)
- {
- direction=4;
- }
- }
-
- }
- /*******************************************************************************
- * 函 数 名 : void snake_Grow(void)
- * 函数功能 : 蛇成长函数
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void snake_Grow(void)
- {
- if(snake_Coordx[0] == foodx && snake_Coordy[0] == foody)
- {
- creatFood();
- snake_Coordx[snake_Len] = snake_Coordx[snake_Len - 1];
- snake_Coordy[snake_Len] = snake_Coordy[snake_Len - 1];
- snake_Len++;
- }
- }
-
- /*******************************************************************************
- * 函 数 名 : main(void)
- * 函数功能 : 主程序
- * 输 入 : None
- * 输 出 : None
- * 相关说明 :None
- *******************************************************************************/
- void main()
- {
- u16 q,k;
- Clear_LEDmatrix();
- for(q = 0 ; q < 2000 ; q++)
- {
- temp = 0x7f;
- for(k = 0 ; k < 8 ; k++) //一个字母8BYTE
- {
- Send_Byte(temp); //列选择
- Send_Byte(Display_word[2][k]); //行数据
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- temp = (temp>>1)|0x80;
- }
- }
- //2
- for(q = 0 ; q < 2000 ; q++)
- {
- temp = 0x7f;
- for(k = 0 ; k < 8 ; k++) //一个字母8BYTE
- {
- Send_Byte(temp); //列选择
- Send_Byte(Display_word[3][k]); //行数据
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- temp = (temp>>1)|0x80;
- }
- }
- //1
- for(q = 0 ; q < 2000 ; q++)
- {
- temp = 0x7f;
- for(k = 0 ; k < 8 ; k++) //一个字母8BYTE
- {
- Send_Byte(temp); //列选择
- Send_Byte(Display_word[4][k]); //行数据
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- temp = (temp>>1)|0x80;
- }
- }
- Clear_LEDmatrix();
- T0_Init();
- creatFood();
- while(1)
- {
- if(sw==0)
- {
- for(i=10;i>0;i--)
- for(j=110;j>0;j--);
- if(sw==0)
- TR0=~TR0;
- while(!sw);
- }
- for(i=0; i<snake_Len; i++)
- {
- // 在点阵屏幕上显示蛇的位置
- Send_Byte(Hc595_Coordx[snake_Coordx[i]]);
- Send_Byte(Hc595_Coordy[snake_Coordy[i]]);
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- }
- delay(20);
- Send_Byte(Hc595_Coordx[foodx]);
- Send_Byte(Hc595_Coordy[foody]);
- LEDARRAY_LAT = 1; //锁存数据
- _nop_();
-
- LEDARRAY_LAT = 0;
- _nop_();
- delay(20);
-
-
-
- TurnDirection(); // 是否改变方向
- JudgeDeath(); // 判断是否死亡
- snake_Grow(); // 判断是否成长
- }
- }
复制代码 |