做个坦克大战游戏机和大家分享下

2020-02-04 09:27发布

新手,第一次发资料~~~
给大家传一个坦克大战游戏机,用51单片机做的。键盘是用6个按钮排成游戏手柄的形状,左边四个控制自己的坦克移动,右边两个是暂停和射击键。屏幕是4个8*8的红绿双 {MOD}点阵屏拼成的16*16点阵,游戏开始时敌人有三个红 {MOD}坦克,在屏幕右上角出现,发的子_弹也是红 {MOD};我方坦克绿 {MOD},在左下角,子_弹是绿 {MOD};墙壁是红绿混合后的颜 {MOD},看上去是黄 {MOD}。敌人那些坦克是随机动的,乱打一通~~呵呵
源程序在这里,不是标准的C语言,不过也很容易移植到Keil上。还有些别的游戏机在我的博客上( myrobot.2  1  i  c.org 不好意思去掉空格啊 ),欢迎大家去看。  上学来净做游戏机了..
坦克大战游戏源代码ourdev_561623.rar(文件大小:4K) (原文件名:坦克大战.rar)
这是几张照片,颜 {MOD}照的不是很清楚:

(原文件名:坦克大战(屏幕).JPG)

(原文件名:坦克游戏模糊全景.JPG)

(原文件名:坦克游戏清晰.JPG)

这是背面电路,连线很繁琐,静下心来焊了一天。

(原文件名:背面整体.JPG)

(原文件名:背面细节.JPG)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
60条回答
ShenFei
2020-02-09 22:38
回复【40楼】wkman 鱼片
-----------------------------------------------------------------------

38楼 tear:   我是廊坊师范的, 呵呵

我用的手柄是那种很老的在电视上玩的游戏机手柄(魂斗罗,忍者龟,超级玛丽...), 几块钱一个,应该快淘汰了.
上面有9个引脚,上边5个, 下边4个, 有4个线是起固定作用的, 剩下5根线是电源+,-,CP,D,RST.   那引脚排列哈~~等下我研究研究,
再把引脚图传上来. 和单片机相连的就是那3个线, 时序和CD4017类似, 先给RST复位信号, 再依次通过CP送8个脉冲, 各个按键的
状态就依次在数据线D上输出. 各个键可以同时按, 互不相关. 下面是读键盘程序, 返回当前键值, 不是标准C语言有些稀奇古怪的语法, 反正大体意思大家一看就懂,很容易改到Keil上的.


//游戏手柄元件,返回当前按键值, 为1表示对应键按下.
//这个是库函数的代码,所以三个控制引脚定位到一个中间元件上
unit game_pad
{
    //初始化
    public void init()
    {
        d = high;
        cp = low;
        reset = high;
    }
    //读取键盘按键
    public uint8 read()
    {
        uint8 key_data;
        reset = high;
        loop( 8 ) {
            key_data <<= 1;
            key_data.0 = d;
            reset = low;
            cp = high;
            cp = low;
        }
        return key_data;
    }
    //键盘枚举值, 用相与判零的方式检测按下
    public const uint8 right = 0b0000_0001;
    public const uint8 left = 0b0000_0010;
    public const uint8 down = 0b0000_0100;
    public const uint8 up = 0b0000_1000;
    public const uint8 start = 0b0001_0000;
    public const uint8 select = 0b0010_0000;
    public const uint8 a = 0b0100_0000;
    public const uint8 b = 0b1000_0000;
    //手柄信号线定义
    bit cp = @game_pad_port.cp;
    bit d = @game_pad_port.d;
    bit reset = @game_pad_port.reset;
}
//接口,这个元件类型是由用户定义的,根据具体的硬件连接设置端口
unit game_pad_port
{
    bit cp = @sfr.P1.0;
    bit d = @sfr.P1.1;
    bit reset = @sfr.P1.2;
}
   原来制表符显示不了啊..

一周热门 更多>