搜索
bottom↓
回复: 32

[I.P.D][I.P.S][交流]MAGE8贪食蛇DIY全攻略

[复制链接]
发表于 2008-3-28 13:17:32 | 显示全部楼层 |阅读模式
MAGE8贪食蛇DIY全攻略



这个我第一次发布,有些不合适的地方,我会一个一个修正的,请多多见谅。
如果有什么地方需要更正,或者有什么建议,请提出来,谢谢。

>> 系统平台


    目标处理器:     MEGA                     
    处理器:         ATMega8L            
    系统时钟:       外部8M晶体振荡器
    通信终端:       SPI        PS手柄通信
    溶丝描述:       [EESAVE=0][CKOPT=0][BODLEVEL=1]      
                     [BODEN=0][CKSEL=1111 SUT=10]
    系统电压:       5v      

    软件平台:       ICCAVR
    平台版本:       V7.16A
     
    工程文件:      下载工程文档(文件大小:135K)
      


>> 版本更新日志

   【1.00】              实现了单人游戏模式;

   【1.01】              修改了级别个数及分别对应的速度;
                         加入了撞到自己死亡的功能;

   【1.02】              增加了多级加速和减速的功能;
   
   【1.03】              取消ile多级加速、减速功能;
                         增加了临时加速和减速的功能;
                         增加了吃到豆子鸣叫一次的功能 ;

   【1.04】              优化了死亡、复位功能;

   【1.05】              进一步增强了高速、检查死亡的稳定性;

   【1.06】              支持双人模式;

   【1.07】              消除了错误判断死亡;

   【1.08】              进一步优化了代码,减小了内存占用情况;




    下载原理图(文件大小:11K)





 楼主| 发表于 2008-3-28 13:19:18 | 显示全部楼层
实际连接效果图

(原文件名:1.1.jpg)
 楼主| 发表于 2008-3-28 13:21:48 | 显示全部楼层
使用到的并口双人PS手柄介绍

(原文件名:并口.jpg)

PS手柄通信核心代码
/***********************************************************
*   函数说明:向PS手柄发送命令函数(初始化函数)           *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:无                                           *
***********************************************************/
void PS_INIT(void)
{
        uint8 i = 0;
        for(i = 0;i < 16; i++)
        {
                SELECT_LOW
                Delay_MS(2);
                if(0x4201& BIT(i))
                {
                        COMMAND_HIGH
                }
                else
                {
                        COMMAND_LOW
                }
                SELECT_HIGH
                Delay_MS(2);
        }
}

这个函数的作用是向手柄发送两个字节的命令,但是无法接受到手柄返回的第一个数据,
也就是数据类型,不过对于我们后面读取我们需要的信息是没有影响的。每次接受数据
都得先使用这个函数。

/***********************************************************
*   函数说明:接收PS手柄发回数据函数                       *
*   输入:    无                                           *
*   输出:    无                                           *
*   调用函数:void PS_INIT(void)                           *
***********************************************************/

void Read_Data_PS(void)
{
        UINT8 i = 0,j = 0;
        PORTC &= ~BIT(2);
        PS_INIT();
        for(j = 0;j < 7;j++)
        {
                for(i = 0;i < 8;i++)
                {
                        PORTC &= ~BIT(3);
                        Delay_MS(2);
                        REG1[j] >>= 1;             //接收PLAYER1 的数据
                        REG2[j] >>= 1;             //接收PLAYER2 的数据
                        if(PINC & BIT(0))
                        {
                                REG1[j] |= BIT(7);
                        }
                        if(PINC & BIT(4))
                        {
                                REG2[j] |= BIT(7);
                        }
                        PORTC |= BIT(3);
                        Delay_MS(2);
                }
        }
                PORTC |= BIT(2);
}

这个函数就是按顺序读取并保存手柄发回的7个字节的按键信息。
其实完全可以把这两个函数融合到一起的,而且可以根据需要
去接受其中某一部分的数据。

最后效果图

(原文件名:效果图.jpg)
发表于 2008-3-28 14:03:36 | 显示全部楼层
好东西。。。。
发表于 2008-3-28 14:06:14 | 显示全部楼层
不错,如果lcd能大些的话就更好了
发表于 2008-3-28 14:50:31 | 显示全部楼层
顶一下
发表于 2008-3-28 14:58:24 | 显示全部楼层
其实,I.P.C制作这个范例的目的就是告诉大家,做游戏类的兴趣开发不一定动辄就用LCD12864这样的东西。简单的595点阵系统也可以。
楼主学习AVR单片机才2个月左右(当然先前有不错的C语言基础和模拟、数字电路基础)
发表于 2008-3-28 23:41:37 | 显示全部楼层
很不错!!!
建议找个外壳装起来,否则久了就不知道扔那里去了!!!
头像被屏蔽
发表于 2008-3-28 23:42:55 | 显示全部楼层
COOL! 如此好贴,不顶就不厚道了!
头像被屏蔽
发表于 2008-3-28 23:48:41 | 显示全部楼层
这个贴子移到西南科大的分论坛里吧。壮一下声威啊。
发表于 2008-3-29 08:59:44 | 显示全部楼层
我们决定,以后发帖子先在 AVR论坛里面 发,“冷”下来以后,再移动到对应的分论坛里面。
发表于 2008-3-29 23:49:30 | 显示全部楼层
顶一下
发表于 2008-4-1 16:16:52 | 显示全部楼层
595直接推点阵,应该很吃力吧?
595输出电流不够喔,应该会很暗,
打开楼主给出的原理图是一个还没布线的pcb,怎么不是sch呢?

傻孩子:您果然火眼金金,下一步我让他们修改为6B595就可以解决暗的问题。置于PCB麻……估计是忘记了……
发表于 2008-4-1 18:48:11 | 显示全部楼层
相当不错啊
发表于 2008-4-1 22:07:00 | 显示全部楼层
很好啊,我们寝室打实况足球手柄一堆,但是都是USB接口的,无法用SPI接,试不了,不过我已前用过电脑PS/2的AVR驱动,
再加上楼主的LED显示,估计有时间时也可以试试
发表于 2008-4-2 09:09:24 | 显示全部楼层
很不错!!!  顶顶顶!!!
 楼主| 发表于 2008-4-2 19:14:28 | 显示全部楼层
我上拉电阻加大了一些,等蛇长了以后亮度确实减小了,不过作为一个实验,也还是可以了,呵呵
 楼主| 发表于 2008-4-2 19:19:46 | 显示全部楼层
由于失误,上传错了原理图,等傻孩子回来后,我会尽快更正!
 楼主| 发表于 2008-4-2 19:57:08 | 显示全部楼层
希望各位前辈们多多给我提意见和建议,千万别客气哈!
 楼主| 发表于 2008-4-2 20:59:32 | 显示全部楼层
正确的原理图已经上传
发表于 2008-4-2 22:22:38 | 显示全部楼层
记号
发表于 2008-4-4 12:18:13 | 显示全部楼层
点阵亮度的瓶颈有两个:1是占空比,2是行开关器件的驱动力.
1.如果要显示不止一行,那么点阵不可能静态,只能以<=1/8的占空比去扫描,常规是用竖串横并阵列连接,如果楼主采用行扫描且总是在扫描整个屏幕,那么16*16的点阵的显示占空比为1/16,这是比静态时要暗很多的.这个问题基本不能解决,最多分开驱动,把占空比提高到1/8,但是很麻烦.
2.原理图里,行和列都对称地用595连接,假如采用行扫描,那么横向放置的595每个IO只需要驱动一个LED,这是595完全胜任的,但是纵向放置的595的某时刻选通的一个IO口则独自驱动0-16个LED,这样的话显然595是不够力的,所以行驱动建议在原来595的基础上加接三极管.
另外,请问6B的595的吸入电流是多大?
发表于 2008-5-23 12:56:11 | 显示全部楼层
楼主,强人!
照上面的图来看,原理图没把点阵的限流电阻画出来。
发表于 2008-8-24 16:32:46 | 显示全部楼层
呵呵,不错,PS手柄的驱动方法,很值得借鉴!
发表于 2008-8-24 20:48:00 | 显示全部楼层
不错,很好!
发表于 2008-9-1 12:42:48 | 显示全部楼层
你是绵阳那个西南科技大学?
发表于 2008-12-7 12:55:44 | 显示全部楼层
不错&nbsp;绝对支持!
发表于 2008-12-7 16:23:12 | 显示全部楼层
好东西,谢谢分享
发表于 2008-12-7 20:09:49 | 显示全部楼层
不错&nbsp;帮顶!
发表于 2008-12-7 22:32:01 | 显示全部楼层
对那个并口双ps2手柄驱动感兴趣,手上正好有个,不过是仿造的,不知道协议是不是相同。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表