- #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; //拉低输出锁存器
- }
- }
- }
复制代码 |