历史上的今天
返回首页

历史上的今天

今天是:2025年04月29日(星期二)

正在发生

2020年04月29日 | 基于51单片机的点阵贪吃蛇

2020-04-29 来源:eefocus

这是基于51单片机的贪吃蛇小游戏,用四个独立按键控制上下左右,用8*8点阵作为显示


程序如下:


#include

#include

#include

 

#define SNAKE 20

 

unsigned char x[SNAKE];        //存放蛇的X轴坐标

unsigned char y[SNAKE];        //存放蛇的Y轴坐标

 

unsigned char point_x;         //存放果实的X轴坐标

unsigned char point_y;         //存放果实的Y轴坐标

/*

//点阵模块接口定义

sbit LEDARRAY_LAT = P3^6;//储存寄存器是时钟

sbit LEDARRAY_CLK = P3^5;//移位寄存器时钟输入端

sbit LEDARRAY_DI = P3^4;//串行数据输入端

sbit up    = P3^0;

sbit down  = P3^1;

sbit left  = P3^2;

sbit right = P3^3;

unsigned char num[8][8]={

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0

};//定义8*8数组作为清屏数据(有点走弯路,也就不改了自己有能力可以自己改)

 

 

 

 

unsigned char move_flag=0;        //移动标志, 1 上,2 下,3 左,4 右;

unsigned char snake=3;            //蛇身长度   

unsigned int flag=1;              //是否需要生成果实

 

 

//SPI通信函数 发送一个直接数据给点阵模块

void Send_Byte( unsigned char dat)

{

unsigned char i;//循环次数数变量

LEDARRAY_CLK = 0;//拉低移位时钟

_nop_();

LEDARRAY_LAT = 0;//拉低储存时钟

_nop_();

 

for( i = 0 ; i < 8 ; i++ ) //?循环8次写入一个字节数据

{

if( dat&0x01 )

{

LEDARRAY_DI = 1;

}

else

{

LEDARRAY_DI = 0;

}

LEDARRAY_CLK = 1; //上升沿发送数据

// _nop_();

LEDARRAY_CLK = 0;

// _nop_();

dat >>= 1;

}

}

 

void chang_num()            //这个函数用来转码,把8*8数组中的‘0’,‘1’按列写成十六进制

{ int i,j;

for(j=0;j<8;j++) 

{

for(i=7;i>=0;i--)    

{  

Dis_num[j]*=2;  

Dis_num[j]+=num[i][j]&0x01;  

}

}

}

 

void Display(unsigned char* Dis_dat,delay)     //显示函数

{

unsigned char k, temp;

unsigned int i;

for(i = 0 ; i < delay ; i++)

{

temp = 0x7f;

for(k = 0 ; k < 8 ; k++) //一个字节8byte

{

Send_Byte(temp); //列选择

Send_Byte(Dis_dat[k]); //行数据

LEDARRAY_LAT =1;         //锁存数据

_nop_();

LEDARRAY_LAT = 0;

_nop_();

temp = (temp>>1)|0x80;

}

}

}

void key()

{

if(move_flag!=2&&(!up))

{

move_flag=1;

}

if(move_flag!=1&&(!down))

{

move_flag=2;

}

if(move_flag!=4&&(!left))

{

move_flag=3;

}

if(move_flag!=3&&(!right))

{

move_flag=4;

}

}

 

void move()       //这个函数是让蛇走起来的,如果蛇现在向上走就把蛇尾所在坐标改为0,把蛇头上方所在坐标改为1.其他同理

{

unsigned int i;

if(move_flag==1)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1]-1;

y[1]=y[1]; 

}

if(move_flag==2)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1]+1;

y[1]=y[1]; 

}

if(move_flag==3)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1];

y[1]=y[1]-1; 

}

if(move_flag==4)

{

for(i=snake;i>0;i--)

{

x[i+1]=x[i];

y[i+1]=y[i];

}

x[1]=x[1];

y[1]=y[1]+1; 

}

}

 

 

 

void bulid_point()        //生成果实函数

{

unsigned int i;  

if((x[1]==point_x)&&(y[1]==point_y))        //判断吃到果实

snake++;        //蛇的长度加1

flag=1;         //标志需要生成果实

}

while(flag)            //生成果实

{

point_x=(unsigned char)(rand()%8);

point_y=(unsigned char)(rand()%8);

for(i=1;i {

if(point_x !=x[i]&&point_y!=y[i])

flag=0;

}

}

}  

 

bit eat()            

{

}

void assign ()     //画蛇函数,在8*8二维数组中画出蛇,把蛇所在的每个坐标改为1

{

unsigned int i,j;

for(i=0;i<8;i++)

{

for(j=0;j<8;j++)

{

num[i][j]=0;

}

}

for(i=1;i {

num[x[i]][y[i]]=1;

}

num[point_x][point_y]=1;

}

 

 

 

void main()

{

snake=3;

//x[0]=4;y[0]=3;

x[1]=4;y[1]=4;

x[2]=4;y[2]=5;

x[3]=4;y[3]=6;

while(1)

{

key();

move();

bulid_point();

//eat();

assign ();

chang_num();

Display(Dis_num,200);

if(x[1]>7||y[1]>7)

{

while(1)

{

num[x[1]][y[1]]=0;

chang_num();

Display(Dis_num,200);

}

}

}  

}

推荐阅读

史海拾趣

Fillfactory Nv公司的发展小趣事

2015年,FIDELIX迎来了一个重要的转折点。在这一年,东芯半导体有限公司(以下简称“东芯半导体”)正式收购了FIDELIX 25.3%的股权,成为其第一大股东及实际控制人。这一收购标志着FIDELIX开始进入一个新的发展阶段。

通过与东芯半导体的合作,FIDELIX获得了更多的资金支持和市场资源。东芯半导体是一家专注于中小容量存储芯片研发、设计和销售的中国企业,在半导体领域拥有丰富的经验和资源。双方的合作不仅为FIDELIX带来了更多的发展机会,同时也加速了FIDELIX在国际市场上的扩张步伐。

在上述两个故事的基础上,可以根据FIDELIX公司的具体发展历程、重要事件、技术创新、市场策略等方面进行进一步的拓展和补充,以形成完整、详细的故事内容。

华瓷(Chinocera)公司的发展小趣事

在华瓷的发展历程中,一个关键的转折点是在XX年代初,公司成功研发出了一种新型陶瓷材料,这种材料不仅具备优异的耐高温、耐腐蚀性能,而且在电子元器件的应用中表现出了极高的稳定性和可靠性。这一技术突破使得华瓷迅速在电子行业崭露头角,众多知名电子品牌开始与华瓷合作,使用其陶瓷材料生产高性能的电子元器件。

Burr-Brown公司的发展小趣事

Burr-Brown在音频领域取得了显著的成就。1957年,公司推出的Model 130成为世界上第一个固态运算放大器(op amp),这一技术在现代高级音频系统中仍占据核心地位。1982年,公司发布的16位单片数模转换器(DAC)更是彻底改变了音乐的播放和发行方式,使得音乐可以以高保真度进行复制,并方便地随身携带。Burr-Brown的技术成为优质音频的代名词,赢得了广泛的行业认可。

DL Instruments LLC公司的发展小趣事

经过多年的发展,DL Instruments已经成为电子行业中一家具有重要影响力的企业。然而,公司并没有因此而满足。相反,它继续加大研发投入、拓展产品线、优化生产流程、提高产品质量和服务水平。展望未来,DL Instruments将继续秉承“创新、卓越、服务”的理念,为电子行业的发展做出更大的贡献。

请注意,这些故事是基于现有信息进行的概述和虚构,并非真实的历史事件。如有需要,您可以进一步查阅相关资料或联系DL Instruments公司获取更详细的信息。

Chip Technologies Inc公司的发展小趣事

为了进一步扩大市场份额,Chip Technologies Inc积极寻求与国际知名企业的合作。通过与这些企业建立战略合作关系,公司不仅获得了更多的技术支持和市场资源,还成功将产品推向了全球市场。这些合作不仅提升了公司的品牌知名度,也为公司的长期发展奠定了坚实的基础。

ETA-USA公司的发展小趣事

ETA-USA一直注重技术创新和研发实力的提升。公司拥有一支高素质的研发团队和先进的研发设施,不断推出具有竞争力的新产品和解决方案。同时,ETA-USA还积极与高校、科研机构等合作,共同推动电子技术的创新和发展。

问答坊 | AI 解惑

spi主从机直接连接就可以了吗?还是要有什么特殊的外围电路呢?

现在正在用spi同一个AD连接,想请教一下主spi的miso,mosi,sck,cs直接通从spi,也就是ad的spi连接就可以了吗?不用加什么电容电阻之类的吗?如果哪位有电路图的话,不胜感激!!!!!!…

查看全部问答>

请问学习硬件应该从哪方面入手比较好?

电子毕业,公司是做医疗电子方面的器械,我暂时负责硬件维护,虽然有人带,但是还想快点进步,我读电子出身的,但大学期间把心思放在单片机编程,界面编程上,所谓的“上学多,读书少”,请问就模电来说,哪方面入手更好? 就我认识,电源,放大电 ...…

查看全部问答>

专业加工1-20层PCB电路板

我厂是专业PCB制造商,专业为高科技企业加工生产双面多层(1-20层)高端精密度线路板,以及HDI,高频、高TG、高CTI、阻抗、埋盲孔、刚柔结合、铝基、无卤素等新工艺的开发,并取得了良好的成绩;我们的产品广泛用于数码产品,通讯设备,IT产品,工控,医疗 ...…

查看全部问答>

STM8S103F2Timer2不进入中断

STM8S103F2的板子,串口已经调通了,通信正常,然后调TIMER2 用HSI 初始化     TIM2_DeInit();     TIM2_TimeBaseInit(TIM2_PRESCALER_256, 624);     TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE); //1-此句 ...…

查看全部问答>

STM32F+keil让程序在内部ram中运行有没有什么简单方法?

目前在FLASH中运行,感觉速度有点慢,想放到内部RAM中运行以加快速度,不知道有没有什么简单的、不用额外编程的方法,例如在编译或链接选项里能不能做个简单设置就搞定?谢谢! 程序用到了USART和Systick中断。 顺便问一下,大家觉得那个用 ...…

查看全部问答>

STM8烧机问题

最近做了一款机器,用的STM8105S4,小批量试产时OK,第二次批产了1000多台,生产上测试时没问题,装机放了一段时间升级程序时发现有10%左右烧不进程序,查找后基本相同坏法,如下:有一个或几个IO对地短路,并且VDDIO1、VDDIO2也对地短路(vdd正常) ...…

查看全部问答>

新人,求帮助!!!关于wince下实现用程序编辑word问题?

如题,在wince下能否实现用程序编辑word,比如新建一个,修改里面的内容等,坐等各位大哥指教!…

查看全部问答>

为什么PCB中的走线和原件,边框变灰色

altium  designer PCB图中,经常走线 、元件、焊盘 、甚至PCB板边框都变成灰色,请教这是什么原因?…

查看全部问答>

协调器连接终端数?

星型网中一个协调器实际上最多可连接多少个终端,改哪里的设置可以改变这一个数?…

查看全部问答>

ADS 开关矩阵

请教各位大神有没有用ADS设计开关矩阵的设计图啊,学生做毕设求救啊。。。…

查看全部问答>