至简至美的一款单片机游戏
在电子森林 推文 700个字节的代码在ATtiny10里跑一个游戏[1] 介绍了一个 开源小游戏RunTiny[2] .
用了:
一个AVR单片机ATtiny10微控制器(只有6个脚,Digikey上0.3美元一颗)一个128*32的OLED显示屏一个按键一个电池 - 3.3V~4.5V都可以,可以用1S 150mAh的Lipo,乃至一颗CR2032的纽扣电池小小的单片机ATtiny10只有6个脚:
1个电源1个地1个Reset3个可用的I/O: PB0: 用于连接OLED的I2C的SDAPB1: 用于连接OLED的I2C的SCLPB2: 按键(INT0)原理图长这样(在面包板上就可以实现,5块钱打块板也可以啊):
▲ 极简的电路图
▲ 面包板上搭建的电路
代码也超级简单,为了能够塞到1KB的Flash存储器里面,作者做了优化,用汇编语言写成,最终的代码只有778个字节,不仅实现了游戏的功能,还能处理微控制器的I/O以及显示的通信
是不是很酷?
在Github上有开源的资源。 [2]
参考资料
[1]
700个字节的代码在ATtiny10里跑一个游戏 : https://mp.weixin.qq.com/s/gcqykDVyC8Vx_yztekMNSQ
[2]
开源小游戏RunTiny : https://github.com/ridoluc/RunTiny
51单片机12864大液晶屏俄罗斯方块游戏 ROTEUS 教程
51单片机12864大液晶屏 显示任意字符(计算器)
ROTEUS 和51单片机教程(仿真文件+源代码)
参考源代码:
//*************************************************************************************************
//*************************************************************************************************
//**<程序名>:俄罗斯方块游戏 **
//**<版本说明>:此版是第一版,在LCD1608第4版基础上改进而来,目前只可以绘制游戏区域的边框。 **
//**<完成时间>:2007年8月28日 **
//**<作者>:从零开始单片机 **
**
//*************************************************************************************************
//*************************************************************************************************
//*************************************************************************************************
//* *
//* ******************************头文件及宏定义************************** *
//* *
//*************************************************************************************************
#include "includes.h"
#define TIME1H 0x3C
#define TIME1L 0xB0 //定时器1溢出时间:50ms
#define SCANPORT P1
//*************************************************************************************************
//* *
//* ******************************全局变量************************************ *
//* *
//*************************************************************************************************
//unsigned char code uca_TEST[]={0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0};
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyShock=0; //键盘防抖动标志位。
//当按键中断产生时,首先判断此位。
//0--执行键盘扫描及键码处理程序;1--不执行。
bit b_KillShock=0; //防抖标志清除位:0--不清除;1--清除。
unsigned char uc_KillCount=0; //抖动标志清除计数,使用定时器1。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<键盘扫描开启标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
bit b_KeyScan=0; //0--不扫描;
//1--扫描。
//*************************************************************************************************
//* *
//* ********************************主函数****************************** *
//* *
//*************************************************************************************************
/*********************** main ************************/
void main(void)
{
vLCDInitialize();
vShowOneChin(0,0,uca_QING);
vShowOneChin(2,0,uca_SHU);
vShowOneChin(4,0,uca_RU);
vShowOneChin(6,0,uca_MAOHAO);
vShowGraph(2,60,32,4,uca_Pig);
vShowFrame();
SCANPORT=0x0F;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<外部中断0,用于开启键盘扫描及键码处理标志>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IT0=1; // 中断方式:下降沿。
EX0=1; // 开启外部中断。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<定时器1,用于防抖动标志清除 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
TR1=1; //开启定时器1
ET1=1; //开定时器1中断
EA=1;
while(1)
{
if(b_KeyScan==1) //如果有按键按下,则进行按键扫描和键码处理。
{
b_KeyScan=0;
vKeyProcess(ucKeyScan());
}
}
}
//*************************************************************************************************
//* *
//* ******************************外部中断0,用于开启键盘扫描及键码处理****************** *
//* *
//*************************************************************************************************
void vINT0(void) interrupt 0
{
if(b_KeyShock==0)
{
b_KeyScan=1; //开启键盘扫描标志。
b_KeyShock=1; //设置防抖动标志。
}
else b_KeyShock=0; //如果有抖动则不执行键扫描,恢复防抖动标志。
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<设置防抖动清除标志位 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KeyShock==1)
b_KillShock=1; //如果防抖动标志位开启则开启防抖动标志清除位,
//300ms后清除防抖动标志。
}
//*************************************************************************************************
//* *
//* ****************定时器1中断,用于计时功能和防抖动标志清除*************************** *
//* *
//*************************************************************************************************
void vTimer1(void) interrupt 3
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<防抖动标志清除>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if(b_KillShock==1)
{
if(uc_KillCount==5) //当防抖动标志位为1时,计时300ms后清除抖动标志位。
{
b_KeyShock=0;
b_KillShock=0;
uc_KillCount=0;
}
else uc_KillCount++;
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<恢复定时器1溢出时间>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
TH1=TIME1H;
TL1=TIME1L;
}
最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步,
如果需要 完整代码或设计文件,请在下方留言或者私信我,看到后会第一时间回复。
谢谢大家!
如果喜欢我的文章请评论转发加关注哦。
相关问答
51单片机 现在应用在哪?它还有市场吗?-ZOL问答51单片机现在应用在哪?它还有市场吗?讨论回答(9)学校实验室在用,不过也少了,但是51是很多atc单片机核心,一般大学仍在以它为基础教学。至于市场,其实都很难...
51单片机 C语言编程,简易计算器,复位键如何编程会简单些?要求...不玩网游和单机,至多玩棋牌游戏和影音。喜欢摄影,需要修图。附加:纠结要不要带数字键盘区。预算最多8000。尽量便宜些。1.2万浏览6回答平面设计一个月工...
四节五号干电池怎么转换为平稳5V电压供 51单片机 使用?用9V干...四节五号干电池怎么转换为稳定5V电压供51单片机使用?使用LM1117-5.0芯片用9V干电池又如何转换为5V呢?使用LM7805或LM1117-5.0芯片求电路原理图...
学习 单片机 要考些什么证书啊?学习单片机不需要考证书,只要会C语言、汇编等基本知识,最好还知道单片机是怎么工作的就可以了。学习单片机1、首先要学习C语言基础,就相当于80%会单片机了,因...
我用电脑键盘控制 单片机 灯为何不亮呢,请各位帮帮忙!-ZOL问答给你改好了,你试试吧,改动的地方,你和你源代码对比吧结果满意吗,以后可以多探讨,采纳关键的掉电保护可以像1L那样说用内部EEPROM实现,或者用24C02...
单片机 没接底座可不可以烧录程序?-ZOL问答不明白的问的,对于简单的51单片机,最起码要有一个晶振电路才可以烧录程序。你说的底座不知道是不是IC插槽?那个是方便单片机的装卸。只要有单片机,其对应脚有...
英灵神殿怎么单人进入 游戏 ?《英灵神殿》是一款多人在线游戏,但是也提供了单人游玩的模式。下面是单人进入游戏的方法:打开游戏首先,你需要打开《英灵神殿》游戏。在游戏主菜单中,选择...
可以用C语言编写 游戏 吗?可以用C语言编写游戏的。C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不...
玩树莓派能学到什么?...我们首先打开终端,输入如下指令$gpioreadall可以得到树莓派的IO口定义,基本的SPI,串口,CAN,I2C通信都是应有尽有。我们可以借此和很多外设,传感器连接做...