
单片机——摇摇棒制作.doc
11页摇摇棒·原创· [图片] 2011年05月13日 15:17 阅读(130) 评论(10) 分类:个人日记 主题名:摇摇棒背景:想信小时候有玩过香火或者烟花的吧,当香火或者烟花在手中晃动的时候,你会看到什么?对,好看的火花画面···功能:本作品当你拿在手中以较快的速度左右摇摆的时候,由于人眼视觉暂留效应,会在作品经过的幅平面内显示文字,图画,以及发挥你的想象···你想DIY一个么,你想给你的女友一个惊喜么,你想···?想就快快动手吧··· 前一阵子,应同学邀请,合作了一批32个LED的摇摇棒,其实哥们动机不纯(哈哈··他死不承认··不要告诉他是我说的啊·),为了满足他的心愿,程序+调试,花了一个晚上给他写了,现在将资料整理···发出来···欢迎拍砖···东西简单,鼓励大家自己动手制作,如果哥们有桃花运,不要忘记给我发喜糖啊··抓住时间,超越空间,飞往另一个世界···照片名称:也许,相见不如怀念··照片名称:也许这就是人间的四月天吧··照片名称:爱你,疼你,你会知道么?照片名称:让我们相约同一个地方···照片名称:实物照片名称:电路图(可以联系索取·) /********程序功能:32*32点阵 摇摇棒程序版本:2011年4月11日2:35:38 V2.5程序设计者:消失的电波(彭杰)程序修改者:/********/// 此为自定义头文件,具体请参见STC89C52RC/89C54RD+/89C58RD+ 系列芯片 // datasheet中PQFP-44/PLCC-44封装关于P4口的引脚定义以及内部地址声明#include
每次取4个字节,一个汉字循环32次取完,每帧显示5个汉字 for(i=0;i<160;i++) { // 此程序中采用按列,高位在前的取模方式,每次取4个字节,也就是1列送至P0-P3口显示 P0=DisAdd[4*i]; P2=DisAdd[4*i+1]; P3=DisAdd[4*i+2]; P1=DisAdd[4*i+3]; // 延时片刻,清除显示 delay(delayTime); P0=0xFF; P1=0xFF; P2=0xFF; P3=0xFF; // 延时片刻,保证LED点亮与熄灭的时间基本相同 delay(delayTime); } // 退出显示子函数,清除显示 P0=0xFF; P1=0xFF; P2=0xFF; P3=0xFF;}/********/// 外部中断2,中断向量号为6void EX_INT2(void) interrupt 6{ // 关闭全局中断 EA = 0; if (!P4_3) { // 延时消抖,在12MHz晶体时大概为20ms delay(2000); // 松手检测 while(!P4_3); // 画面切换标志加1 changeFlag++; // 显示6帧数据 if (changeFlag >= 7) { changeFlag = 1; } // 将changeFlag的值赋给P1口显示,即指示即将显示的是第几帧数据 P1 = ~changeFlag; } // 使能全局中断 EA = 1; }/********/// 外部中断3,中断向量号为7// 外接一只颠倒开关或水印开关至32引脚,即P4^2,每中断一次显示一帧数据void EX_INT3(void) interrupt 7 //格式区别。
{ // 关闭全局中断 EA = 0; // 在此延时是为了让汉字能够显示在摆幅平面的中间位置,根据摆动速度进行调节 // 当然可以设置为自动调节,请读者发挥想象自行设计 delay(5000); // 选择显示图画,changeFlag通过按键改变其值 switch (changeFlag) { case 1 : // 显示第1帧数据 // 人间四月天 Display(tab1,10); break; case 2: // 见或者不见 Display(tab2,10); break; case 3: // I Love You Display(tab6,10); break; case 4: // 消失的电波 Display(tab4,10); break; case 5: // Display(tab5,10); break; case 6: // 2011.04.11 Display(tab3,10); break; default : break; } // 重新打开中断 EA = 1; }// 主函数void main(void){ // 使能全局中断 EA = 1; // 使能外部中断3 EX3 = 1; // 下降沿中断 IT3 = 1; // 使能外部中断2 EX2 = 1; // 下降沿中断 IT2 = 1; // 将changeFlag的值赋给P1口显示,即指示即将显示的是第几帧数据,初始为第一帧 P1 = ~changeFlag; for(;;) { // 检测按键是否按下 // 此处按键检测利用中断,如果不用中断,也可以将EX_INT2中程序cut至此。
} }。
