小燕子神飞 https://bbs.21ic.com/?606939 [收藏] [复制] [RSS] 何苦去自寻烦恼~~~

日志

我的编译器呀~

已有 700 次阅读2011-3-25 13:28 |系统分类:单片机| 编译器, windows, 回调函数, 俄罗斯方块

    最近碰到一个天大的问题:21IC的博客有限制,上传文件大小不能超过2M,总容量不能超过50M。正好近期我的编译器“重拳升级”,压缩后已经3M了,不能像以前那样上传到博客了。我挖空心思琢磨了半天,终于想出一个解决办法,就是申请一个网络硬盘,把编译器压缩包传到网络硬盘,再把链接地址粘贴在我的博客中,。。呵呵,OK了。


    看看俺的编译器又弄出什么新花样呢?嗯,就是支持电脑编程了。以前都是编译成某种单片机的机器码控制电路去,现在我把它移植到电脑上了,可以像C++,VB那样编出windows程序了。弄了一个寒假才做好的。其实有这个时间我可以学点别的东西,比如ASP网页编程什么的,哎 非要把时间浪费在一个虚幻的事情上,好奇怪。。我都不知道自己怎么想的,。。。前两天去找工作面试,回来后更感觉迷茫了,想想我应该学点正经东西,。。不去弄些歪门邪道的。


    嗯,先不管这些了。看下编译器现在的界面:



   


    这个是一个windows-uC语言的示例程序,控制声卡的:



//注意,这个程序运行后没有界面,只能用任务管理器结束进程


#cpu "PC80X86"


#include "windows\kernel32.c"


#include "windows\winmm.c"


#include "windows\extend\midi.c"


 


unit main


{


    void main()


    {


        midi.open();


       


        //128种音色播放


        for( uint8 ii = 0; ii < 128; ++ii ) {


           


            //设置当前音色


            midi.set_timbre( 0, ii );


           


            //用当前音色播放一遍曲子,曲子一共有64个音符


            for( uint8 i = 0; i < 64; ++i ) {


                uint8 d = song[i];


                uint16 t = d >> 4;


                uint8 scale = d & 0x0f;


                midi.play( 0, 50 + seg[scale], 90 );


                kernel32.Sleep( t * 200 );


                midi.stop( 0, 50 + seg[scale] );


            }


            kernel32.Sleep( 300 );


        }


        kernel32.ExitProcess( 0 );


    }


    //各个音的频率, 3-4 7-1 之间差一个半音,其他的相差一个全音


    []code uint8 seg = {


        //01,02,03,04,05,06,07,01,02,03,04,05,06,07,01,02,03,04,05,06,07


           0, 2, 4, 5, 7, 9,11,12,14,16,17,19,21,23,24,26,28,29,31,33,35


    };


    //敖包相会的曲子,每个字节的高位表示时值;低位表示音阶,0~f依次对应 67-1234567-1234567


    []code uint8 song = {


        0x20,0x48,0x2a,0x2a,0x18,0x17,0x45,0x25,0x47,0x28,0x37,0x18,0x4a,0x88,


        0x20,0x48,0x2a,0x2a,0x18,0x17,0x45,0x25,0x47,0x28,0x27,0x28,0x1a,0x28,0x27,0x85,


        0x25,0x17,0x28,0x2a,0x25,0x24,0x23,0x20,0x44,0x24,0x23,0x34,0x15,0x28,0x27,0x85,


        0x25,0x17,0x28,0x18,0x1a,0x25,0x24,0x23,0x20,0x34,0x17,0x25,0x25,0x33,0x10,0x24,0x23,0x80


    };


}


 
    这就是一个完整的windows程序了,和C语言差不多的。运行后没有界面,只能用任务管理器结束进程啦。它通过声卡播放MIDI音乐,MIDI有128种乐器,这个程序依次用各种乐器播放《敖包相会》的曲子。、、、正好过年那几天,处理编译器的参数传递部分,因为调用自己的函数用EBX寄存器做基址传递形参,而调用DLL函数要用堆栈传递形参,好头疼啊,。。还有一个大晚上,外面爆竹声声,俺还拿着《敖包相会》的谱子,对着一堆数字在计算器上算呀算。。真纠结呀~~  不过后来终于完成的那一刻,听着电脑声卡播放出优美的旋律,呵呵,那种心情,。。。特别好~


    还有一个重量级测试程序--俄罗斯方块,这个比较麻烦了,有windous窗口类,回调函数,消息机制等。编译生成的可执行文件的位置和单片机的一样,比如在某个文件夹建立一个单片机的uC程序,编译后就会在那个文件夹下产生一个HEX文件(没有任何别的中间文件,干净利落~,呵呵),对于windows的uC程序,编译后直接产生一个exe文件,然后双击即可运行。为了方便调试程序,我在编译器的工具栏增加了两个按钮,分别是“编译并运行”和“运行”,这样只需点击一下,保存、编译、运行自动完成,看上去挺时尚的,呵~
游戏运行效果下图这样:


   


    如果各位大侠对这感兴趣,可以点击博客首页myrobot.21ic.org的软件列表找到下载地址,包括编译器源代码、可执行文件,还有一个测试程序集,解压后包括MCS51、AVR、SPCE061A和最近支持的PC80X86的好多测试程序,其实很多程序包括电路图,PCB板等,已经是一个小的电子产品了。上面的俄罗斯方块和播音乐的程序及exe文件都在PC80X86文件夹中。


 


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)