[原创]彩色mini摇摇棒(双色) OurDev.cn 首发 ------1-------- 首先,请有兴趣的先了解 杜洋的摇摇棒 http://www.doyoung.net/works/SHOOK16/index.html ,不过本人不推荐也不反对 你去购买他的套件, 不过我还是喜欢自己完全DIY,包括 我做的 其他业余作品,有些创新的小点子是汲取 别人的 ,但实现过程 ,思路和程序 完全 是自己 的 。 我自己 的实物图: (原文件名:20100530(001).jpg) 这段是电池部分 ,还弄了个自锁开关,电源 是 3.7V 的锂电池,从小的MP3上拆下的 。 (原文件名:20100530(002).jpg) 这段 是 单片机 部分,照得不怎么清楚(200w), (原文件名:20100530.jpg) 这是 全貌,就这个样子,中间的 很长的线是电源线 和 用来 下载的 。 拍摄视频:(复制下面地址,用浏览器打开观看) 1. http://player.youku.com/player.php/sid/XMjI1NTQxNjMy/v.swf 2. http://player.youku.com/player.php/sid/XMjI1NTQxNTA4/v.swf 我用 国产的 89C51 单片机上 实现了 彩色显示(两种颜色,红色和绿色 混合显示),这个东东今年四月份做的,做了已经有大半年了,本来不想公布出来,但最终 还是转变了 思想 ,哈哈 大概的原理图如下(本人 因正在 做一个项目,没什么时间,所以 这个图随便画了下,请见谅): (原文件名:100_9115.jpg) 我自己 的实物是 使用的 P1 和 P3 口,有个复位的 引脚 去掉,没有复位部分没什么 问题,单片机 能正常工作,把P3口 的引脚 朝 P1 口那边扭弯点。有两排贴片(0805封装)的LED 灯 1和2,1那一排 LED 左为负极,右为正极。2那一排 LED 右为负极,左为正极。 这样 就行了,但是 亮度较低,最好 分别加个 470~1K 的上拉电阻,那样 就比较亮,但单片机 可能 会有点 微热,不过 没事 的 ,没那么容易 坏 。 最好 能 用 12C5A 系列 的 ,它的IO 口 有个 强上拉 达20 mA,那驱动就 足够 了,,,唉 ,只是 我做的 时候 手头没有。 ,因为我们学校 实验室只有 国产单片机(s x x,这个关键字似乎被屏蔽了)的,懒得自己 买了,穷人 啊>... 上图,我的做的东东实拍图,送给一女生的,每个字的颜色是会换的,还有更强大 的功能,包括动态显示温度(加ds18b20),显示动态的3d图,以后再公布: (原文件名:http_imgload.jpg) (原文件名:http_imgloadCAMZYWG8.jpg) 希望 大家拍砖和仿制,时间 匆忙,写的 不好,有问题请大家多留言,今天 暂时 写道这里,以后我会继续公布,我是mhlyjay,Q我:492364042. ------2------ 部分原理: (原文件名:QQ截图未命名1.jpg) (原文件名:QQ截图未命名2.jpg) (原文件名:QQ截图未命名3.jpg) (原文件名:复件 http_imgload.jpg) 有时间 我再把视频传上来,程序写的不够好,大家就看看吧 **********************************************************/ // mini LED摇摇棒 // 显示64*16像素(x*15) #include <AT89X52.h> #define uchar unsigned char #define uint unsigned int sbit KeyChoose=P0^3; sbit KeyLeft=P2^7; sbit KeyRight=P2^6; sbit Zero=P2^0; uchar Color; uchar code LEDDriverTable[]= { 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, // 1~ 8 0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff // 9~15 }; ///////////////////////////////////////////////////////////////////////// // 汉字字模表 // // 纵向取模下高位,数据排列:从上到下从左到右 // ///////////////////////////////////////////////////////////////////////// uchar code GB16wo[] = // 数据表 { //"你", 0x40,0x00,0x20,0x00,0xF8,0xFF,0x07,0x00, 0x40,0x00,0x20,0x08,0x18,0x04,0x0F,0x43, 0x08,0x80,0xC8,0x7F,0x08,0x00,0x08,0x01, 0x28,0x06,0x18,0x0C,0x00,0x00,0x00,0x00, //"爱", 0x40,0x00,0xB0,0x00,0x92,0x40,0x96,0x30, 0x9A,0x8C,0x92,0x83,0xF2,0x46,0x9E,0x2A, 0x92,0x12,0x91,0x2A,0x99,0x26,0x95,0x42, 0x91,0xC0,0x50,0x40,0x30,0x00,0x00,0x00, //"我", 0x20,0x00,0x24,0x08,0x24,0x48,0x24,0x84, 0xFE,0x7F,0x23,0x02,0x22,0x21,0x20,0x10, 0xFF,0x09,0x20,0x06,0x22,0x1A,0xAC,0x61, 0x20,0x80,0x30,0xE0,0x20,0x00,0x00,0x00, //"吗", 0x00,0x00,0xFC,0x1F,0x04,0x08,0x04,0x08, 0xFE,0x1F,0x04,0x08,0x02,0x08,0xFA,0x09, 0x02,0x09,0x02,0x09,0x02,0x0D,0xFF,0x49, 0x02,0x81,0x80,0x7F,0x00,0x01,0x00,0x00, //"?", 0x00,0x00,0x00,0x00,0x30,0x00,0x38,0x00, 0x28,0x00,0x04,0x00,0x04,0x20,0x04,0x70, 0x84,0x73,0x84,0x21,0xC4,0x00,0x4C,0x00, 0x78,0x00,0x30,0x00,0x00,0x00,0x00,0x00 }; /*****n(us)延时子程序*****/ void Delay(uint N) { uint x,y; for(x=0; x<=N;x++) for(y=0;y<=2;y++); } void DisplayPoint(uchar LEDChoose, uchar Color)//bit Color)?//,uint DisplayTime) //15(×2)LED //LEDChoose(Up 1~15 Down),Color(0:Green;1:Blue),DisplayTime () {// uchar t; //t=(LEDChoose-1)+Color*8; if(LEDChoose>=1&LEDChoose<=8) { P1=LEDDriverTable[(LEDChoose-1)+Color*8]; P3=(!Color)*0xff; //!or~ } else if(LEDChoose>=9&LEDChoose<=15) { P3=LEDDriverTable[(LEDChoose-1-8)+(Color*8)]; P1=(Color)*0xff; } else { P1=0xff; P3=0xff; } //Delay(DisplayTime); // } void YScanDisplay(uchar YDisplay,uint DisplayTime,uchar UorD) //YScanDisplayData(8bit) ; { //bit PointTable[8]; // uchar PointTable[8]; //! LEDChoose is (Up 1~15 Down) uchar i=0; for(i=1;i<=8;i++) //{ // while(YDisplay!=0) { // PointTable=(bit)(YDisplay&0x01); if((bit)(YDisplay&0x01)!=0) //target: (共阴~取反~共阳) { DisplayPoint(i+UorD*8,Color); //Color Delay(DisplayTime); } YDisplay>>=1; // i++; } //} // for(i=0;i<=7;i++) //while(PointTable!='\0') // { // i++; // } } void XScanDisplay() { } /*****主函数*****/ void main(void) { uchar tt,ccc=1; bit cc=0; Zero = 0; while(520) // if(KeyRight=0) { if(KeyChoose=0)cc=!cc; while(KeyLeft); Delay(1400); for(tt=1;tt<=160;tt++) { YScanDisplay(GB16wo[tt],2,tt%2); if(++ccc==32){ Color=!Color; ccc=0;} } P1=0xff; P3=0xff; while(KeyRight); Delay(1400); for(tt=160;tt>=1;tt--) { YScanDisplay(GB16wo[tt],2,tt%2); if(++ccc==32){ Color=!Color; ccc=0;} } P1=0xff; P3=0xff; }; //////////////////////以下为最开始 的硬件测试程序,用来检测LED 有没有焊接好,有没有焊接烧坏等/////////////////////////// //效果是 :首先是第一排亮,然后是第二排亮,最后 全亮,当然这只是看起来全亮,但是 LED 不可能真正同时亮,实际上,某一时刻,只有一个被点亮 /* // P1=0x80; // P3=0x80; for(tt=0;tt<=15;tt++) { DisplayPoint(tt,1); Delay(10000); } for(tt=0;tt<=15;tt++) { DisplayPoint(tt,0); Delay(10000); } while(520){ for(tt=0;tt<=15;tt++) { DisplayPoint(tt,1); Delay(350); DisplayPoint(tt,0); Delay(700); }} while(520); // while(1) // { //-----------忧伤的分割线-----------// P1=0xfe; //0b delay(100); P1=0x01; //0r delay(100); P1=0xfc; //1b delay(100); P1=0x03; //1r delay(100); P1=0xf8; //2b delay(100); P1=0x07; delay(100); //2r P1=0x; //b delay(100); P1=0x; //r delay(100); while(1); // } */ } /*****END*****/ 本贴被 mhlyjay 编辑过,最后修改时间:2010-11-27,14:36:51. |
文章评论(0条评论)
登录后参与讨论