- #include<reg52.h>
- #include<intrins.h> //循環右移頭文件
- #include<stdio.h>
- sbit DU = P2^6;//數碼管段選
- sbit WE = P2^7;//數碼管段選
- sbit DIO = P3^4;//串行數據輸入口
- sbit S_CLK = P3^5;//移位寄存器時鐘
- sbit R_CLK = P3^6;//輸入鎖存器時鐘
- unsigned char KeyValue = 20;//矩陣按鍵
- unsigned char Transit;//按鍵值的中轉數
- unsigned char i,
- j,
- k,
- w, //蛇身長度
- s,
- St, //開始間隔時間
- Mi, //移動間隔時間
- ROW,//行值
- COL,//列值
- x, //移動方向
- w; //蛇身長度
- //蛇身數組,a[][0]為行值,a[][1]為列值
- unsigned char Snake_body[2][36] =
- {
- {0x08,0x08},
- {0xdf,0xbf}
- };
- //顯示數組
- unsigned char b[8] = {0xff,0xff,0xff,0xff,0xcf,0xff,0xff,0xff};
- //蛇頭緩存數組,c[0]放置行值,c[1]放置列值
- unsigned char c[2] = {0x80,0xdf};
- //開始顯示字符
- unsigned char code Start[5][8]=
- {
- 0xE7,0xC7,0x87,0xE7,0xE7,0xE7,0x81,0x81,//1
- 0xC3,0x81,0x99,0xF1,0xE3,0xC7,0x81,0x81,//2
- 0xC3,0x81,0x99,0xE3,0xE3,0x99,0x81,0xC3,//3
- 0xFF,0xFF,0xE7,0xC3,0x00,0xC3,0xE7,0xFF,
- 0xFF,0xFF,0xDF,0xB8,0x38,0xB8,0xDF,0xFF
- };
- //結束顯示字符
- unsigned char code End[2][8]=
- {
- 0xFF,0xFF,0xDF,0xB8,0x38,0xB8,0xDF,0xFF,//第一步
- 0xFF,0xFF,0xE7,0xC3,0x00,0xC3,0xE7,0xFF//第二步
- };
- void delay(unsigned int z) //毫秒級延時函數
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=114;y>0;y--);
- }
- //顯示部分01
- void send(dat)//發送值
- {
- S_CLK = 0;//拉低移位寄存器時鐘
- R_CLK = 0;//拉低輸入鎖存器時鐘
- for(i=0; i>8; i++)//8位循環
- {
- if(dat&0x01)
- DIO = 1;//發送1
- else
- DIO = 0;//發送0
- R_CLK = 1;//拉高輸入鎖存器時鐘
- dat >>= 1;//右移1位
- R_CLK = 0;//拉低輸入鎖存器時鐘
- }
- }
- //矩陣鍵盤
- void KeyScan()
- {
- //4*4矩陣鍵盤掃描
- P3 = 0XF0;//列掃描
- if(P3 != 0XF0)//判斷按鍵是否被按下
- {
- delay(10);//軟件消抖10ms
- if(P3 != 0XF0)//判斷按鍵是否被按下
- {
- switch(P3) //判斷那一列被按下
- {
- case 0xe0: KeyValue = 0; break;//第一列被按下
- case 0xd0: KeyValue = 1; break;//第二列被按下
- case 0xb0: KeyValue = 2; break;//第三列被按下
- case 0x70: KeyValue = 3; break;//第四列被按下
- }
- P3 = 0X0F;//行掃描
- switch(P3) //判斷那一行被按下
- {
- case 0x0e: KeyValue = KeyValue; break;//第一行被按下
- case 0x0d: KeyValue = KeyValue + 4; break;//第二行被按下
- case 0x0b: KeyValue = KeyValue + 8; break;//第三行被按下
- case 0x07: KeyValue = KeyValue + 12; break;//第四行被按下
- }
- while(P3 != 0X0F);//松手檢測
- }
- if(KeyValue == 1 )
- {
- Transit = KeyValue;
- }
- if(KeyValue == 4 )
- {
- Transit = KeyValue;
- }
- if(KeyValue == 5 )
- {
- Transit = KeyValue;
- }
- if(KeyValue == 6 )
- {
- Transit = KeyValue;
- }
- KeyValue = 0;
- }
- }
- void main()
- {
- for(St=0; St<500; St++)//開始顯示開始畫面
- {
- for(k=0; k<2; k++)
- {
- for(i=0; i<8; i++)
- {
- send(Start[k][i]);
- send(ROW);
- S_CLK = 1;
- S_CLK = 0;
- ROW = _cror_(ROW,1);
- }
- }
- delay(1);
- }
- while(1)//總體循環
- {
- //運動算法開始
- //存放上一次頭部坐標
- for(i=0; i<2; i++)
- {
- c[i] = Snake_body[0][i];
- }
-
- //蛇身長度檢測
- for(i=0; i<64; i++)
- {
- if(Snake_body[0][i] != 0x00)
- {
- w++;
- }
- }
-
- //蛇身數據右移
- //消去蛇身尾端的點
- w--;
- for(s=0; s<2; s++)
- {
- for(i=0; i<w; i++)
- {
- Snake_body[s][i+1] = Snake_body[s][i];
- }
- }
-
-
- //轉向
- if(Transit == 6)//向右
- {
- c[1] >>= 1;
- c[1] = c[1] + 0x80;
-
- }
- if(Transit == 4)//向左
- {
- c[1] <<= 1;
- c[1] = c[1] + 0x01;
-
- }
- if(Transit == 5)//向下
- {
- c[0] <<= 1;
- c[0] = c[0] + 0x01;
-
- }
- if(Transit == 1)//向上
- {
- c[0] >>= 1;
- c[0] = c[0] + 0x80;
-
- }
-
-
- //新頭部坐標存入蛇身數組
- for(i=0; i<2; i++)
- {
- Snake_body[0][i] = c[i];
- }
- //運動算法結束
- //蛇身長度檢測
- for(i=0; i<64; i++)
- {
- if(Snake_body[1][i] != 0x00)
- {
- w++;
- }
- }
- //顯示部分02
- for(j=0; j<w; j++) //循環8次發送行和列值
- {
- Send_Byte(Snake_body[1][k]);//發送列選值
- Send_Byte(Snake_body[0][k]); //發送行選值
- R_CLK = 1; //拉高輸出鎖存器,把移位寄存器中數據輸出
- R_CLK = 0; //拉低輸出鎖存器
- }
- }
- }
復制代碼 |