分享一个基于STC12C5A60S3单片机的pov彩灯设计,含代码
旋转LED显示原理介绍 如何让一列灯旋转起来感觉像稳定的字显示在空中呢?首先我们来分析下人的眼睛,其实人的眼睛非常好骗的,只要让电机扫描的快一点就行了,实际上肉眼在24帧/秒以上就不会看到闪烁的,所以要保证电机的速度能在一秒转24圈以上,这样的话人眼就觉得旋转的字很稳定很清晰的显示在空中了。 旋转LED旋转起来是一个圆,那么就需要有一个传感器来判断起点位置,有人用霍尔传感器,有人用红外对管,笔者觉得用红外对管来的便宜些,而且实现起来也容易。这个起点检测非常重要,单片机就是根据这个起点来判断是否要开始显示 数据的。如果起点检测不到 单片机就不开始显示。 如何让一列灯不断的送数据实现一个文字的显示呢?这个我们就要了解文字取模的原理了,这里以PC2002字幕软件为例,取一个16*16的中文字,见字幕选项设置: 从第一列开始向下每取8个点作为一个字节,如果最后不足8个点就补满8位。 取模顺序是从低到高,即第一个点作为最低位。如*-------取为00000001
取模后如下表:0xFF,0x7F,0xFF,0xBF,0x3F,0xC8,0xBF,0xFB,0xBF,0xFB,0xBF,0xEB,0x80,0x9B,0xB7,0xFB,0xB7,0xEB,0xB7,0x9B,0xB7,0xFB,0x37,0xF8,0xF7,0xEF,0xF7,0x1F,0xFF,0xFF,0xFF,0xFF,/*"点",0*/ 现在我们知道16*16取模是一列一列取的了,一列有2个字节,一共16列,所以一个16*16的汉字就有32个字节,需要占用单片机的Code空间 32个字节。然后再结合硬件来分析,如下图: 一列灯16个 刚好对应16*16一个汉字的一列:2个字节,所以把取模到的数据依次送到P2口 和P4 P5口,这里硬件中P4 P5组成一个字节,所以显示程序如下: for(i=0;i<16;i++) //送16列 显示 这里只显示一个字。 { P2=zimo[i*2]; //送数据低位显示 P4=(zimo[i*2+1]);//送数据高位显示 这里用了单片机P4 和P5口 是LQFP48脚才有的IO口 P5=(zimo[i*2+1])>>4;//这里行和列 都是IO口独立驱动的LED DelayUs(200); //延时让LED亮起来 每列延时的时间 P2=0XFF; P4=P5=0XFF; } 在什么时候送显示呢?单片机IO一判断到 红外接收管接收到起点信号,就开始显示,显示完16列后等待下一次的起点信号。这样只要电机的速度够快就会稳定的把字显示字空中了。平面的文字显示同理。 如何让一组文字不断的移动?这就需要一个字幕计数器,旋转LED每旋转一圈,这个字幕计数器就加一,指向下一列,这样不断的刷新,感觉文字就在移动了,程序如下: j就是字幕计数器,每转一圈j就会加1; if(KEY==0) //红外接收管 判断起始位 { j++; if(j>672) //根据显示的字数定义改数值672/16=42个字 显示完42个字后 重新开始 { j=0 ; } for(i=j;i<128+j;i++) //每转一圈 前进一列 这里定义一圈中同时显示128/16=8个字, { P2=zimo[i*2]; //送数据低位显示 P4=(zimo[i*2+1]);//送数据高位显示 这里用了单片机P4 和P5口 是LQFP48脚才有的 P5=(zimo[i*2+1])>>4;//这里行和列 都是IO口独立驱动的LED DelayUs(200); //延时让LED亮起来 每列延时的时间 P2=0XFF; P4=P5=0XFF; } 最后一点是供电的问题,旋转LED供电问题是比较麻烦的,这里我采用了无线供电方式,经过实践论证,功率很有限,需要改进的地方还很多,电路原理是把直流转成交流,然后经过初级线圈 ,最后次级线圈感应得电,经过整流滤波后给旋转部分供电,直流转交流部分电路是一个自激震荡电路。动手能力强的朋友经过改造电机电刷方法实现,如果有条件制作的欢迎用此种方式。 




单片机源程序如下:
- /*************************************************************
- 旋转LED综合功能程序 平面立体一起显示
- 单片机 STC12C5A32S2
- 运用无线供电方法 旋转起来平静 (特别说明;旋转LED转接塑料需放点纸巾压进电机轴,这样旋转起来摩擦力才够大,够稳定。这个对旋转是否安静影响很大
- 一个就是配重的问题,利用两个铜柱可以配平衡,长铜柱固定在旋转方向那头,即后备电池正极旁边,短铜柱在另一边) 结构做的好旋转是非常静的,几乎是一台风扇!
- 字模软件用的PC2002
- 实现效果:1.立体显示旋转字 (通过 “暂停按键” 进行静态与移动显示8-29更新
- 2.平面显示数字时钟 年月日 星期+\立体显示字(时钟可调 时钟芯片用DS1302 带后备电池 掉电时钟继续走)
- 3.平面显示模拟表盘时钟 (如果表盘不全或者过多显示 请按配套的遥控器"快进"或者"快退"来调整单列显示时间 设置后参数保存到DS1302RAM 中 下次启用无需调整 2012-8-28)
- 4.平面\立体显示字体模式 通过 “暂停按键” 进行静态与移动显示8-29更 新
- 5.立体下拉显示字+停顿
- 6.两颗心闪动
- 7.一颗心填满效果
- 8.笑脸动画
- 9.打印字效果 (打印一封写给亲爱的信)
- 10.立体显示时间+显示文字
- 上述10种效果对应遥控器按键1、 2、 3、 4、 5、 6、 7、 8、 9 、0 原时钟复位按键 改到按键“Meun”
- 通过上位机改 立体显示字 平面显示字
- ***************************************************************/
- #include "NEW_8051.H"
- #include "task.h"
- #include <stddef.h>
- #define ucNumRows 224//224 //定义一周显示字个数 一个字16列 224/16=13个字
- #define uclineNumRows 104//定义立体显示时间中的立体显示文字
-
- sbit Led1=P3^0;//最里面LED
- sbit Led2=P3^1;
- sbit Led3=P3^4;
- uchar Delay=1 ;
- bit BIT_timeout=0;
- uint uitime=0;
- data uint uiicount=0;
- uint uiCountFontNumber=0;
- uint uiPrintFontNumber=0;
- uchar ucMode=1;
- data uint uiicountTwo=0;
- uchar BuffCount=0;
- uchar ucPCA0_TimeCount;
- data uint uiBaseAddress=0;
- data uint uiFontNumber=0;
- data uint uiFontNumber_P=0;
- data uchar ucNumRows_p=160;
- uchar DelayTimeCount=0;
- bit Stop_move=0;
- uchar Mod=0;
- uchar Buff[448]=0xFF;
- uchar ucLine_count=0;
- uchar Row;
- uchar k;
- bit Error=0;
- uchar Stop_time=0;
- uchar ucline=0;
- bit bDot=0;
- uchar code sw[8]={0XFE,0XFC,0XF8,0XF0,0XE0,0XC0,0X80,0X00};
- void delay_200ms(void);
- uchar code liushui[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//流水扫描数据
- /***************模拟表盘变量**************/
- uint DISP_LINE=0;
- uchar DISP_LINE_ADJ=0;
- uchar DISP_TIME_ADJ=0;
- uchar Time0_count=0;
- //====参数初始化
- uchar DISP_TIME_SET = 100 ; //单列显示时间设置值
- /********************************************/
- /*********延时子程序**********/
- void delay(unsigned char n) //每列显示的时间
- {
- unsigned char a,b,c;
- c=2;//+DelayTimeCount;
- for(;n>0;n--)
- {
- for(b=45;b>0;b--)
- for(a=c;a>0;a--);
- }
- }
- /*********延时子程序**********/
- void delay_PIC(unsigned char n) //每列显示的时间
- {
- unsigned char a,b,c;
- c=2;//+DelayTimeCount;
- for(;n>0;n--)
- {
- for(b=38;b>0;b--)
- for(a=c;a>0;a--);
- }
- }
- /*********PCA中断子程序**********/
- void PCA() interrupt 7 //PCA定时器
- {
- if( CCF0 )
- {
- CCF0 = 0;
- CL = 0;
- CH = 0;
- ucPCA0_TimeCount++;
- if(ucPCA0_TimeCount>12)
- {
- ucPCA0_TimeCount=0; //调时闪烁
- if(ucMode==2)
- {
- flag=~flag;
- }
- }
- }
- }
- /************************************/
- void Timer0Interrupt(void) interrupt 1
- {
- TF0=0;
- TR0=0;
- TH0 =(65536- DISP_TIME_SET)/256;
- TL0 =(65536- DISP_TIME_SET)%256;
- TR0=1;
- //if ( ++Time0_count > 250 ) Time0_count = 250 ; //溢出计数器+1,>最大值,=最大值
- if ( ++DISP_LINE > 180 ) DISP_LINE = 0 ; //显示列计数器+1,>最大值,=0
- /***********清空显示************/
- P1=0XFF ;
- P0=0XFF ;
- Led1=0;
- Led2=1;
- Led3=1;
- /*************形成表盘*******************/
- switch (DISP_LINE)
- {
- case 180*1/12 : //1点
- case 180*2/12 : //2点
- case 180*4/12 : //4点
- case 180*5/12 : //5点
- case 180*7/12 : //6点
- case 180*8/12 : //7点
- case 180*10/12 : //10点
- case 180*11/12 : //11点
- P1=0x3F;
- break;
- case 180*3/12 : //3点
- case 180*6/12 : //6点
- case 180*9/12 : //9点
- case 0: //12点
- P1=0x1F;
- break;
- }
- /****************************************/
- //显示指针"时"
- // i = Hour ;
- // j = Hour ;
- // if ( ++i > 179 ) i=0 ; //i+1,结果>179,则清零
- // if ( --j > 179 ) i=179 ; //j-1,结果为负,则重新赋值179
- if(( (Hour-3)<=DISP_LINE)&&((Hour+3)>=DISP_LINE) )
- {
- if(((Hour-2)==DISP_LINE)||((Hour+2)==DISP_LINE))
- P0=0XFB;
- else if(((Hour-3)==DISP_LINE)||((Hour+3)==DISP_LINE))
- P0=0XFD;
-
- }
- if(Hour==DISP_LINE)//||(DISP_LINE==i)||(DISP_LINE==j
- {
- P1=P1|0X1F ;
- P0=0XF0 ;
- Led1=0;
- Led2=0;
- Led3=0;
- }
- //显示指针"分"
- if(( (Cent-2)<=DISP_LINE)&&((Cent+2)>=DISP_LINE) )
- {
- if(((Cent-1)==DISP_LINE)||((Cent+1)==DISP_LINE))
- P0=0XBF;
- else if(((Cent-2)==DISP_LINE)||((Cent+2)==DISP_LINE))
- P0=0XDF;
-
- }
- if(Cent==DISP_LINE)
- {
- P1=P1|0X1F ;
- P0=0X00 ;
- Led1=0;
- Led2=0;
- Led3=0;
-
- }
- //显示指针"秒"
- if(( (Sec-2)<=DISP_LINE)&&((Sec+2)>=DISP_LINE) )
- {
- if(((Sec-1)==DISP_LINE)||((Sec+1)==DISP_LINE))
- P1=P1&0XF7 ;
- else if(((Sec-2)==DISP_LINE)||((Sec+2)==DISP_LINE))
- P1=P1&0XFB ;
-
- }
- if(Sec==DISP_LINE)
- {
- P1=P1&0XE0 ;
- P0=0X00 ;
- Led1=0;
- Led2=0;
- Led3=0;
-
- }
- //}
- }
- /*********中断子程序**********/
- void int0() interrupt 0 //使用外部中断0
- {
- EX0=0;
- BIT_timeout=1;
- if(ucMode==0x03)
- {
- //调整单列显示时间设置值(模糊控制)
- // if ( Time0_count > 183 )
- // {
- // if ( Time0_count > 220 ) DISP_TIME_SET = DISP_TIME_SET + 4 ;
- // else if ( Time0_count > 200 ) DISP_TIME_SET = DISP_TIME_SET + 3 ;
- // else if ( Time0_count > 185 ) DISP_TIME_SET = DISP_TIME_SET + 2 ;
- // else DISP_TIME_SET = DISP_TIME_SET + 1 ;
- //
- // if ( DISP_TIME_SET > 2000 ) DISP_TIME_SET = 2000 ; //钳位
- //
- // }
- // else if ( Time0_count < 180 )
- // {
- // if ( Time0_count < 140 ) DISP_TIME_SET = DISP_TIME_SET - 4 ;
- // else if ( Time0_count < 160 ) DISP_TIME_SET = DISP_TIME_SET - 3 ;
- // else if ( Time0_count < 175 ) DISP_TIME_SET = DISP_TIME_SET - 2 ;
- // else DISP_TIME_SET = DISP_TIME_SET - 1 ;
- // if ( DISP_TIME_SET < 100 ) DISP_TIME_SET = 100 ; //钳位
- //
- // }
- //
- // DISP_TIME_SET=DISP_TIME_SET+DISP_TIME_ADJ;
- // Time0_count=0; //溢出计数器 = 0
- TR0=0;
- TH0 =(65536- DISP_TIME_SET)/256;
- TL0 =(65536- DISP_TIME_SET)%256;
- TR0=1;
- DISP_LINE =0;// DISP_LINE_ADJ ; //显示列计数器(0~179)=校正值
- du1302();//获取时间
- Sec=59-(Sec/16*10+Sec%16) ; //由于电机反转 所以需要用最大值减去当前值
- Cent=59-(Cent/16*10+Cent%16) ;
- Hour=Hour/16*10+Hour%16 ;
- if(Hour>11)
- {
- Hour=Hour-12;
- }
- Hour=12-Hour;
- Sec=Sec*3;//秒针定位="秒"*3
- Hour=(Hour*15)+(Cent/4);//时针定位="时"*15+"分"/4
- Cent=Cent*3;//分针定位="分"*3
-
- }
- EX0=1;
- }
- /********************************/
- void start(void)
- {
- P1=0XFF;
- P2=0XFF;
- P0=0XFF;
- P3=0XFF;
- P4=0XFF;
- P5=0XFF;
- // uiFontNumber=(byte_read(0x0100)<<8)+byte_read(0x0101);
- uiFontNumber=((byte_read(0)<<8)+byte_read(1))*16; //读取EEP立体数据总数
- uiPrintFontNumber=uiFontNumber*2;
- uiFontNumber_P=((byte_read(0x3600)<<8)+byte_read(0x3601))*16; //读取EEP平面数据总数
- //ucNumRows=R1302(ucNumRows_adder+1)*16; //读立体一圈中显示字总数
- // if(ucNumRows<16)
- // {
- // ucNumRows=224;
- // }
- // ucNumRows_p=R1302(ucNumRows_p_adder+1)*16;
- // if(ucNumRows_p<16)
- // {
- // ucNumRows_p=96;
- // }
- //Send_data(uiFontNumber>>8);
- //Send_data(uiFontNumber);
- //Send_data(BCD2DEC(R1302(LINE_ADJ_adder+1)));
- // DISP_LINE_ADJ=BCD2DEC(R1302(LINE_ADJ_adder+1));//读取列计数器校正值
- // if(DISP_LINE_ADJ>20)//防止值过大
- // {
- // DISP_LINE_ADJ=0;
- // }
- //write_1302Data(DISP_TIME_adder,160);
- // DISP_LINE = DISP_LINE_ADJ ; //显示列计数器(0~179)=校正值
- // DISP_TIME_SET=DISP_TIME_SET+ DISP_TIME_ADJ;
- //DISP_LINE = DISP_LINE_ADJ ; //显示列计数器(0~179)=校正值
- //uiAllRows=uiAllRows-128;;
- }
- /***************************************/
- void OS_ALLRun(void)
- {
-
- //BIT_timeout=1;
- if(BIT_timeout)//起始点
- {
- BIT_timeout=0;
- Error=1;
- if( new_code ) //有红外按键
- {
- new_code=0;
-
- //Send_data(key_code);
- switch( key_code ) //根据不同的按键值执行不同的动作
- {
- case 0x07:
- if(ucMode==3)
- {
- if(DISP_TIME_SET<250)
- {
- DISP_TIME_SET++;
- write_1302Data(DISP_TIME_adder,DISP_TIME_SET);//写入DS1302 RAM中保存
- }
- }
- else
- {
- DelayTimeCount++;//单列延时时间+
- }
- break;
-
- case 0x09://
- if(ucMode==3)
- {
- if(DISP_TIME_SET>20)
- {
- DISP_TIME_SET--;
- write_1302Data(DISP_TIME_adder,DISP_TIME_SET);//写入DS1302 RAM中保存
- }
- }
- else
- {
- if(DelayTimeCount>0)//单列延时时间-
- DelayTimeCount--;
- }
- break;
- /*********************************/
- case 0x0C:
- ucMode=0x01;//立体显示字 移动效果+静态显示
- CR=0;
- TR0=0;
- uiCountFontNumber=0;
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- case 0x1C:
- ucMode=0x05;//立体显示字 下拉效果+静态显示
- CR=0;
- TR0=0;
- Led1=1;
- Led2=1;
- Led3=1;
- uiCountFontNumber=0;
- break;
- case 0x5A:
- ucMode=0x06;//立体显示简单动画
- CR=0;
- TR0=0;
- uiCountFontNumber=0;
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- case 0x42:
- ucMode=0x07;//立体显示心型变化
- CR=0;
- TR0=0;
- uiCountFontNumber=0;
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- case 0x52:
- ucMode=0x08;//笑脸变化
- CR=0;
- TR0=0;
- uiCountFontNumber=0;
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- case 0x4A:
- CR=0;
- TR0=0;
- uiCountFontNumber=0;
- ucMode=0x09;//打印字效果
- ucLine_count=0;
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- case 0x16:
- CR=0;
- TR0=0;
- uiCountFontNumber=0;
- ucMode=0x0A;//立体显示时间 与文字
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- case 0x18:
- TR0=0;
- CR=0;
- Auto_Set1302(starts_time);
- ucMode=0x02;//数字钟模式
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- case 0x5E:
-
- DISP_TIME_SET=R1302(DISP_TIME_adder+1);//读取单列显示时间
- //Send_data(DISP_TIME_SET);
- if((DISP_TIME_SET>250)||(DISP_TIME_SET<20)) //防止值过大 过小
- {
- DISP_TIME_SET=115;
- }
- ucMode=0x03;//指针时钟模式
- TR0=1;
- CR=0;
- Led1=0;
- break;
- case 0x08:
- ucMode=0x04;//平面显示字模式
- CR=0;
- TR0=0;
- uiCountFontNumber=0;
- Led1=1;
- Led2=1;
- Led3=1;
- break;
- /*********************************/
- case 0x40: //调时加
- if(ucMode==0x02)
- {
- Set(id,1);
-
- }
- else if(ucMode==0x03)
- {
- if(++DISP_LINE_ADJ>179) //盘面校正值
- {
- DISP_LINE_ADJ=0;
-
- }
- write_1302Data(LINE_ADJ_adder,DISP_LINE_ADJ);//写入DS1302 RAM中保存
- }
- break;
- case 0x19: //调时减
- if(ucMode==0x02)
- {
- Set(id,0);
- }
- else if(ucMode==0x03)
- {
- if(--DISP_LINE_ADJ==0) //盘面校正值
- {
- DISP_LINE_ADJ=179;
-
- }
- write_1302Data(LINE_ADJ_adder,DISP_LINE_ADJ);//写入DS1302 RAM中保存
- }
- break;
-
- case 0x15://调时切换
- if(ucMode==2)
- {
- id++;
- //CCAPM1 = 0x49; //开PCA0中断
- //CCAPM0 = 0x00; //关PCA1中断
- CR=1;//启动PCA计数
- if(id>4)
- {
- id=0;
- CR=0;//关闭PCA计数
- // CCAPM0 = 0x00;//关PCA0中断
- }
- }
- else if((ucMode==4)||(ucMode==5)||(ucMode==1))
- {
- Stop_move=~Stop_move;
- }
- break;
- case 0x47://时钟初始化
- Set1302(starts_time); //初始化
- W1302(0x8e,0x00); //控制命令,WP=0,写操作
- W1302(0x90,0xa5); //打涞二级? 一个二级管串联一个2K玷
- //write_1302Data(DISP_TIME_adder,160);
- break;
- default: break;
- }
- key_code=0;
- }
- //DelayTime=TimeCount/(ucNumRows+60);
- //TimeCount=0; //延时周期计数清零
- switch (ucMode)
- {
- case 0x01://立体显示字移动模式
- //uiCountFontNumber++;
- Led3=1;
- P1=0XFF;
- P0=0XFF;
- if(Stop_move==0) //是否暂停移动
- {
- uiCountFontNumber++;
- }
- if(uiCountFontNumber >uiFontNumber ) //uiFontNumber
- {
-
- uiCountFontNumber = 0;
-
- }
- for( uiicount = uiCountFontNumber;uiicount<ucNumRows+uiCountFontNumber+32;uiicount++)
- {
-
- P2=byte_read(2+uiicount*2);//读取内部EEPROM字幕数据 数据在2地址后 所以要加上2
- P4=byte_read(2+uiicount*2+1);
- P5=byte_read(2+uiicount*2+1)>>4;
- delay(1);
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
-
- break;
- }
- }
- break;
- case 0X0A://立体显示时间 与文字
- du1302();
- Show_line_time();//立体显示时间
- delay(48);
- uiCountFontNumber++;
- if(uiCountFontNumber >uiFontNumber ) //uiFontNumber
- {
-
- uiCountFontNumber = 0;
-
- }
- for( uiicount = uiCountFontNumber;uiicount<uclineNumRows+uiCountFontNumber;uiicount++)
- {
-
- P2=byte_read(2+uiicount*2);//读取内部EEPROM字幕数据 数据在2地址后 所以要加上2
- P4=byte_read(2+uiicount*2+1);
- P5=byte_read(2+uiicount*2+1)>>4;
- delay(1);
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
-
- break;
- }
- }
- break;
- case 0x05://立体显示字下拉模式
- //uiCountFontNumber++;
- {
- if(uiCountFontNumber >uiFontNumber ) //uiFontNumber
- {
-
- uiCountFontNumber = 0;
-
- }
- for( uiicount = 0;uiicount<ucNumRows;uiicount++)
- {
-
- P2=Buff[uiicount*2];//读取内部EEPROM字幕数据 数据在2地址后 所以要加上2
- P4=Buff[uiicount*2+1];
- P5=Buff[uiicount*2+1]>>4;
- delay(1);
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
-
- break;
- }
- }
-
- /****************************************/
- switch (Mod) //根据当前状态显示
- {
- case 0://下拉显示
- for(k=0;k<=ucNumRows;k++)
- {
- if(Row<8)
- {
- Buff[k*2]=(byte_read(2+uiCountFontNumber+k*2))|(sw[Row]);
- Buff[k*2+1]=0xFF;
- }
- else
- {
- Buff[k*2]=(byte_read(2+uiCountFontNumber+k*2));
- Buff[k*2+1]=(byte_read(2+uiCountFontNumber+k*2+1))|(sw[Row-8]);
- }
- }
- break;
- case 1: //静态显示
- case 2:
- break;
- case 3: //擦除
- for(k=0;k<=ucNumRows;k++)
- {
- if(Row<8)
- {
- Buff[k*2]=(byte_read(2+uiCountFontNumber+k*2))|(~sw[Row]);
- }
- else
- {
- Buff[k*2+1]=(byte_read(2+uiCountFontNumber+k*2+1))|(~sw[Row-8]);
- }
- }
- break;
- default:
- break;
- }
- if(++Row>=16)
- {
- Row=0;
- Mod++;
- if(Mod>3)
- {
- Mod=0;
- if(Stop_move==0) //是否暂停移动
- {
- uiCountFontNumber+=64;
- }
- }
-
- }
- }
- break;
- case 0x06://立体显示两颗心动画
- for(k=0;k<4;k++)
- {
- for( uiicount = 0;uiicount<32;uiicount++)
- {
-
- P2=Buff[uiicount*2];
- P4=Buff[uiicount*2+1];
- P5=Buff[uiicount*2+1]>>4;
- delay(2);
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
-
- break;
- }
- }
- }
- for(k=0;k<32;k++)
- {
-
- Buff[k*2]=flash[uiCountFontNumber+k*2];
- Buff[k*2+1]=flash[uiCountFontNumber+k*2+1];
-
- }
- if(++Row>=8)
- {
- Row=0;
- uiCountFontNumber+=64;
- if(uiCountFontNumber>=192)
- {uiCountFontNumber=0;}
-
- }
- break;
- case 0x07://立体显示心形动画
- for(k=0;k<4;k++)
- {
- for( uiicount = 0;uiicount<32;uiicount++)
- {
-
- P2=Buff[uiicount*2];
- P4=Buff[uiicount*2+1];
- P5=Buff[uiicount*2+1]>>4;
- delay(2);
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
-
- break;
- }
- }
- }
- for(k=0;k<32;k++)
- {
-
- Buff[k*2]=xinxing[uiCountFontNumber+k*2];
- Buff[k*2+1]=xinxing[uiCountFontNumber+k*2+1];
-
- }
- if(++Row>=8)
- {
- Row=0;
- uiCountFontNumber+=64;
- if(uiCountFontNumber>=576)
- {uiCountFontNumber=0;}
-
- }
- break;
- case 0x08://立体显示笑脸动画
- for(k=0;k<4;k++)
- {
- for( uiicount = 0;uiicount<32;uiicount++)
- {
-
- P2=Buff[uiicount*2];
- P4=Buff[uiicount*2+1];
- P5=Buff[uiicount*2+1]>>4;
- delay(2);
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
-
- break;
- }
- }
- }
- for(k=0;k<32;k++)
- {
-
- Buff[k*2]=xiaolian[uiCountFontNumber+k*2];
- Buff[k*2+1]=xiaolian[uiCountFontNumber+k*2+1];
-
- }
- if(++Row>=15)
- {
- Row=0;
- uiCountFontNumber+=64;
- if(uiCountFontNumber>=256)
- {uiCountFontNumber=0;}
-
- }
- break;
- case 0x09://打印字效果
-
- for( uiicount = 0;uiicount<176;uiicount++)
- {
-
- P2=Buff[uiicount*2];
- P4=Buff[uiicount*2+1];
- P5=Buff[uiicount*2+1]>>4;
- delay(1);
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
-
- break;
- }
- }
-
- ucline=0;
- for(k=0;k<176;k++)
- {
-
- if(k<ucLine_count)
- {
- Buff[k*2]=byte_read(2+uiCountFontNumber+k*2);
- Buff[k*2+1]=byte_read(2+uiCountFontNumber+k*2+1);
- }
- else if(k<(ucLine_count+16))
- {
-
- if((bDot==1)&&(ucLine_count==160))
- {
- Buff[k*2]=0XFF;
- Buff[k*2+1]=0XFF;
- }
- else
- {
- Buff[k*2]=line[ucline++];
- Buff[k*2+1]=line[ucline++];
- }
- }
- else
- {
-
- Buff[k*2]=0XFF;
- Buff[k*2+1]=0XFF;
- }
-
- }
- if(++Row>=10)
- {
- Row=0;
- bDot=~bDot;
- if(ucLine_count<160)
- {
- ucLine_count=ucLine_count+16;
- }
- if(ucLine_count>=160)
- {
- if(++Stop_time>4)
- {
- Stop_time=0;
- ucLine_count=0;
- uiCountFontNumber+=320;
- if(uiCountFontNumber>=uiPrintFontNumber)
- {
- uiCountFontNumber=0;
- }
- }
- }
-
- }
- break;
- case 0x02: //数字时钟模式
- du1302();
- Led1=1;
- Led3=1;
- if( ++uiCountFontNumber >uiFontNumber ) //uiFontNumber
- {
-
- uiCountFontNumber = 0;
-
- }
- uiicount = uiCountFontNumber;
- display();
- break;
- /*********************/
-
- case 0x04: //平面显示字体模式
- Led3=1;
- if(Stop_move==0)
- {
- uiCountFontNumber++;
- }
- if( uiCountFontNumber>uiFontNumber_P )
- {
- uiCountFontNumber=0 ;
- }
- for(uiicountTwo=uiCountFontNumber;uiicountTwo<ucNumRows_p+uiCountFontNumber;uiicountTwo++)
- {
- P1=byte_read(0x3602+uiicountTwo*2);
- P0=byte_read(0x3603+uiicountTwo*2);
- P2=byte_read(2+uiicountTwo*4);//读取内部EEPROM字幕数据 数据在2地址后 所以要加上2
- P4=byte_read(3+uiicountTwo*4);
- P5=byte_read(3+uiicountTwo*4)>>4;
- delay(1);
- P2=P4=P5=0XFF;
- P2=byte_read(4+uiicountTwo*4);//读取内部EEPROM字幕数据 数据在2地址后 所以要加上2
- P4=byte_read(5+uiicountTwo*4);
- P5=byte_read(5+uiicountTwo*4)>>4;
- delay(1);
- P1=0xFF;
- P0=0XFF;
- P2=P4=P5=0XFF;
- if(BIT_timeout)
- {
- break;
- }
- }
- break;
- default:
- break;
- }
-
- }
- if(Error==0) //上电后如果红外对管 不正常 (无起点检测)会以流水灯形式跑起来,流水灯也可检测LED焊接是否正常
- {
- for(k=0;k<8;k++)
- {
- P0=~liushui[k];
- P1=~liushui[k];
- P2=~liushui[k];
- P3=~liushui[k]|0x0F;
- P4=~liushui[k];
- P5=~liushui[k];
- delay_200ms();
- }
- }
- }
复制代码
代码下载:
基于STC12的pov彩灯程序设计.7z
(1.19 MB, 下载次数: 0)
|