#include " reg51 . h "
#include < intrins . h >
#include < stdlib . h >
typedef unsigned int u16;
typedef unsigned char u8;
sbit up = P3 ^ 0;
sbit down = P3 ^ 1;
sbit right = P3 ^ 2;
sbit left = P3 ^ 3;
sbit SRCLK = P3 ^ 6;
sbit RCLK = P3 ^ 5;
sbit SER = P3 ^ 4;
sbit LSA = P 2 ^ 2;
sbit LSB = P 2 ^ 3;
sbit LSC = P 2 ^ 4;
u8 X [ 20 ];
u8 Y [ 20 ]; / / 蛇身的行列坐标;
u8 k , n , i; / / 分别为死亡标志,蛇身长度,通用变量;
u16 s [ 7 ];
u8 addx , addy ; / / 行偏移量,列偏移量;
u8 ledduan [ ] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
/ / 列选码表;
u8 ledwei [ ] ={ 0x7f, 0xbf, 0xdf, 0xef, 0xf7, 0xfb, 0xfd, 0xfe};
/ / 行选码表;
u8 code smgduan [ 10 ] = { 0x3f , 0x06 , 0x5b , 0x4f , 0x66 ,
0x6d , 0x7d , 0x07 , 0x7f , 0x6f };
/ / 七段码码表;
void delay ( u16 i )
/ / 延迟函数;
{
}
while (i- - );
void knock ( )
/ / 碰撞死亡函数;
{
}
k = 0; / / 活着;
if ( X[1] > 7 | | Y [1] > 7 )
k = 1;
/ / 撞墙死亡;
for ( i = 2; i< = n;i + + )
if ( X[1] = = X [i] && Y [1]= =Y [i] )
k = 1; / /撞自己死亡;
void Hc595SendByte ( u8 dat )
/ / 向 74HC595 发送一个字
节的数据;
{
u8 a;
SRCLK = 0;
RCLK = 0;
for (a = 0;a < 8;a + + )
{
SER = dat >>7;
dat << = 1;
SRCLK = 1;
_nop_ ( );
_nop_ ( );
SRCLK = 0;
}
RCLK = 1;
_nop_( );
_nop_( );
RCLK = 0;
}
void turnkey( )
/ / 按键转向;
{
if (left = = 0)
{
delay ( 100 ); / / 延时消抖;
if ( left = =0 ) { addy = 0; if ( addx ! = 1 ) addx = -1;else
addx = 1;}}
if ( right = = 0)
{
delay ( 100 );
if ( right = = 0 ) { addy = 0;if ( addx ! = -1 ) addx = 1;else
addx = -1;} }
if ( up = = 0 )
{
delay ( 100 ) ;
if ( up = = 0 ) { addx = 0;if ( addy ! = -1 ) addy = 1;else addy
= -1;} }
if ( down = = 0 )
{
delay ( 100 ) ;
if ( down = = 0 ) { addx = 0;if ( addy ! = 1 ) addy = -1;else
addy = 1;} }
}
void Disp ( )
/ / 显示子程序;
{for ( i = 0;i < = n;i + + )
{
P0 =ledwei [ X [ i ] ];
Hc595SendByte ( ledduan [ Y [ i ] ] ) ;
delay ( 1 0 0 ) ;
Hc595SendByte ( 0 x 0 0 ) ; / / 消隐;
}
}
void smgdisp ( )
{
for ( i = 0 ; i < 8 ; i + + )
{
switch ( i )
{
case ( 0 ) :
LSA = 1 ; LSB = 0 ; LSC = 0 ; break ;
case ( 1 ) :
LSA = 0 ; LSB = 1 ; LSC = 0 ; break ;
case ( 2 ) :
LSA = 0 ; LSB = 1 ; LSC = 0 ; break ;
case ( 3 ) :
LSA = 1 ; LSB = 1 ; LSC = 0 ; break ;
case ( 4 ) :
LSA = 0 ; LSB = 0 ; LSC = 1 ; break ;
case ( 5 ):
LSA = 1 ; LSB = 0 ; LSC = 1 ; break ;
case ( 6 ) :
LSA = 0 ; LSB = 1 ; LSC = 1 ; break ;
case ( 7 ):
LSA = 1 ; LSB = 1 ; LSC = 1 ; break ;
}
P0 = smgduan [ s [ i ] ] ;
delay ( 100 ) ;
P0 = 0x00 ;
}
}
void createfood ( )
/ / 产生食物子函数;
X [ 0 ] = rand ( ) % 8 ;
Y [ 0 ] = rand ( ) % 8 ;
{
}
void snake_init ( )
/ / 贪吃蛇初始化;
{
n = 3 ;
/ / 初始化蛇身长度;
for ( i = 1 ;i < = n ;i + + )
{
X [ i ] = 1 ;
Y [ i ] = 1 + i ;
}
/ / 初始化蛇身位置;
addx = 0;addy = -1; / / 初始化蛇运动方向;
createfood( );
/ / 产生食物;
for ( i = 1;i < = n;i + +)
{if ( X [ 0 ] = = X [ i ] & &Y [ 0 ] = =Y [ i ] )
/ / 若与蛇身重合,重新产生食物;
createfood ( );
}
}
void snake_run ( )
{
for (i = n;i > 1;i - -)
/ / 蛇的移动函数;
{X [ i ] =X [ i - 1 ];
Y [ i ] = Y [ i - 1 ];
}
/ / 蛇尾向蛇头移动;
X [ 1 ] = X [ 1 ] + addx;
Y [ 1 ] = Y [ 1 ] + addy; / / 重新获得蛇头坐标;
if ( X [ 1 ] = = X [ 0 ] & & Y [ 1 ] = = Y [ 0 ] )
{ n + +;
s [ 0 ] = ( n - 3 ) % 10 ;
s [ 2 ] = ( n - 3 ) / 10 ;
X [ n ] = X [ n -1 ] + addx;
Y [ n ] = Y [ n - 1 ] + addy;
createfood ( );
for ( i = 1;i < = n;i + + )
{ if ( X [ 0 ] = = X [ i ] & & Y [ 0 ] = = Y [ i ] )
createfood ( );
}
}
}
/ / 食物被吃,产生食物;
void Timer0Init ( )
/ / 初始化定时器 0;
{
}
TMOD | = 0X01;
TH0 = 0XFC; / / 定时 1ms;
TL0 = 0X18;
ET0 = 1;
EA = 1;
TR0 = 1;
void main ( )
{
snake_init ( );
Timer0Init ( );