求单片机学习板上贪吃蛇c 源代码
1个回答
展开全部
/***********************************************************************************
/* 文件名称: SNAKE.c
/* 功 能: 贪吃蛇游戏代码
/* 署 名: 张先永(原作者)
/* 时 间: 2009年10月11日
/* 备 注:
/* 游戏按键由于需要快速的响应,所有按键通过线与扩展为中断按键
/* LCD 液晶显示器在PO口 需要上拉电阻
/***********************************************************************************/
#include <reg52.H>
#include <KEY_SWEEP.H>
#include"9325tp.h"
#include "SNAKE.h"
#define uchar unsigned char
//=================================================================
// 使用结构体定义变量 使程序的名称更加的清楚
//=================================================================
struct
{
uchar X;
uchar Y;
uchar Yes;
}Food; //食物结构体
#define SNAKE_Max_Long 20 //最大长度
struct
{
uchar X[SNAKE_Max_Long];
uchar Y[SNAKE_Max_Long];
uchar Long;
uchar Life;
uchar Score; //蛇的分数
uchar Level; //蛇的等级
}Snake; //蛇结构体
uchar Key_V_temp=0; //取出上次按键值
//=================================================================
//函数功能:1ms延时函数
//晶 振:11.0592 M
//入口参数:n
//出口参数:无
//=================================================================
void Delay_1mS(unsigned int n)
{
unsigned int i;
unsigned char j;
for(i=0;i<n;i++)
for(j=0;j<120;j++) ;
}
//=================================================================
//函数名称:void Init_time0 (void)
//函数功能:初始化定时器1 用于产生随机数种子 ,用于放置实物
//入口参数:无
//出口参数:无
//=================================================================
void Init_time0 (void)
{
EA=1;
ET1=1;
TMOD|=0x10;
TH1=0X00;
TL1=0X00;
TR1=1;
}
void time1 (void) interrupt 3
{
TH1=0X00;
TL1=0X00;
}
//=================================================================
//函数名称:Trun_On_Point Trun_Off_Point (uchar x,uchar y)
//函数功能:点亮或者熄灭 一个点。用于显示蛇身体
//入口参数:无
//出口参数:无
//特别说明:此 Trun_On,函数换成其他的就可以兼容其他的液晶
// 入8*8 点阵 12864 等
//=================================================================
void Trun_On_Point (uchar x,uchar y,uchar color)
{
Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),color);
}
void Trun_Off_Point (uchar x,uchar y)
{
Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),0xBE5F);
}
//=================================================================
//函数名称:void Init_SNAKE(void)
//函数功能:绘制游戏界面,初始化游戏等级等参数
//入口参数:无
//出口参数:无
//=================================================================
void Init_SNAKE(void)
{
uchar i;
Init_time0();
//***********绘制游戏界面********************//
CLR_Screen(0xBE5F);
Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127
LCD_PutString(88,8,"Score",0x00ff,0xBE5F);
LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
LCD_PutString(88,81,"LEVEL",0x00ff,0xBE5F);
LCDShow_uCharNumber(96,97,Snake.Level,0x00ff,0xBE5F);
//***********初始化蛇参数********************//
Snake.Long=2; //定义初始化蛇的长度
Snake.Life=0; //初始化蛇还活着
Snake.Score=0;
Food.Yes=1;
Key_Value=0;
Key_V_temp=0;
for(i=0;i<Snake.Long;i++) //将蛇给赋值
{
Snake.X[i]=i+2;
Snake.Y[i]=2;
}
for(i=0;i<Snake.Long;i++) //将蛇给画出来
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
}
//=================================================================
//函数名称:void Display_dead(uchar i)
//函数功能:显示死亡界面
//入口参数:无
//出口参数:无
//=================================================================
void Display_dead(void)
{
LCD_PutString(10,40,"GAME OVER",0x00ff,0xBE5F);
while(Key_Value!=Key_Enter)
{
Key();
}
Init_SNAKE();
}
//=================================================================
//函数名称:void Display_Pass(uchar i)
//函数功能:显示过关界面
//入口参数:无
//出口参数:无
//=================================================================
void Display_Pass(void)
{
Snake.Level++;
LCD_PutString(18,40,"You are",0xcc88,0xBE5F);
LCD_PutString(34,56,"WIN!",0xcc88,0xBE5F);
while(Key_Value!=Key_Enter)
{
Key();
}
Init_SNAKE();
}
//=================================================================
//函数名称:void Run_SNAKE(void)
//函数功能:蛇运动函数 (游戏精华)
//入口参数:无
//出口参数:无
//=================================================================
void Run_SNAKE(void)
{
uchar i=0;
/*********************根据按键选择蛇的运动方向*******************/
if((Key_Value==Key_Right&&Key_V_temp!=Key_Left)||(Key_Value==Key_Left&&Key_V_temp==Key_Right))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Right;
}
if((Key_Value==Key_Left&&Key_V_temp!=Key_Right)||(Key_Value==Key_Right&&Key_V_temp==Key_Left))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Left;
}
if(( Key_Value==Key_Up&&Key_V_temp!=Key_Down)||( Key_Value==Key_Down&&Key_V_temp==Key_Up))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Up;
}
if(( Key_Value==Key_Down&&Key_V_temp!=Key_Up)||( Key_Value==Key_Up&&Key_V_temp==Key_Down))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Down;
}
/****************根据按键选择蛇的运动程序结束*******************/
/////////////////////////////////////////////////////////////////
/************************判断蛇是否死亡***********************/
if(Snake.X[Snake.Long-1]>=19||Snake.Y[Snake.Long-1]>=28)//判蛇头是否撞到墙壁
{
Snake.Life=1;
}
for(i=3;i<Snake.Long;i++)//从第三节开始判断蛇头是否咬到自己
{
if(Snake.X[i]==Snake.X[0]&&Snake.Y[i]==Snake.Y[0])
{
Snake.Life=1;
}
}
if(Snake.Life==1) //if the snake over
{
Display_dead();
}
/******************判断蛇是否死亡程序结束***********************/
/////////////////////////////////////////////////////////////////
/************************判断蛇是否最长了**********************/
if(Snake.Long==SNAKE_Max_Long)
{
Display_Pass();
}
/////////////////////////////////////////////////////////////////
/*************************判蛇是否吃到食物**********************/
if(Snake.X[Snake.Long-1]==Food.X&&Snake.Y[Snake.Long-1]==Food.Y)//
{
//Trun_Off_Point(Food.X,Food.Y); //消隐食物
Snake.Long++;//蛇节数加1
Snake.X[Snake.Long-1]=Food.X;
Snake.Y[Snake.Long-1]=Food.Y;
Snake.Score+=10;
LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
Food.Yes=1; //食物标志置1
}
/////////////////////////////////////////////////////////////////
/***************************放果子程序*************************/
if(Food.Yes==0)
{
Trun_On_Point(Food.X,Food.Y,0xaa);
}
if(Food.Yes==1)
{
while(1)
{
Food.X=((TL1&0X24)>>1); //获得随机数
Food.Y=TL1&0X1B;
for(i=0;i<Snake.Long;i++) //判断产生的食物坐标是否和蛇身重合
{
if((Food.X==Snake.X[i])&&(Food.X==Snake.Y[i]))
break;
}
if(i==Snake.Long)
{
Food.Yes=0;
break; //产生有效的食物坐标
}
}
}
/////////////////////////////////////////////////////////////////
/**************************延时用于调整游戏速度************************/
Delay_1mS(300-Snake.Level*50);
/////////////////////////////////////////////////////////////////
/**************************************************************************
mini80 或者 mini80E 按键,上 s6,下 s14,左 s11, 右 s9, s4 重新开始
可以按照自己需要重新定义键盘扫描程序中的值,在key_sweep.h 中
****************************************************************************/
#include "reg52.h"
#include "KEY_SWEEP.H"
#include "SNAKE.h"
#include "9325tp.h"
//=========================================主程序========================================//
main()
{
ILI9325_Initial();
Init_SNAKE();
while(1)
{
Run_SNAKE();
Key();
}
}
#include <reg52.h>
#include <KEY_SWEEP.H>
unsigned char Key_Value=0;
unsigned char Key_flag =0;
/*
void Interrupt0_Key (void)
{
IT0=1; //设置下降沿中触发
EA=1; //开总中断
EX0=1; //开外部中断
Key_Port=0X0f;
}
*/
unsigned char code Key_code[]=
{
//p0 p1 p2 p3
0xee,0xed,0xeb,0xe7, //p4
0xde,0xdd,0xdb,0xd7, //p5
0xbe,0xbd,0xbb,0xb7, //p6
0x7e,0x7d,0x7b,0x77 //p7
};
//以上为键码,换他们排列顺序就可以坏氐
void Key (void)
{
unsigned char KeyV_l,KeyV_h,KeyV,i;
if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110;
{
//Delay();
if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110;
{
KeyV_l=Key_Port&0x0f; //取出键码的 低4位
Key_Port=0XF0;
KeyV_h=Key_Port&0xf0; //取出键码的 高4位
KeyV=KeyV_h+KeyV_l; //合并键码
/*************************************
按键编码 对应 键值
Ee ed eb e7 1 5 9 13
De dd db d7 2 6 10 14
Be bd bb b7 3 7 11 15
7e 7d 7b 77 4 8 12 16
*************************************/
for(i=0;i<16;i++) //利用键码查找键值
{
if(Key_code[i]==KeyV)
Key_Value=(i+1);
}
Key_Port=0X0f;
}
}
Key_flag =1;
}
/* 文件名称: SNAKE.c
/* 功 能: 贪吃蛇游戏代码
/* 署 名: 张先永(原作者)
/* 时 间: 2009年10月11日
/* 备 注:
/* 游戏按键由于需要快速的响应,所有按键通过线与扩展为中断按键
/* LCD 液晶显示器在PO口 需要上拉电阻
/***********************************************************************************/
#include <reg52.H>
#include <KEY_SWEEP.H>
#include"9325tp.h"
#include "SNAKE.h"
#define uchar unsigned char
//=================================================================
// 使用结构体定义变量 使程序的名称更加的清楚
//=================================================================
struct
{
uchar X;
uchar Y;
uchar Yes;
}Food; //食物结构体
#define SNAKE_Max_Long 20 //最大长度
struct
{
uchar X[SNAKE_Max_Long];
uchar Y[SNAKE_Max_Long];
uchar Long;
uchar Life;
uchar Score; //蛇的分数
uchar Level; //蛇的等级
}Snake; //蛇结构体
uchar Key_V_temp=0; //取出上次按键值
//=================================================================
//函数功能:1ms延时函数
//晶 振:11.0592 M
//入口参数:n
//出口参数:无
//=================================================================
void Delay_1mS(unsigned int n)
{
unsigned int i;
unsigned char j;
for(i=0;i<n;i++)
for(j=0;j<120;j++) ;
}
//=================================================================
//函数名称:void Init_time0 (void)
//函数功能:初始化定时器1 用于产生随机数种子 ,用于放置实物
//入口参数:无
//出口参数:无
//=================================================================
void Init_time0 (void)
{
EA=1;
ET1=1;
TMOD|=0x10;
TH1=0X00;
TL1=0X00;
TR1=1;
}
void time1 (void) interrupt 3
{
TH1=0X00;
TL1=0X00;
}
//=================================================================
//函数名称:Trun_On_Point Trun_Off_Point (uchar x,uchar y)
//函数功能:点亮或者熄灭 一个点。用于显示蛇身体
//入口参数:无
//出口参数:无
//特别说明:此 Trun_On,函数换成其他的就可以兼容其他的液晶
// 入8*8 点阵 12864 等
//=================================================================
void Trun_On_Point (uchar x,uchar y,uchar color)
{
Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),color);
}
void Trun_Off_Point (uchar x,uchar y)
{
Bar((4*(x+2)),(4*(y+2)),(4*(x+3)),(4*(y+3)),0xBE5F);
}
//=================================================================
//函数名称:void Init_SNAKE(void)
//函数功能:绘制游戏界面,初始化游戏等级等参数
//入口参数:无
//出口参数:无
//=================================================================
void Init_SNAKE(void)
{
uchar i;
Init_time0();
//***********绘制游戏界面********************//
CLR_Screen(0xBE5F);
Rectangle(8,8-1,85,120,0xaa);//绘制一个矩形框, 0-127
LCD_PutString(88,8,"Score",0x00ff,0xBE5F);
LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
LCD_PutString(88,81,"LEVEL",0x00ff,0xBE5F);
LCDShow_uCharNumber(96,97,Snake.Level,0x00ff,0xBE5F);
//***********初始化蛇参数********************//
Snake.Long=2; //定义初始化蛇的长度
Snake.Life=0; //初始化蛇还活着
Snake.Score=0;
Food.Yes=1;
Key_Value=0;
Key_V_temp=0;
for(i=0;i<Snake.Long;i++) //将蛇给赋值
{
Snake.X[i]=i+2;
Snake.Y[i]=2;
}
for(i=0;i<Snake.Long;i++) //将蛇给画出来
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
}
//=================================================================
//函数名称:void Display_dead(uchar i)
//函数功能:显示死亡界面
//入口参数:无
//出口参数:无
//=================================================================
void Display_dead(void)
{
LCD_PutString(10,40,"GAME OVER",0x00ff,0xBE5F);
while(Key_Value!=Key_Enter)
{
Key();
}
Init_SNAKE();
}
//=================================================================
//函数名称:void Display_Pass(uchar i)
//函数功能:显示过关界面
//入口参数:无
//出口参数:无
//=================================================================
void Display_Pass(void)
{
Snake.Level++;
LCD_PutString(18,40,"You are",0xcc88,0xBE5F);
LCD_PutString(34,56,"WIN!",0xcc88,0xBE5F);
while(Key_Value!=Key_Enter)
{
Key();
}
Init_SNAKE();
}
//=================================================================
//函数名称:void Run_SNAKE(void)
//函数功能:蛇运动函数 (游戏精华)
//入口参数:无
//出口参数:无
//=================================================================
void Run_SNAKE(void)
{
uchar i=0;
/*********************根据按键选择蛇的运动方向*******************/
if((Key_Value==Key_Right&&Key_V_temp!=Key_Left)||(Key_Value==Key_Left&&Key_V_temp==Key_Right))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Right;
}
if((Key_Value==Key_Left&&Key_V_temp!=Key_Right)||(Key_Value==Key_Right&&Key_V_temp==Key_Left))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Left;
}
if(( Key_Value==Key_Up&&Key_V_temp!=Key_Down)||( Key_Value==Key_Down&&Key_V_temp==Key_Up))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Up;
}
if(( Key_Value==Key_Down&&Key_V_temp!=Key_Up)||( Key_Value==Key_Up&&Key_V_temp==Key_Down))
{
Trun_Off_Point(Snake.X[0],Snake.Y[0]); //先把蛇尾给熄灭掉
for(i=0;i<Snake.Long-1;i++) //蛇身都是它前一段的蛇身的位置
{
Snake.X[i]=Snake.X[i+1];
Snake.Y[i]=Snake.Y[i+1];
}
Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;
Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //蛇头向你要求的方向移动
for(i=0;i<Snake.Long;i++) //这个让蛇显示出来的函数
{
Trun_On_Point(Snake.X[i],Snake.Y[i],0xaa);
}
Key_V_temp=Key_Down;
}
/****************根据按键选择蛇的运动程序结束*******************/
/////////////////////////////////////////////////////////////////
/************************判断蛇是否死亡***********************/
if(Snake.X[Snake.Long-1]>=19||Snake.Y[Snake.Long-1]>=28)//判蛇头是否撞到墙壁
{
Snake.Life=1;
}
for(i=3;i<Snake.Long;i++)//从第三节开始判断蛇头是否咬到自己
{
if(Snake.X[i]==Snake.X[0]&&Snake.Y[i]==Snake.Y[0])
{
Snake.Life=1;
}
}
if(Snake.Life==1) //if the snake over
{
Display_dead();
}
/******************判断蛇是否死亡程序结束***********************/
/////////////////////////////////////////////////////////////////
/************************判断蛇是否最长了**********************/
if(Snake.Long==SNAKE_Max_Long)
{
Display_Pass();
}
/////////////////////////////////////////////////////////////////
/*************************判蛇是否吃到食物**********************/
if(Snake.X[Snake.Long-1]==Food.X&&Snake.Y[Snake.Long-1]==Food.Y)//
{
//Trun_Off_Point(Food.X,Food.Y); //消隐食物
Snake.Long++;//蛇节数加1
Snake.X[Snake.Long-1]=Food.X;
Snake.Y[Snake.Long-1]=Food.Y;
Snake.Score+=10;
LCDShow_uCharNumber(96,24,Snake.Score,0x00ff,0xBE5F);
Food.Yes=1; //食物标志置1
}
/////////////////////////////////////////////////////////////////
/***************************放果子程序*************************/
if(Food.Yes==0)
{
Trun_On_Point(Food.X,Food.Y,0xaa);
}
if(Food.Yes==1)
{
while(1)
{
Food.X=((TL1&0X24)>>1); //获得随机数
Food.Y=TL1&0X1B;
for(i=0;i<Snake.Long;i++) //判断产生的食物坐标是否和蛇身重合
{
if((Food.X==Snake.X[i])&&(Food.X==Snake.Y[i]))
break;
}
if(i==Snake.Long)
{
Food.Yes=0;
break; //产生有效的食物坐标
}
}
}
/////////////////////////////////////////////////////////////////
/**************************延时用于调整游戏速度************************/
Delay_1mS(300-Snake.Level*50);
/////////////////////////////////////////////////////////////////
/**************************************************************************
mini80 或者 mini80E 按键,上 s6,下 s14,左 s11, 右 s9, s4 重新开始
可以按照自己需要重新定义键盘扫描程序中的值,在key_sweep.h 中
****************************************************************************/
#include "reg52.h"
#include "KEY_SWEEP.H"
#include "SNAKE.h"
#include "9325tp.h"
//=========================================主程序========================================//
main()
{
ILI9325_Initial();
Init_SNAKE();
while(1)
{
Run_SNAKE();
Key();
}
}
#include <reg52.h>
#include <KEY_SWEEP.H>
unsigned char Key_Value=0;
unsigned char Key_flag =0;
/*
void Interrupt0_Key (void)
{
IT0=1; //设置下降沿中触发
EA=1; //开总中断
EX0=1; //开外部中断
Key_Port=0X0f;
}
*/
unsigned char code Key_code[]=
{
//p0 p1 p2 p3
0xee,0xed,0xeb,0xe7, //p4
0xde,0xdd,0xdb,0xd7, //p5
0xbe,0xbd,0xbb,0xb7, //p6
0x7e,0x7d,0x7b,0x77 //p7
};
//以上为键码,换他们排列顺序就可以坏氐
void Key (void)
{
unsigned char KeyV_l,KeyV_h,KeyV,i;
if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110;
{
//Delay();
if(Key_Port!=0X0f) //0000 1111 有按键的时候就可能是0000 1110;
{
KeyV_l=Key_Port&0x0f; //取出键码的 低4位
Key_Port=0XF0;
KeyV_h=Key_Port&0xf0; //取出键码的 高4位
KeyV=KeyV_h+KeyV_l; //合并键码
/*************************************
按键编码 对应 键值
Ee ed eb e7 1 5 9 13
De dd db d7 2 6 10 14
Be bd bb b7 3 7 11 15
7e 7d 7b 77 4 8 12 16
*************************************/
for(i=0;i<16;i++) //利用键码查找键值
{
if(Key_code[i]==KeyV)
Key_Value=(i+1);
}
Key_Port=0X0f;
}
}
Key_flag =1;
}
更多追问追答
追问
你好,那个游戏按键是那个输出口~!??
追答
上面有解释吗?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询