cowboy 发表于 2009-2-16 22:34:38

挑战极限(一)!小玩意,AT89C2051驱动彩显玩方块游戏

89C2051能干什么?这次我打算用它来做个方块游戏,用彩显来显示。
但2051那点速度,那点内存,做起来好不容易。
没有PWM输出,只能用软件模拟彩显的行,场同步信号。
仅128 BIT内存,其中112字节用作显示缓存,剩下给系统的只有16字节了。
硬件倒是简单,所以就连洞洞板也没焊,拿个IC座空中搭桥来测试。
程序还有些BUG,迟些改好后再上传。
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418481.jpg
(原文件名:图1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418482.jpg
(原文件名:图2.jpg)

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418484.jpg
(原文件名:图3.jpg)

以下蓝色文字由版主:xuyiyi 于:2009-08-18,13:08:51 加入。

呵呵,终于做好了,并加了个动感的开机动画,先上视频。
点击此处下载 ourdev_421910.rar(文件大小:2.53M) (原文件名:Tetris.rar)

最新版原理图及 PCB图,终结完美版。
点击此处下载 ourdev_433410.rar(文件大小:49K) (原文件名:终结版VGA_3.rar)

俄罗斯方块游戏源码:
点击此处下载 ourdev_433333.rar(文件大小:12K) (原文件名:俄罗斯方块游戏_V33_源码.rar)

俄罗斯方块游戏Hex码:
点击此处下载 ourdev_472211.rar(文件大小:3K) (原文件名:Tetris33 4051 hex file.rar)

网友 cowboy 设计总结:
整板测试完毕,基本满意。还有一些小毛病:
1、显示网格信号时,发现有轻微拖尾现象,发现是下拉电阻R13(3.3K)过大所致,改为1K后正常。
2、三极管封装丝印画反了,所有三极管全部转 180度安装才正确,即将 C, E 引脚对换。
   切记不要按丝印的那个“D”形来安装,要转180度才正确。
3、电源退耦电容小了点,当扬声器阻抗较低,且电源内阻大时,画面有些干扰。

----------------------------------------------------------------------------------------------

网友 xiaozhiyong 测试 LS2051 总结:
LS2051测试成功了。
关于LS2051每运行一条语句只用一个机器周期,所以在AT2051里的双周期语句后都得加NOP。我改了以后试了下发现能用,现在先发个暂时看着能用的程序。以下是测试程序:
点击此处下载 ourdev_433306.rar(文件大小:2K) (原文件名:LS2051test.rar)

http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_454451.jpg
(原文件名:成品图.jpg)

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_420123.JPG
(原文件名:方块游戏框图.JPG)

http://cache.amobbs.com/bbs_upload782111/files_13/ourdev_425639.PNG
(原文件名:Tetris.PNG)

watercat 发表于 2009-2-16 22:38:24

如果楼主的东西是真货,就快赶上雅达利了……

不过话说回来,我可不太认为如今这年头这种说法是褒奖……

gliet_su 发表于 2009-2-16 22:44:03

不顶不行啊

hyz_avr 发表于 2009-2-16 22:51:05

不错.支持...

cowboy 发表于 2009-2-16 22:58:13

补上电路图
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418501.PNG
(原文件名:图4.PNG)

luckroll 发表于 2009-2-16 23:09:06

支持

kyughanum 发表于 2009-2-16 23:28:18

不顶不行啊!LZ能共享一下程序吗?最好是C的,呵呵!谢谢了!

tage 发表于 2009-2-16 23:35:11

能不能行了,太强了。

chaojiang 发表于 2009-2-16 23:42:39

强烈要求置酷!强烈要求原程序!

cowboy 发表于 2009-2-16 23:44:02

一定就不是C程序了,不用汇编达不到这样的速度。
现在焊上了开关,耳机插座,可以玩了,不过声音不太好听,有待改进。
想配一首开机音乐,不知用哪首好听。
程序仍在改进中,尽些再上传吧。
下面是加了ipod形式开的和在液晶屏上显示效果图。
http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418539.jpg
(原文件名:图5.jpg)

http://cache.amobbs.com/bbs_upload782111/files_11/ourdev_418540.jpg
(原文件名:图6.jpg)

stm32f103c8 发表于 2009-2-16 23:50:29

太强了

ntkz 发表于 2009-2-17 00:09:36

牛!拜下

学习学习!

hhjhhj 发表于 2009-2-17 00:50:57

牛人,服

xiaobendan 发表于 2009-2-17 07:47:34

五体投地了!

lanshuitianxia 发表于 2009-2-17 08:10:55

这电路搭的有个性

yakin 发表于 2009-2-17 08:14:47

这也行啊./emotion/em052.gif

litchiate 发表于 2009-2-17 10:40:47

太,强悍了...没话说了..

zook0k 发表于 2009-2-17 10:50:06

潜力帖,顶.

af00 发表于 2009-2-17 11:39:12

51 有强大的生命力

lookavr 发表于 2009-2-17 11:43:11

太强了

holged 发表于 2009-2-17 12:59:45

恢复后第一次顶帖.

tkdr2001 发表于 2009-2-17 13:26:05

太强了啊,一定要顶,学习!!!

tkdr2001 发表于 2009-2-17 13:36:24

有意思啊

astankvai 发表于 2009-2-17 15:58:11

好东西啊,顶.

hecat 发表于 2009-2-17 16:02:43

不错!顶一下!

hnywx 发表于 2009-2-17 16:40:45

顶顶顶顶顶顶

wfbaaa 发表于 2009-2-17 16:58:09

顶顶顶,好东东

bg6agf 发表于 2009-2-17 17:03:29

强。。。。好强。。。

lin28 发表于 2009-2-17 17:08:30

开眼界了

linfeng286 发表于 2009-2-17 17:10:57

MARK 牛

kenson 发表于 2009-2-17 17:33:42

这么厉害!OX!!

superyongzhe 发表于 2009-2-17 19:28:45

真是不佩服都不行!

zcllsn 发表于 2009-2-17 19:38:53

厉害~我顶你!

dcss 发表于 2009-2-17 20:59:03

这个不顶不行啊,实在是牛人啊

cowboy 发表于 2009-2-18 10:38:54

前两天没空,今天看了下存在的BUG,一时没有什么好的解决方法,请大家出点主意。
问题是如何判断不同形状的方块在移动时是否移出窗外。
试了好几种算法,都很复杂,简单的算法有些不正确,居然卡在这里。
具体情况是用一个8位变量L表示方块原点坐标(x,y),L的低3位表示x,范围0~7,L的bit3~bit6表示y,范围2~15.如何能用便捷的方法判定7种不同方块及4个不同的旋转角度在移动到某坐标时是否越界?

flyunlimit 发表于 2009-2-18 13:09:57

焊工和编程能力都很了得。

hyz_avr 发表于 2009-2-18 13:15:12

先移(或旋转)再判断..

maidong 发表于 2009-2-18 13:28:31

以前也想过实现俄罗斯方块的游戏,VGA显示没用单片机做过,希望能得到源程序看一下。

playboy11 发表于 2009-2-18 13:50:56

jaky80000 发表于 2009-2-18 16:05:11

强烈顶!
LZ是否能把它转成C,然后贴出来,供大家学习一下啊

lyp103 发表于 2009-2-18 16:13:58

这么好的贴,很好看,很好玩,很有劲

lyp103 发表于 2009-2-18 16:17:57

建议楼主先讲一下原理,而后大家在一起想办法解决问题

skoo 发表于 2009-2-18 16:57:45

ding.....

af00 发表于 2009-2-18 17:08:00

【34楼】 cowboy
查表应该可以

cowboy 发表于 2009-2-18 17:22:12

呵呵,现在我也想到了查表,应该可以,就是多花点空间,晚上试试

xian_heping 发表于 2009-2-18 17:54:39

牛人

luojunzhou 发表于 2009-2-18 18:43:44

这个要顶一下

lukeunderwood 发表于 2009-2-18 19:13:29

太强了,期待源码

kewxke 发表于 2009-2-18 19:23:13

这个VGA接口的是怎么通讯的?

h2feo4 发表于 2009-2-18 19:34:54

十分佩服,学习了

xintrone 发表于 2009-2-18 19:40:36

强人,期待程序,汇编无所谓。

zxttgg 发表于 2009-2-18 20:30:17

是4051

zxttgg 发表于 2009-2-18 20:30:17

是4051

cowboy 发表于 2009-2-18 22:51:44

回楼上,手头没有2051,所以用4051代着。目前代码编译后还不够1.5K,用2051完全可以装得下。
之前的越界判断算法,现在用查表基本解决了,正在测试中。
加了一首开机音乐,决定用阿牛的《桃花朵朵开》前奏。
加了一条记分级别状态条,在窗口左侧,分数高柱子就越高。
正打算做一个小图标在窗口右侧,用来提示下一个方块的形状。

jaky80000 发表于 2009-2-19 08:19:35

【53楼】 cowboy
感兴趣的人,很多啊,是不是给大家讲讲思路啊,或是转成C的,把代码分享一下,大家换一个MCU就可以学习了....

cowboy 发表于 2009-2-19 11:15:20

既然大家感兴趣,我就先简单地说一下思路,程序的要点是:
1 产生精准的VGA信号时序
    受速度限制,VGA显示模式用最低的640*480@60Hz,这时行频是31.46875K,场频率是59.94Hz.如果单片机有硬件PWM,则行场同步信号可以轻易用PWM实现.由于2051没有PWM,只能用软件模拟,并且不能用定时中断的方式,因为要求速度太高,中断响应速度不够快,且响应时间也不一致,所以本程序中都是把行同步信号穿插在程序的各个适当位置,类似于双线程并行执行,主振也选用2051能承受的最高频率24MHz.
2 合理分配内存.
    2051只有128字节内存,要储存一幅画面,显示缓存就需占大部分.主窗口内的面积越大,占用内存就越多.经估算窗口内用14行*8列比较合适.此时显示缓冲占用112字节.余下的16字节用于程序中的工作寄器5字节, 堆栈2字节,其它为全局量.
3 协调各个功能模块之间的工作配合
    系统的任务不算多,主要的有显示处理,同步处理,音效处理,按键处理,游戏规则处理(包括方块移动,定时下落,重叠检测,越界检测,得分计数,速度升级).各任务之间协调用类似于状态机的方法,但又不完全等同.由于是用汇编,在很多情况下充分利用汇编的灵活性,使程序的模块化不是很明显.系统的主循环选用显示一帧的时间约16.66MS(60Hz),所有任务必须在这时间内处理完成.

由于程序还在完善中,先发一个临时的版本,大家一起来改进.不是正式版本,注释较少,如果不明之处再单独讨论吧.
点击此处下载 ourdev_420122.rar(文件大小:5K) (原文件名:Tetris11.rar)
http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_420123.JPG
(原文件名:方块游戏框图.JPG)

honami520 发表于 2009-2-19 11:20:44

大哥,你这个我很感兴趣啊!可以详细说说VGA标准吗?我觉得这个很有玩头!!!!!!!

bozai 发表于 2009-2-19 11:33:13

佩服,就冲2051这么点资源。。。。

ivws 发表于 2009-2-19 12:07:16

应了那句话,没有单片机做不到,只有你想不到。

sunmy 发表于 2009-2-19 12:27:12

牛!
支持!

patrickwong 发表于 2009-2-19 15:33:13

楼主能力真强, 很佩服.

早阵子我跟著一个外国的开源CPU项目搞了个硬件,蛮好玩的. 不过作者弄的VGA部份比较占空间(六块PCB),我就想可不可以接一片ISA总线的VGA卡来显示. 应该是可行的, 这个网站 (http://tinyvga.com/avr-isa-vga) 有用单片机接VGA卡的实例. 不过她本身的设计是用ATMega128的, 我想学习移到51上实验一下, 不过汇编部份搞不懂就暂时搁置了.

楼主若有时间及兴趣可否提点一下?

大家若对开源CPU项目有兴趣可到他的网页浏览一下, http://www.mycpu.eu/, 作者也不赖的, 除了CPU外也弄了个实时操作系统.

boat030 发表于 2009-2-19 21:12:23

简直是把51玩到炉火纯青的地步了,用软件模拟VGA信号!强!很强!

srygg 发表于 2009-2-19 21:27:02

等楼主这个项目搞定了,是不是指导大家做个VGA的信号发生器,方便我们修显示器的时候用!

51mcu51 发表于 2009-2-19 22:06:53

顶一下,楼主的钻研精神值得我们学习

qzzz 发表于 2009-2-20 00:43:19

太强了,强烈支持!

haomaiggq 发表于 2009-2-20 08:08:20

佩服。。。。。。

yeyu1234 发表于 2009-2-20 09:40:26

牛!
支持!

zaixian 发表于 2009-2-20 09:58:53

很强悍...51就要用asm才够速度,,,那么用片avr,用c编程速度够了吧!!!!!!!!
另外换1T的51,比如stc10/11 F系列,估计用c页可以了,,,,

看能否移植一下...

418425051 发表于 2009-2-20 09:59:30

佩服佩服

zaixian 发表于 2009-2-20 10:03:40

建议:【55楼】 cowboy

你去stc申请6片,stc新版1T的mcu吧(免费),发个传真就有了......
这样你可以试试用c编译.....

37150839 发表于 2009-2-20 10:12:34

非常不错,顶牛人!

cowboy 发表于 2009-2-20 10:29:05

只要有硬件PWM的MCU,都能产生VGA时序,其它的功能都可以用一般编程的方法,用C来编。AT的2051能行的,STC的也行,AVR也行。
游戏程序也不算难,只是要多花点时间和心思。我也曾用ARM做过方块程序,由于资源丰富,编程容易多了。用2051来做,只是想求证一下低档MCU的极限能力有多强。
转个关于VGA时序的文章,希望对大家有所帮助,http://www.eda121.com/arm/yyarnm/200709/698.html
55楼的程序还有些BUG,程序仍在完善中...

cowboy 发表于 2009-2-20 10:39:13

顺便提一下,电路中晶体标识为24MHz,实际要用用24.1680 MHz才能符合标准。用24MHz晶体,可能有某些显示器不接受。

liulwn 发表于 2009-2-20 11:16:08

相当牛!!

KMZHH 发表于 2009-2-20 11:19:02

牛人,佩服佩服!

zrx737 发表于 2009-2-20 11:26:16

这个太牛了

jaky80000 发表于 2009-2-20 12:14:15

【71楼】 cowboy
虽然能看懂汇编,但还是不太容易,强烈建议LZ把他转成C,让大家理解下,我非常想来试验下.(我都跟了好几帖了 :))谢谢!

gzcc 发表于 2009-2-20 12:19:47

顶一个

xiaozhiyong 发表于 2009-2-20 15:12:57

这个一定要做出来看一下。。。

VGA一定要研究一下,想用M8+C实现,不知速度可以吗用8M的晶振..

cowboy 发表于 2009-2-20 16:05:59

【76楼】 jaky80000,没有C来编是因为C的效率达不到,汇编中的一些技巧也是C不能实现的,所以即使转换成C也不能正常运行了。按贴子上所提供的资料,用其它高性能的MCU来实现,我想大多数的朋友都能编出来。

xiaozhiyong 发表于 2009-2-20 16:54:36

AVR不是速度比51快吗??用C之后,慢一点应该问题不大吧,因为它的整体速度比51快。。。

??

guaibaobao 发表于 2009-2-20 20:21:44

楼主实在是强人呀!

按照楼主的思路用不了C的,没有办法控制代码的(长度)执行时间,估计AVR的芯片用硬件来产生行频和场频也许有些可行,但是估计用C问题很多(或者不可行)!

jaky80000 发表于 2009-2-20 21:38:53

【79楼】 cowboy
这个我了解,C用在2051上肯定是不行的,我们可选择更高级一些的单片机来做的,就是因为没有搞过VGA,所以没有什么头绪,相信很多人都看到了你这个帖都很有兴趣用更高级的MCU,用C来实现它,这样大家就能更好的立即驱动VGA的时序了。
谢谢!

xiaozhiyong 发表于 2009-2-20 22:02:53

请问楼主,对于VGA接口的数据线,应该怎么接,我指的是那些除你的电路图上标出的以外的那些线,如red ground ,green ground ,blue ground,sync ground,...等等,希望你能给我一点指点,希望你能给出所有的线都应该如何接,没有接的也说明,,谢谢,我打算明天也做一下你那个实验。。。。

    请求指点呀。。

    Pin
Name
Dir
Description

1
RED

Red Video (75 ohm, 0.7 V p-p)

2
GREEN

Green Video (75 ohm, 0.7 V p-p)

3
BLUE

Blue Video (75 ohm, 0.7 V p-p)

4
ID2

Monitor ID Bit 2

5
GND

Ground

6
RGND

Red Ground

7
GGND

Green Ground

8
BGND

Blue Ground

9
KEY
-
Key (No pin)

10
SGND

Sync Ground

11
ID0

Monitor ID Bit 0

12
ID1 or SDA

Monitor ID Bit 1

13
HSYNC or CSYNC

Horizontal Sync (or Composite Sync)

14
VSYNC

Vertical Sync

15
ID3 or SCL

Monitor ID Bit 3

管脚 定义

1 红基色 red

2 绿基色 green

3 蓝基色 blue

4 地址码 ID Bit

5 自测试 ( 各家定义不同 )

6 红地

7 绿地

8 蓝地

9 保留 ( 各家定义不同 )

10 数字地

11 地址码

12 地址码

13行同步

14场同步

15地址码 ( 各家定义不同 )

cowboy 发表于 2009-2-20 22:14:51

所有的地连在一起统一接地,其它的不用接。

snn_snn 发表于 2009-2-21 01:10:35

marker

zajia 发表于 2009-2-21 01:22:18

这么好的贴子,顶!同时严重批评自己开了争议贴。

zaixian 发表于 2009-2-21 08:27:08

晶体实际要用24.1680 MHz才能符合标准

那么用24.576,或者24.5M、30M、可以么???(手上只有那么3种)。。。

xiaozhiyong 发表于 2009-2-21 10:17:22

再问cowboy:那个P1.5和P1.3为什么要那样接,难道是一个简单的数模转化?那P1.4和P1.2为什么不也接一个呢???

正在分析你的电路图,请指点。。万分感谢。。

xiaozhiyong 发表于 2009-2-21 10:34:36

这是我在P1.3口看到的波形,好像是有负电压的成分,是那个P1.5产生的吗?这是不是就是我说的一个简单数模转化。。

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421197.jpg
(原文件名:clip_image002.jpg)

如果是这样的话,我要显示一张图(RGB全色)是不是就得给其它的两个通道也加一个这样的电路呢???

期待指点中。。。

cowboy 发表于 2009-2-21 10:39:49

P1.5是一亮度控制引脚,和P1.3(绿色信号)连接,可以产生高亮绿色和墨绿色。在方块主窗口的边框中使用墨绿色,使其避免与绿色的方块混在一起。我新版程序中将还要利用其产生一个橙色的计分柱。至于P1.2(红),P1.4(蓝)为何也不加一个,是因为MCU处理能力有限,不要搞得太复杂。当然用其它MCU,更可以产生更多种绚丽的色彩。

cowboy 发表于 2009-2-21 10:45:15

RE:【87楼】 zaixian 来来,晶体频率最好不要偏离太远,我目前用的是24.166MHz,在三台不同彩显上测试都能正常显示。一般来说CTR显示器的适应范围可能较强,LCD显示器可能对频率要求较严谨。

cowboy 发表于 2009-2-21 10:53:09

RE:【82楼】 jaky80000,要转成C程序可能有点困难,抱歉我C的功底不深,有些处理在C里实在不知如何表达,只能在新版程序中多加点注释了,再配合框图和上面的VGA资料,可能不会太难了吧。个别细节的地方,可以跟贴单独来讨论。

edonkey 发表于 2009-2-21 12:02:49

di好贴,
mark

xiaozhiyong 发表于 2009-2-21 14:58:49

哈哈,我的也成功显示,接下来想好好研究一下楼主的程序。。。

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421257.jpg
(原文件名:IMG0410A.jpg)

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421258.jpg
(原文件名:IMG0411A.jpg)

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421259.jpg
(原文件名:IMG0412A.jpg)

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421260.jpg
(原文件名:IMG0413A.jpg)

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421261.jpg
(原文件名:IMG0414A.jpg)

micmk 发表于 2009-2-21 15:08:26

KAO.理论上不可能滴.行场色差你用12.5M的2051去搞...

cowboy 发表于 2009-2-21 15:33:46

呵呵,94楼这么快呀!红蓝信号线对调了

xiaozhiyong 发表于 2009-2-21 16:57:34

是吗,我再检查检查。。。可能插反了。

对了,我还是想问一下,对于一幅画面的显示,我还是有点不明白。能不能把一幅画显示的时序,画来看看呀。

下面这个时序的数据如何传呀,有大小吗,如红色60%。。之类

http://cache.amobbs.com/bbs_upload782111/files_12/ourdev_421285.jpg
(原文件名:20070919170420847.jpg)

cowboy 发表于 2009-2-21 17:07:25

不好意思是我电路图的BLUE和RED标反了。
VGA传送的是模拟信号,幅度为0~0.75V,如红色60%,就是在红色信号线上加0.45V.

xiaozhiyong 发表于 2009-2-21 18:08:00

如何加0.45V,,上面的电路能实现吗??
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 挑战极限(一)!小玩意,AT89C2051驱动彩显玩方块游戏