- #include<reg52.h>
- #include<intrins.h> //循環(huán)右移頭文件
- #include<stdio.h>
- sbit DU = P2^6;//數(shù)碼管段選
- sbit WE = P2^7;//數(shù)碼管段選
- sbit DIO = P3^4;//串行數(shù)據(jù)輸入口
- sbit S_CLK = P3^5;//移位寄存器時(shí)鐘
- sbit R_CLK = P3^6;//輸入鎖存器時(shí)鐘
- unsigned char KeyValue = 20;//矩陣按鍵
- unsigned char Transit;//按鍵值的中轉(zhuǎn)數(shù)
- unsigned char i,
- j,
- k,
- w, //蛇身長(zhǎng)度
- s,
- St, //開(kāi)始間隔時(shí)間
- Mi, //移動(dòng)間隔時(shí)間
- ROW,//行值
- COL,//列值
- x, //移動(dòng)方向
- w; //蛇身長(zhǎng)度
- //蛇身數(shù)組,a[][0]為行值,a[][1]為列值
- unsigned char Snake_body[2][36] =
- {
- {0x08,0x08},
- {0xdf,0xbf}
- };
- //顯示數(shù)組
- unsigned char b[8] = {0xff,0xff,0xff,0xff,0xcf,0xff,0xff,0xff};
- //蛇頭緩存數(shù)組,c[0]放置行值,c[1]放置列值
- unsigned char c[2] = {0x80,0xdf};
- //開(kāi)始顯示字符
- 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
- };
- //結(jié)束顯示字符
- 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) //毫秒級(jí)延時(shí)函數(shù)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=114;y>0;y--);
- }
- //顯示部分01
- void send(dat)//發(fā)送值
- {
- S_CLK = 0;//拉低移位寄存器時(shí)鐘
- R_CLK = 0;//拉低輸入鎖存器時(shí)鐘
- for(i=0; i>8; i++)//8位循環(huán)
- {
- if(dat&0x01)
- DIO = 1;//發(fā)送1
- else
- DIO = 0;//發(fā)送0
- R_CLK = 1;//拉高輸入鎖存器時(shí)鐘
- dat >>= 1;//右移1位
- R_CLK = 0;//拉低輸入鎖存器時(shí)鐘
- }
- }
- //矩陣鍵盤(pán)
- void KeyScan()
- {
- //4*4矩陣鍵盤(pán)掃描
- 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);//松手檢測(cè)
- }
- 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++)//開(kāi)始顯示開(kāi)始畫(huà)面
- {
- 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)//總體循環(huán)
- {
- //運(yùn)動(dòng)算法開(kāi)始
- //存放上一次頭部坐標(biāo)
- for(i=0; i<2; i++)
- {
- c[i] = Snake_body[0][i];
- }
-
- //蛇身長(zhǎng)度檢測(cè)
- for(i=0; i<64; i++)
- {
- if(Snake_body[0][i] != 0x00)
- {
- w++;
- }
- }
-
- //蛇身數(shù)據(jù)右移
- //消去蛇身尾端的點(diǎn)
- w--;
- for(s=0; s<2; s++)
- {
- for(i=0; i<w; i++)
- {
- Snake_body[s][i+1] = Snake_body[s][i];
- }
- }
-
-
- //轉(zhuǎn)向
- 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;
-
- }
-
-
- //新頭部坐標(biāo)存入蛇身數(shù)組
- for(i=0; i<2; i++)
- {
- Snake_body[0][i] = c[i];
- }
- //運(yùn)動(dòng)算法結(jié)束
- //蛇身長(zhǎng)度檢測(cè)
- for(i=0; i<64; i++)
- {
- if(Snake_body[1][i] != 0x00)
- {
- w++;
- }
- }
- //顯示部分02
- for(j=0; j<w; j++) //循環(huán)8次發(fā)送行和列值
- {
- Send_Byte(Snake_body[1][k]);//發(fā)送列選值
- Send_Byte(Snake_body[0][k]); //發(fā)送行選值
- R_CLK = 1; //拉高輸出鎖存器,把移位寄存器中數(shù)據(jù)輸出
- R_CLK = 0; //拉低輸出鎖存器
- }
- }
- }
復(fù)制代碼 |