回到柳州后,虽然他的工作不是电子技术,但是业余生活中还是和电机技术混在一起。呵呵。早在一年前就在论坛上看见有网友用单片机做了旋转LED时钟,当时就心痒痒的想做一个,但是由于时间和材料问题,一直没有做成。这次有了点阵屏的数据算法经验,做LED旋转屏就容易多了。我和张魁分工合作,他负责机械设计,我负责程序编写。可别小看机械这一块。难度是相当大的,主要处理好旋转时的平衡和供电就很难了。今天机械样本已经做出,我们通过一天的努力,终于让旋转LED屏显示出了内容。 #include <reg52.h> sbit hall = P2^7;//霍尔信号,低电平unsigned char dang_qian_lie;//当前扫描到哪一列 unsigned char wei_fan_zhuan,wei_fz;//P0口位反转临时变量 unsigned int pian_yi_liang;//控制走字偏移量 unsigned char code LEDDOT[]={点阵数据}; void delay(unsigned time) { while(time--);//延时 } void main(void) { while(1) { while(hall);//等待霍尔信号变低 dang_qian_lie=0;//当前扫描列复位 pian_yi_liang++;//走屏偏移量+1 if(pian_yi_liang>1245){pian_yi_liang=0;}//判断扫过一圈了没有,736是图片宽度 while(dang_qian_lie<=200)//扫描一圈的图像宽度 { dang_qian_lie++;//当前扫描列+1 P3=LEDDOT[dang_qian_lie+pian_yi_liang];//P3口LED数据=当前列+偏移量 P1=LEDDOT[dang_qian_lie+1245+pian_yi_liang];//P1口数据=当前列+图片宽度+偏移量 wei_fz=LEDDOT[dang_qian_lie+2490+pian_yi_liang];//P0口数据=当前列+图片宽度X2+偏移 量 wei_fan_zhuan=0;//临时变量初始化 if(wei_fz&0x01){wei_fan_zhuan=wei_fan_zhuan|0x80;} if(wei_fz&0x02){wei_fan_zhuan=wei_fan_zhuan|0x40;} if(wei_fz&0x04){wei_fan_zhuan=wei_fan_zhuan|0x20;} if(wei_fz&0x08){wei_fan_zhuan=wei_fan_zhuan|0x10;} if(wei_fz&0x10){wei_fan_zhuan=wei_fan_zhuan|0x08;} if(wei_fz&0x20){wei_fan_zhuan=wei_fan_zhuan|0x04;} if(wei_fz&0x40){wei_fan_zhuan=wei_fan_zhuan|0x02;} if(wei_fz&0x80){wei_fan_zhuan=wei_fan_zhuan|0x01;} P0=wei_fan_zhuan;//数据输出 delay(40);//字体宽度,与旋转速度有关,值越大字越宽 P1=0XFF;//关闭LED,准备下一次扫描 P3=0XFF;//关闭LED,准备下一次扫描 P0=0XFF;//关闭LED,准备下一次扫描 } } }
|
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |