樓主的代碼:- #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(); // 判斷是否成長
- }
- }
復制代碼 |