⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 用AVR atmega16做的一个完整彩色LED控制程序
💻 C
📖 第 1 页 / 共 5 页
字号:
         level++;
	  if(level>5)
	  {
		level=0;
		fullflag++;
		FLenghtCount=0;
		two_l=0;
		three_l=0;
		four_l=0;
		five_l=0;
		six_l=0;
	  }

	if(SpeedDelay(mode & 0x03)==1) return ;
		
	}	
	
}




void		SixColorProcess(uchar kind,uchar mode)
{
	uchar	tim,i,value;

	for(i=0;i<7;i++)
	{	
		value=KindGroudData[kind][i];
		if(value!=0x00)
		{
			for(tim=0;tim<val_lenght ;tim++)
			{
				if(SendFirstToEnd(value,mode & 0x0f,0,1)==1) return;
			}

		}
	}
}
void		SixColorProcess_1(uchar kind,uchar mode)
{
	uchar	tim,i,value;

	for(i=0;i<7;i++)
	{	
		value=KindGroudData[kind][i];
		if(value!=0x00)
		{
			FLenghtCount=0;
//			SendEndToFirst(value,mode & 0x0f,ALLBLACK);
			SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1);
			for(tim=1;tim<val_lenght;tim++)
			{
				FLenghtCount++;
//				if(SendEndToFirst(value,mode & 0x0f,ALLBLACK)==1) break;
				if(SendEndToFirst(value,mode & 0x0f,UNLOCKDATA,CLASSNUMBER,1)==1) return;
			}
		}
	}
	
}
void		SixColorProcess_2(uchar kind,uchar mode,uchar class)
{
	uchar	tim,i,value;

	for(i=0;i<7;i++)
	{	
		value=KindGroudData[kind][i];
		if(value!=0x00)
		{
//			for(tim=0;tim<val_lenght;tim++)
			{
				if(ProcessMiddleToEdge(value,mode,UNLOCKDATA,class)==1) return;
			}
		}
		if(SpeedDelay(mode & 0x03)) return;
	}
}
void		SixColorProcess_3(uchar kind,uchar mode,uchar class)
{
	uchar	tim,i,value;

	for(i=0;i<7;i++)
	{	
		value=KindGroudData[kind][i];
		if(value!=0x00)
		{
//			for(tim=0;tim<val_lenght;tim++)
			{
				if(ProcessEdgeToMiddle(value,mode,UNLOCKDATA,class)==1) return;
			}
		}
		if(SpeedDelay(mode & 0x03)) return;
	}
	
}

char		SendKindData(char kind)
{
	uchar 	mode,tim,i,diff,j=0;
	uchar	c1,c2,c3,data;

	mode =KindDataStr[kind][1];
	data  =KindDataStr[kind][0];
	switch(mode & 0x0c)
	{
	case	DIR0:
//从前向后,正向。
		switch(data)
		{
		case	SIX_ID:
			SixColorProcess(SIX_ID,mode);
			break;
		case	ALL_ID:
//			SevenColorProcess(ALL_ID,mode);
			AllStarProcess(ALL_ID,mode,16,4);
			break;
		case	STAR_ID:
			AllStarProcess(STAR_ID,mode,10,21);
			break;
		case	SEVEN_ID:
			AllStarProcess(SEVEN_ID,mode,16,4);
//			SevenColorProcess(SEVEN_ID,mode);
			break;
		case	THREE_ID:
			ThreeColorProcess(THREE_ID,mode);
			break;
		case	THREE1_ID:
			Three1ColorProcess(THREE1_ID,mode);
			break;
		case	ALLCOLOR_ID:
			AllColorProcess(ALLCOLOR_ID,mode);
			break;
		case	UNITEC_ID:
			UniteColorProcess(UNITEC_ID,mode);
			break;
		default:
			break;
		}

		break;
	case	DIR1:
//从后向前,反向。
		BLenghtCount=val_lenght;
		switch(data)
		{
		case	SIX_ID:
			SixColorProcess_1(SIX_ID,mode);
			break;
		case	ALL_ID:
			SevenColorProcess_1(ALL_ID,mode,8,5);
			break;
		case	STAR_ID:
			SevenColorProcess_1(STAR_ID,mode,10,21);
			break;
		case	SEVEN_ID:
			SevenColorProcess_1(SEVEN_ID,mode,8,5);
			break;
		case	THREE1_ID:
			Three1ColorProcess_1(THREE1_ID,mode);
			break;
		case	UNITEC_ID:
			UniteColorProcess_1(UNITEC_ID,mode);
			break;
		default:
			break;
		}

		break;
	case	DIR2:
//从中间向两边。
		switch(data)
		{
		case	SIX_ID:
			SixColorProcess_2(SIX_ID,mode,0);
			break;
		case	ALL_ID:
			AllStarProcess_2(ALL_ID,mode,8,5);
			break;
		case	STAR_ID:
			AllStarProcess_2(STAR_ID,mode,10,21);
			break;
		case	UNITEC_ID:
			UniteColorProcess_2(UNITEC_ID,mode);
			break;
		default:
			break;
		}

		break;
	case	DIR3:
//从两边向中间。
		switch(data)
		{
		case	SIX_ID:
			SixColorProcess_3(SIX_ID,mode,0);
			break;
		case	ALL_ID:
			AllStarProcess_3(ALL_ID,mode,8,5);
			break;
		case	STAR_ID:
			AllStarProcess_3(STAR_ID,mode,10,21);
			break;
		case	UNITEC_ID:
			UniteColorProcess_3(UNITEC_ID,mode);
			break;
 		default:
			break;
		}
		break;
	default:
		break;		
	}
	return 0;
}

uchar		ProcessMiddleToEdge(char data,uchar mode,uchar BC,uchar cclass )
{
//从中间向两边。
	uint		i,one_l,one,j;

	//芯片数为双数, 为单数
	HalfLenght=val_lenght;
	BLenghtCount=val_lenght;
	one=0;
	one_l=0;
	for(i=0;i<BLenghtCount;i++)
	{

		if(one<BLenghtCount)
			one++;
		Send_Data(data,1);
		for(j=1;j<one;j++)
		{
			Send_Data(UNLOCKDATA,1);
		}
////////////////////////////////
		if(one_l<BLenghtCount)
			one_l++;
		for(j=1;j<one_l;j++)
		{
			Send_Data(UNLOCKDATA,1);
		}
		Send_Data(data,1);
		for(j=one_l;j<BLenghtCount;j++)
		{
			Send_Data(UNLOCKDATA,1);
		}

		SendSS(1);
//		SendSI(cclass);		
		Display();
		
	}	
//	if(SpeedDelay(mode & 0x03)==1) return 1;
	return 0;

}

uchar		ProcessEdgeToMiddle(char data,uchar mode,uchar BC,uchar cclass)
{
//从两边向中间。
	uint		i,one_l,one,j;

	//芯片数为双数, 为单数
	FLenghtCount=val_lenght;
	BLenghtCount=val_lenght;
	one=0;
	one_l=0;
	for(i=0;i<BLenghtCount;i++)
	{
			if(one_l<BLenghtCount)
				one_l++;
			for(j=1;j<one_l;j++)
			{
				Send_Data(UNLOCKDATA,1);
			}
			Send_Data(data,1);
			for(;j<BLenghtCount;j++)
			{
				Send_Data(UNLOCKDATA,1);
			}
			
		FLenghtCount--;
		Send_Data(UNLOCKDATA,FLenghtCount);

			if(one<BLenghtCount)
				one++;
			Send_Data(data,1);
			for(j=1;j<one;j++)
			{
				Send_Data(UNLOCKDATA,1);
			}

		SendSS(1);
		Display();
//		SendSI(cclass);		
		
	}	
	return 0;
}


#if 0
void EEPROM_write1(unsigned int uiAddress, unsigned char ucData)
{
	/* 等待上一次写操作结束 */
	while(EECR & (1<<EEWE))	;
	/* 设置地址和数据寄存器*/
	EEAR = uiAddress;
	EEDR = ucData;
	/* 置位EEMWE */
	EECR |= (1<<EEMWE);
	/* 置位EEWE 以启动写操作*/
	EECR |= (1<<EEWE);
}
unsigned char EEPROM_read1(unsigned int uiAddress)
{
	/* 等待上一次写操作结束 */
	while(EECR & (1<<EEWE));
	/* 设置地址寄存器*/
	EEAR = uiAddress;
	/* 设置EERE 以启动读操作*/
	EECR |= (1<<EERE);
	/* 自数据寄存器返回数据 */
	return EEDR;
}

void EepromTest(void)
{
	unsigned char temp1,temp2;                  /*定义变量*/
	unsigned char buffer[10];                       /*定义数组*/
	unsigned char buf[]="AVR与虚拟仪器";                 /*定义字符串*/

	EEPROMwrite(0x10,'a');                         /*单字符写入到0x10,注意是单引号*/
	temp1 = EEPROMread(0x10);                       /*读一个字符到temp1*/

	EEPROM_WRITE(0x20,"abcdefg");                     /*写字符串到0x20*/
	EEPROM_READ(0x20,temp2);                         /*读字符到temp2,temp2=a*/ 
	EEPROM_READ(0x20,buffer);                       /*读字符串到数组中 buffer[10]=abcdefg */

	EEPROM_WRITE(0x30,buf);                         /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/

}
#endif

void 	EepromICnumberWr(void)
{
//use 4 bytes save IC number
//address: 0x02,0x03,0x04,0x05
	unsigned char bit;                  /*定义变量*/
	unsigned char buffer[5];                       /*定义数组*/
	long	loop;

	if(val_lenght > MAXVAL_LENGHT) val_lenght = MINVAL_LENGHT;

	loop=val_lenght;
	bit=loop/1000;
	buffer[0]=bit;
	loop=loop-bit *1000;

	bit=loop/100;
	buffer[1]=bit;
	loop=loop-bit *100;

	bit=loop/10;
	buffer[2]=bit;
	loop=loop-bit *10;

	buffer[3]=loop;
	buffer[4]=0x00;

	EEPROM_WRITE(0x02,buffer);                         /*数组中的值写到EEPROM中:0X02开始为*/

}
void 	EepromICnumberRd(void)
{
//use 4 bytes save IC number
//address: 0x02,0x03,0x04,0x05
	unsigned char buffer[5];                       /*定义数组*/
	EEPROM_READ(0x02,buffer);                       /*读字符串到数组中 buffer[10]=abcdefg */
	val_lenght=buffer[0] * 1000+buffer[1] * 100+buffer[2] * 10+buffer[3];
	if(val_lenght > MAXVAL_LENGHT) val_lenght = MINVAL_LENGHT;
}
void		FactorySetup(void)
{
	uchar	i;
	  ModeStatus=MODE_NOMALE;
	  CurrentKey=KEY_FUNCTION;
	  BackKey=KEY_FUNCTION;
	  CurrentKind=KIND0;
	  K1Count=0;
	  val_kind=0;	
	  Oneday=0xff;
//	  val_lenght=MINVAL_LENGHT;
	  for(i=0;i<MAXVAL_KIND;i++)
  	  {
             KindData[i]=FALSE;//TRUE;
	  }
	  DayData[0]=200;
	  DayData[1]=0;
}
void 	EepromViewModeWr(void)
{
//use 112 bytes save View mode
//address: 0x20,0x21,0x22, ...  , 0x20+112
	EEPROM_WRITE(0x20,KindData);                         /*数组中的值写到EEPROM中:0X10开始为*/
}
void 	EepromViewModeRd(void)
{
//use 112 bytes save View mode
//address: 0x20,0x21,0x22, ...  , 0x20+112
//	unsigned char buffer[5];                       /*定义数组*/
	EEPROM_READ(0x20,KindData);                       /*读字符串到数组中 buffer[10]=abcdefg */
}
void	   	EepromPasswordRd(void)
{
//use 5 bytes save password 
//address: 0x08,0x09,0x0a,0x0b,0x0c;
	uchar	i;
	EEPROM_READ(0x08,PasswordData);                       /*读字符串到数组中 buffer[10]=abcdefg */
	for(i=0;i<(PASSWORDLENGHT-1);i++)
	{
		if(PasswordData[i] !=PASS_DISABLE)
		{
			Password_Enable=TRUE;
			return;
		}
	}
	Password_Enable=FALSE;
}
void	   	EepromPasswordWr(void)
{
//use 5 bytes save password 
//address: 0x08,0x09,0x0a,0x0b,0x0c;
	EEPROM_WRITE(0x08,PasswordData);                         /*数组中的值写到EEPROM中:0X10开始为*/
}
void	   	EepromDayDataRd(void)
{
//use 2 bytes save date value 
//address: 0x0d,0e;
	EEPROM_READ(0x0d,DayData);                       /*读字符串到数组中 buffer[10]=abcdefg */
}
void	   	EepromDayDataWr(void)
{
//use 2 bytes save date value 
//address: 0x0d,0e;
	EEPROM_WRITE(0x0d,DayData);                         /*数组中的值写到EEPROM中:0X10开始为*/
}
void	   	EepromDateValueRd(void)
{
//use 6 bytes save date value 
//address: 0x10,0x11,0x12,0x13,0x14,0x15;
	EEPROM_READ(0x10,DateValue);                       /*读字符串到数组中 buffer[10]=abcdefg */
}
void	   	EepromDateValueWr(void)
{
//use 6 bytes save date value 
//address: 0x10,0x11,0x12,0x13,0x14,0x15;
	DateValue[0]=(YEAR_SETUP & 0x0f)+((YEAR_SETUP & 0xf0) >>4) *10;
	DateValue[1]=(MONTH_SETUP & 0x0f)+((MONTH_SETUP & 0x10) >>4) *10;
	DateValue[2]=(DAY_SETUP & 0x0f)+((DAY_SETUP & 0x30) >>4) *10;
	DateValue[3]=0x0;
	EEPROM_WRITE(0x10,DateValue);                         /*数组中的值写到EEPROM中:0X10开始为*/
}

//////////////////////////////////////////////

//程序开始
void 	DS1302_Write(uchar reg,uchar data)
{
	uchar i;
	Set_DS1302_DDRSDA();
	Clr_DS1302_RST();
	asm("nop");
	asm("nop");
	Clr_DS1302_SCLK();
	asm("nop");
	asm("nop");
	Set_DS1302_RST();
	asm("nop");
	asm("nop");
	for(i=8;i>0;i--)
	{ 
		if(reg&0x01) Set_DS1302_SDA();
		else Clr_DS1302_SDA();
		asm("nop");
		asm("nop");
		Set_DS1302_SCLK(); 
		asm("nop");
		asm("nop");
		Clr_DS1302_SCLK();
		asm("nop");
		asm("nop");
		reg>>=1;
	}
	for(i=8;i>0;i--)
	{ 
		if(data&0x01) Set_DS1302_SDA();
		else Clr_DS1302_SDA();
		asm("nop");
		asm("nop");
		Set_DS1302_SCLK();
		asm("nop");
		asm("nop");
		Clr_DS1302_SCLK();
		asm("nop");
		asm("nop");
		data>>=1;
	}
	Clr_DS1302_RST();
	asm("nop");
	asm("nop");
	Clr_DS1302_DDRSDA();
}
uchar DS1302_Read(uchar reg)
{
	uchar data=0,i;
	reg+=1;//读标志
	Set_DS1302_DDRSDA();
	Clr_DS1302_RST();
	asm("nop");
	asm("nop");
	Clr_DS1302_SCLK();
	asm("nop");
	asm("nop");
	Set_DS1302_RST();
	asm("nop");
	asm("nop");
	for(i=8;i>0;i--)
	{

		if(reg&0x01) Set_DS1302_SDA();
		else Clr_DS1302_SDA();
		asm("nop");
		asm("nop");
		Set_DS1302_SCLK(); 
		asm("nop");
		asm("nop"); 
		Clr_DS1302_SCLK();
		asm("nop");
		asm("nop");
		reg>>=1;
	}
	Clr_DS1302_DDRSDA();
	for(i=8;i>0;i--)
	{ 
		data>>=1;
		if((PIND&(1<<DS1302_SDA))==(1<<DS1302_SDA)) data|=0x80;
		Set_DS1302_SCLK();
		asm("nop");
		asm("nop");
		Clr_DS1302_SCLK();
		asm("nop");
		asm("nop"); 
	}
	Clr_DS1302_RST();
	asm("nop");
	asm("nop");
	return(data);
}
uchar Check_DS1302(void)
{
    DS1302_Write(DS1302_CONTROL_Reg,0x80);
    if(DS1302_Read(DS1302_CONTROL_Reg)==0x80) return 1;
    return 0;
}


void DS1302_Init(void)
{
	DS1302_Write(DS1302_CONTROL_Reg,0x00);//关闭

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -