/*************************************************************
                   旋转LED平面立体显示字体测试程序 中断标志位方式 去除盲点
程序编写：Fucp   2012-7-24
DIY套件  http://59tiaoba.taobao.com

单片机 STC12C5A32S2 或者其他51
字模软件用  PC2002
逐列取模方式

电机旋转方向 逆时针
/***********************************************************
说明：
	 硬件介绍:用单片机的36个IO口独立驱动LED灯
可以避免用选通显示上下不对称的问题,所以为制作好的效果提供了硬件基础.采用
无线供电方式以及性能较好的RF370电机,在5V供电下 显示的效果非常好.电机速度也够快 
够安静.

	看程序前请看下原理图，根据原理图来理解比较容易!
    程序用中断判断红外起点的方法开始显示 每转一圈，列数往后移动一列
显示完指定的字数后循环	此种方式在中断中放起点标志位。在显示一圈的过程中
如果没有显示完一圈数据中断又来了，会立即跳出，可实现盲点很小的显示
感觉一个圆都能显示字

字幕配置方法 见初级程序的 立体和平面一体显示 程序中的说明
*************************************************************/
#include "NEW_8051.H"
#include "task.h"
#include <stddef.h>
 
sbit Led1=P3^0;
sbit Led2=P3^1;
sbit Led3=P3^4;
bit BIT_timeout=0;
uint i=0,j=0;
uint ucNumRows=160; //定义一周显示字个数 一个字16列 160/16=10个字
/*********延时子程序**********/
void delay(unsigned char n)	//每列显示的时间
{
	unsigned char a,b;
	for(;n>0;n--)
	{    	
		for(b=65;b>0;b--)
        for(a=8;a>0;a--);
	}
}
/*********中断子程序**********/
void int0() interrupt 0	//使用外部中断0
{
	BIT_timeout=1; //起点标志位	
}

/********************************/
void start(void)
{
	P1=0XFF;
	P2=0XFF;
	P0=0XFF;
	P3=0XFF;
	P4=0XFF;
	P5=0XFF;   
	uiAllRows=uiAllRows-128; 
}
/***************************************/
void OS_ALLRun(void)
{
	//BIT_timeout=1;
	if(BIT_timeout)	//起点判断
 	{			
		BIT_timeout=0;
		
		j++; 				           
        if( j>752 )
        {
            j=0 ;
        }            
        for(i=j;i<160+j;i++)  //平面显示一列 立体要显示两列 这是由于半径问题 否则立体显示的字很宽
        {                               
            P1=love[i*2];  //字幕数据低位送显示
            P0=love[i*2+1];	//字幕数据高位送显示  //这里行和列 都是IO口独立驱动的LED
			P2=zimo[i*4];	//送数据低位显示
			P4=(zimo[i*4+1]);//送数据高位显示	这里用了单片机P4 和P5口 是LQFP48脚才有的 
			P5=(zimo[i*4+1])>>4;			
			delay(1);
			P2=P4=P5=0XFF;					
			P2=zimo[i*4+2];
			P4=(zimo[i*4+3]);
			P5=(zimo[i*4+3])>>4;	                
			delay(1);
			P2=P4=P5=0XFF;
			P1=0xFF;
			P0=0XFF;				
           if(BIT_timeout)//这里如果没有显示完一圈的数据 回到起点了 
		                  //直接跳出 就不会出现头吃尾的现象 而且盲点很小
		   {
		   		//BIT_timeout=0;
				break;
		   }
		}
		   
	}
}
/*****END*****/