单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏

为了让大家更深入地了解底层的原理,在讲解时特意选择了51单片机(而非STM系列),另外16*16点阵由译码器和移位缓存器直接驱动(而非MAX系列芯片),摇杆也利用ADC功能判断方向。

9217783b07e47957c259f1ac4a6d3e68.png73c64023c3e91e2a10b2bedcf502a586.png3e1f292c17492a9e05b2db2a03224313.png73c64023c3e91e2a10b2bedcf502a586.pngeb3020265ecef29ccdb8ca254346a152.gif

那如何让单片机驱动这256个点呢?直接用IO口驱动显然不够且十分浪费。为了解决这个问题,我们要引入动态扫描的方法,它利用了人类的视觉暂留现象:如果让点阵的每一行分别轮流显示,当扫描速度足够高时,我们并不会看到一行一行地闪动,而是一幅完整的图像。

在驱动这个16*16点阵时,单片机会首先选中一行,然后将16位的数据输出以显示一行,在做短时间的停顿后接着再选择下一行输出,如此往复对这16行进行高速扫描就可以在点阵上看到要显示的图像。

先来讲解一下16*16点阵的原理。为了方便大家理解,我们先来看一下8*8点阵的电路图。它实际上由64个LED组成,每行共阴,每列共阳,当某行输出信号为低电平时,整一行LED阴极均为低电平,当在列上分别输入不同的电平信号时,交叉点的LED就会有不同的亮灭情况,以此不断循环扫描,就可以显示完整的图像。

de0cabfab4924afc5f87dc86728c4b4b.png

8*8点阵的原理图

16*16点阵实质上为4个8*8点阵组合而成,对它的控制和8*8点阵也是大同小异,同样是分别扫描所有的行并输出列的数据,以此输出完整的16*16图像。

我们首先来考虑点阵行的控制,由于要节省单片机的引脚,我们使用74HC138译码器来控制不同的行,这里采用两个译码器分别对16行进行选择。

0d320542a4a72f104993947879c59816.png

74HC138引脚图

VDD和GND分别为电源正负极,A0,A1,A2负责数据输入,Y0到Y7进行译码输出,E1,E2,E3为使能引脚,只有当E1和E2均为低电平,E3为高电平时,译码器才会正常输出,否则只会全部输出高电平。在使用时,只需要输入3位二进制加权地址,就能提供8个互斥的低有效输出。

2d56cfdb3d140692b18fabc1c655bead.png

74HC138架构图

由于2^3=8,那3位的二进制数据刚好能用于输出8位的互斥数据,我们正是借用这个特性来对点阵进行行扫描。根据译码器数据手册提供数据,我们可以得知使用3位二进制加权地址来输出8位的互斥信号的真值表。

0a624d105acccbb0550cd8511c7abf7a.png

74HC138真值表

由于译码器输出电流较低,必须借助三极管分别放大输出信号才能正常驱动LED。此处将译码器的输出接口分别连接到PNP三极管的基极,然后发射极连接点阵的行引脚,由于所有三极管的发射极均连接在VCC上,当输入低电平时,集电极就会输出高电平,否则就输出低电平,以此放大译码器的控制信号。

d688e9328f558cd8977e35cdd34b62a9.png

74HC138输出的原理图

b9eb17e407ec9aed68a05bacd45d4246.png

两个74HC138的连接图对比

两个译码器的连接图稍有不同,对比一下可以发现它巧妙地利用了74HC138的使能特性,当G为高电平时,两个译码器均无输出,当G为低电平且D为低电平时,第一个译码器使能而第二个译码器关闭,反之第二个译码器使能而第一个译码器关闭;所以这里就可以直接使用A B C D对16行进行选择控制,G使能全部输出。

同样是为了节省IO口,我们使用了两个74HC595级联进行列输出,由于列输出内容是不确定的,所以我们要借助位移缓存器将串行数据转化为并行数据。

469a7faad1d65ba37ededa437c4c4f54.png

74HC595引脚图

这里VCC和GND分别为电源正负极,Q0到Q7为输出接口,DS为数据输入口,SHCP为数据输入时钟,STCP为输出存储器锁存时钟线,MR用于清零移位寄存器,OE为输出使能,Q7S可以连接到下一级位移缓存器的DS。

查阅数据手册可知,当SHCP产生一个上升沿的时候,移位寄存器读入DS上的电平信号,并且所有的数据都向后移动了一位。当数据输入完毕时,在STCP上发送一个上升沿可以让移位寄存器的数据锁存输出,由于有移位寄存器的存在,进行数据输入的时候可以有效避免“鬼影”问题。此处为了方便大家理解引入了IC的架构图。

92cf4722e44cbe6459d2e5fc0bce43fc.png

74HC595架构图

在这个制作中我们不需要对移位缓存器进行单独操作,因此将OE接地,MR接VCC即可。把SHCP和STCP分别合并同时引出为CLK和LATCH输入线;第二个IC的DS接到第一个IC的级联输出端上,以实现多个74HC595的级联;再将第一个IC的DS端引出为DATA输入线,这样子我们用三根线就可以实现16位数据的串行输出。

4838678892e2282a63ef770d61fc648c.png

两个74HC595的连接图

    总结一下,这个16*16点阵需要两根电源线和八根数据线进行驱动,其中A B C D和G进行选择,DATA,CLK和LATCH串行输出16位的列显示数据。在选通一行后,74HC595输出该行数据,总共16行依次循环进行动态扫描,让16*16的点阵显示出来需要的文字或者图形。

    接着,我们用摇杆来控制蛇的走向。摇杆的本质是X轴和Y轴的两个电位器,在摇杆运动的时候,通过读取两个电位器的输出电压就可以分别得到X轴和Y轴的坐标。由于得到是模拟数据,利用单片机的ADC功能来获取电压大小即可得到前后左右的运动数据。

    目前国内大部分51单片机为STC的产品,因此我们选用了STC8单片机作为控制中心来驱动整个游戏。鉴于贪吃蛇程序在系统平台上编写过于简单,这里就不再赘述游戏逻辑的编程。下面的C语言代码用Keil编译后通过串口烧录进单片机即可。

72532c3421350c548e806274c19353ab.png

头文件及常量定义

ff9c7d8e1638ad40087fbe67f829bf1c.png

全局变量定义

fe544caa266b95b0750e5b9eb84eb635.png

定义八个数据线的引脚位置

03f7cb4ac072f95bf576072fa86622e6.png

全局初始化

9c07ac6dd6a5f82e168f833f9cc7d194.png

向74HC595发送8bits的数据的函数

5565cc7c93a7d92d4c27e94fe04df94f.png

借助位运算进行行选

d33dc1bcdcab2cce0328b7b6ed8942d2.png

驱动整个点阵

b02c40b21071eb70b642b066d0fee92b.png65c398d0e06e592121ad0dc1789c3d67.png

对摇杆的扫描及响应

90a16df46fe3ea664b51797cda9958c4.png

定时器中断

da1406ddd006c47b96affededbb1e4f9.png

生成随机点

d5a08ad646521d7abc3450ac7ca7b1a5.pnga8b9e6fdeec3f70763890f9726e75f99.png

贪吃蛇的游戏逻辑

26e7a88bec48b56d810d0694f1a70ffc.png

简易的main函数

eddc66c7f639e0615354a2bbf5719294.png

以上就是整个贪吃蛇游戏的主要代码,分为从硬件上驱动IC和在软件上进行游戏的过程,虽然很简单但能让初学者了解51单片机对74系列IC的使用和ADC的读取,也能对单片机的编程加强认知。谢谢大家!

347946045aa2bdad208a0574235632d7.png

图文:林钜聪

排版:刘杨

审核:梁庆铧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样在linux中创建硬盘,在linux中添加新硬盘并创建LVM组

1、以虚拟机为例,给虚拟机添加一块新硬盘,并创建LVM组,将新硬盘用于存放oracle数据库文件。2、fdisk -ll查看新添加的硬盘是否被识别,如图已经识别出sdb。3、# pvcreate /dev/sdb (创建PV,相当于win中将基础磁盘转换…

双代号网络图基础算法_软考网络工程师之系统开发和运行基础(软件分类、测试、模型)...

系统开发和运行基础(软件的分类、软件生存周期、软件开发模型、软件测试、软件项目管理)软件的分类系统软件,如操作系统。支撑软件,如开发工具。应用软件,如office。实时处理软件,一般是工业软件。软件生存周期1、软件定义问题定义…

在学Python前学Linux,Python原来这么好学-1.2节: 在Linux中安装python

这里将告诉您Python原来这么好学-1.2节: 在Linux中安装python,具体操作过程:在Linux系统的主要发行版中,按其软件包格式来进行划分,可分为Deb系以及RPM系操作系统。Linux系统与Windows系统有一个很重要的区别,Linux系统完全免费,开…

python金融大数据分析视频_Python金融大数据分析 PDF 全书超清版

给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python金融、大数据分析方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小47.8 MB,希尔皮斯科编写,目前豆瓣、亚马逊、当当、京东等电子书…

kaggle房价预测特征意思_机器学习-kaggle泰坦尼克生存预测(一)-数据清洗与特征构建...

1、背景:1.1 关于kaggle:谷歌旗下的 Kaggle 是一个数据建模和数据分析竞赛平台。该平台是当下最流行的数据科研赛事平台,其组织的赛事受到全球数据科学爱好者追捧。 如果学生能够在该平台的一些比赛中获得较好的名次,不仅可以赢得…

linux docker安装svn,使用docker镜像搭建svn+Apache环境

环境准备虚拟机装好之后,按照官网步骤检查虚拟机内核版本,必须在3.10以上版本,故此处安装redhat_7.2# uname -r3.10.0-327.el7.x86_64安装docker:yum install docker-io有依赖是直接安装具体的依赖软件,解决依赖docker…

springboot 设置ico_Spring Boot--Thymeleaf模板引擎/静态页面

点关注,不迷路;持续更新Java相关技术及资讯!!!1.Spring Boot对静态资源的映射规则如果静态资源文件夹下有 index.html的话,直接访问localhost:8080的话,index就是欢迎页使用自己的图标:在静态资源文件夹放一个 favicon…

linux shell 豆瓣,用Linux shell脚本爬取豆瓣邮箱

前两天总结一下邮箱格式的正则表达式,写了一个脚本来判断输入的邮箱地址是否符合邮箱的格式(有兴趣的朋友可以翻一下我的博客去看一下)。在网上找资料的时候,发现基本都是用Python和Java来做爬虫,当然Python的居多。本着学习的心态&#xff0…

php 获取header_php 输出404状态码

今天在做一个php数据提交的小功能时,需要在判断一个值是如果为空时,就让后台的逻辑页面返回 404 状态码,提示用户页面不存在。那么接下来,飞鸟慕鱼博客要说的是 php 如何返回或输出 html 404 的状态码。php header()函数header()&…

getcwd和pwd为什么不一样_农村医保,为什么每个地区收费不一样?

新农村合作医疗保险的缴费标准,为什么每个地区都不一样呢?我们可能不难发现,就是说你在的地区每年交费可能是280元,但是别的人在的地区可能交费达到了306元或者说320元,这究竟是一种什么样的情况呢?其实每个…

矩阵论思维导图_《实变函数论》 江泽坚 3rd 思维导图与笔记整理

实变函数学十遍实变函数应该是你们本科所有数学课程中最难的了 ————韦老师如是说学期初就知道这个课不好学。话不多说,期末之前把复习导图全部做完了,po上来分享。注:由于制作辛苦,所以预先告知收取些许费用(不到一…

jackson 读取多文件_Spring Boot系列之读取配置

使用SpringBoot框架开发,读取配置是少不了的,那么你会读取配置吗?你会写配置吗?List?Map?1 目的本节我们要解决如下几个问题:如何使用Spring Boot读取配置文件?有哪些方式&#xff1…

ab plc编程软件_AB编程软件及所有组态软件授权及安装教程包含FTViewV11

前面发了几个求助的帖子,希望有朋友能提供些Factory Talk View V11的安装和授权,但是一直没有什么回复,今天结合别人的经验,算是把授权安装搞定了,在这里发布出来,希望能帮助到更多的朋友,授权和…

c++ udp多线程 例子_[内附完整源码和文档] 基于udp实现tcp功能进行大文件传输

一.项目要求Please choose one of following programing languages: C, C, Java, Python;本项目采用的是python3.6LFTP should use a client-server service model;本项目使用客户端-服务器的模式LFTP must include a client side program and a server side program; Client s…

C语言中 1%3,算术什么意思啊 算数什么意思

算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!算术是什么意思数学什么是算术和算术和是正数的和,即绝对值的和,例如213.57,…

python 消息框但不影响程序执行_还在用print()查找错误?日志消息不香嘛?| 原力计划...

作者 | 灰小猿责编 | 王晓曼出品 | CSDN博客最近在做项目开发的时候,跟小伙伴聊到修 Bug 这件事。嗯,对于一只没技术的程序猿来说,修 Bug 的确是一件让人头疼的事情,尤其是对于比较大型的项目开发,在变量较多的时候&am…

vue中传值和传引用_vue prop属性传值与传引用示例

vue prop属性传值与传引用示例vue组件在prop里根据type决定传值还是传引用。简要如下:传值:String、Number、Boolean传引用:Array、Object若想将数组或对象类型也以值形式传递怎么办呢?如下方式可以实现:// component-…

.sql文件_Mysql分组排序及Sql文件执行

最近在做一个临时项目,采用的是mysql开发,主要涉及两个问题:1.一个是传参问题;2.另一个是实现对数据分组取前4的数据。个人感觉很有意义,特此记录一下。一.传参问题执行mysql文件,需要从外部传入参数时&…

android 动态库 后缀,Android Robolectric加载运行本地So动态库

前言Robolectric 是 Android 的单元测试框架,运行无需 Android 真机环境直接运行在 JVM 之上,所以在 test case 运行速度效率上有了很大提升,接近于 Java JUnit test(JUnit test > Robolectric ≫ androidTest)。不过框架本身并不支持 so …

java web输出语句到控制台_Java工程师(6).循环结构

搞清楚循环结构语句的执行效果与使用场景。程序中的循环流程程序中的循环流程试着编写程序实现下列功能:在控制台中输出100个Hello字符串。在控制台中输出从 1 到 100 的数字。… …循环结构的三要素循环结构必然包含如下三要素:循环变量 (循…