logo资料库

基于51单片机的点阵贪吃蛇.docx

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
#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 ( );
分享到:
收藏