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

📄 main.c

📁 用AVR atmega16做的一个完整彩色LED控制程序
💻 C
📖 第 1 页 / 共 5 页
字号:
 	 PORTC = 0xc3;//PORTC7,PORTC6,PORTC1,PORTC0 ==> key input ,enable_up 
 	 DDRC  = 0x00;//PC7,PC6,PC1,PC0 ==> PRESS KEY INPUT ; PC2PC3PC4PC5 ==>JTAG USE
 	 PORTD = 0xf8;//PORTD3-PORTD7 ==> LED CS ,enable_up ; 
 	 DDRD  = 0xff;//PD3,PD4,PD5,PD6,PD7 ==>LED CS USE ;PD2,PD1,PD0 OUTPUT DS1302 USE
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
//   CLI(); //disable all interrupts
   	port_init();
   	spi_init(); //初始化SPI接口

   	MCUCR  = 0x00;
   	GICR     = 0x00;
   	TIMSK    = 0x00; //timer interrupt sources
//   SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void		PasswordProcess(void)
{
	int		val;
	   	EepromDayDataRd();
		if(DayData[0]==0)
		{
	  		Password_alarm=TRUE;
		}
		else
		{
			ReadTime();
	   		EepromDateValueRd();
//			if((year0==0 && year1==0 &&month1==0 &&month0==1 &&date1==0&&date0==1)||(year0==0xf && year1==0xf &&month1==0x1 &&month0==0xf &&date1==0x3&&date0==0xf))
			if((year1==0 && month1==0 && date1==0)||(year1==0xa5 && month1==0x1f && date1==0x3f)) //070616 modify
			{
		  		Password_alarm=TRUE;
			}
			else
			{
				val=CompareDate();
				if((val==-1) ||( val > DayData[0]))	Password_alarm=TRUE;
				else
				{
					if(val!=Oneday)
					{
						Oneday=val;
						DayData[0]=DayData[0]-val;
						EepromDayDataWr();
					}
					Password_alarm=FALSE;
				}
			}
		}
}

void   main(void)
{
 	   char		 bit,i=0,kind=0;
	   uint		 loop=0,KK=0,pwloop=0;
	   uchar		tempPW[PASSWORDLENGHT];
 	   val=0;
	   KeyCode=0;
	   DispBuffer[0]=CharFont[16];
	   DispBuffer[1]=CharFont[16];
	   DispBuffer[2]=CharFont[0];
	   DispBuffer[3]=CharFont[0];
	   DispBuffer[4]=CharFont[0];
	   DispBuffer[5]=0x00;
	   SI_Count=0;
  	   CLI(); //关中断 
	   init_devices();

//	   timer0_init();
	   
//	   FactorySetup();
	  ModeStatus=MODE_NOMALE;
	  CurrentKey=KEY_FUNCTION;
	  BackKey=KEY_FUNCTION;
	  CurrentKind=KIND0;
	  K1Count=0;
	  val_kind=0;	  	
	  Password_alarm=FALSE;

	  EepromDateValueRd();
#ifdef   VERSION_CONTROL
	if(DateValue[0]==0xff && DateValue[1]==0xff && DateValue[2]==0xff && DateValue[3]==0xff ) //070617 mask
#endif
	{
	  FactorySetup();
	  val_lenght=MINVAL_LENGHT;
	  EepromICnumberWr();
	  EepromViewModeWr();
	  DS1302_Init();
	  EepromDateValueWr();
	  EepromDayDataWr();
	  PasswordCannel();
	}
	   EepromICnumberRd();
	   EepromViewModeRd();
	for(i=MAXVAL_KIND-1;i>=0;i--)
	{
		if(KindData[i]!=0)
		{
			i=i+1;
			break;
		}
	}
	val_kind=i;
	   EepromPasswordRd();
	   if(Password_Enable==TRUE)
   	   {
   	   	PasswordProcess();
	   }

  	   SEI(); //开中断 
#ifdef   VERSION_CONTROL
	WatchDog(7);
#endif	   
	   while(1)
	   {            if(KeyCode==0)	   KeyCode=PressKeyProcess();
			   if(KeyCode!=0){
			   	   switch(KeyCode)
			       {
			   	   case	KEY_UP://k2
				   		if(ModeStatus==MODE_LENGHT)
				   		{
			   				if(val_lenght<MAXVAL_LENGHT)
			   		   	  	val_lenght++;
							K1Count=5;							
			   		   	 }
						else if(ModeStatus==MODE_KIND)
						{
			   				if(val_kind<MAXVAL_KIND)
							{
								KindData[val_kind]=TRUE;
					   		   	val_kind++;

							}
							else val_kind=0;
						}
						else if(ModeStatus==MODE_PASSWORD)
						{
							if(PassDate_flag==PASSWORD_SETUP)
							{
								if(KK<MAXNUMBER) KK++;	

							}
							else
							{
								if(KK<MAXDATE) 	KK++;	
							}
							K1Count=0;
							//K4Count=0;
						}
			   			break;
				   case	KEY_DOWN://k3
//					  	DS1302_Init();
//					   	ReadTime();
				   		if(ModeStatus==MODE_LENGHT)
			   			{
			   		    		if(val_lenght>MINVAL_LENGHT)
					      		val_lenght--;
							K1Count=5;		
							
			   		   	 }
						else if(ModeStatus==MODE_KIND)
						{
			   		    		if(val_kind<MAXVAL_KIND)
			   		    		{
								KindData[val_kind]=FALSE;
					      			val_kind++;
			   		    		}
							else val_kind=0;
						} 
						else if(ModeStatus==MODE_PASSWORD)
						{
							if(KK>0) 	KK--;	
							K1Count=0;
						//	K4Count=0;
						}
			   		    break;
			   	   case	KEY_FUNCTION://k1
			   	   		BackKey=CurrentKey;
			   	   		CurrentKey=KEY_FUNCTION;
						K1Count++;
			   	             switch(ModeStatus)
			   	             	{
			   	             	case	MODE_NOMALE:
							ModeStatus=MODE_LENGHT;
							break;
			   	             	case	MODE_LENGHT:
							if(K1Count==2)
							{
								ModeStatus=MODE_KIND;
							}
							else if(K1Count==7) //base 5
							{
								K1Count=0;
								ModeStatus=MODE_NOMALE;
							       kind=0;
							   EepromICnumberWr();
							}
							break;
			   	             	case	MODE_KIND:
							K1Count=0;
							ModeStatus=MODE_NOMALE;
							kind=0;
				   			EepromViewModeWr();
							break;
						case	MODE_PASSWORD:
							if(PassDate_flag==INVALE_SETUP || PassDate_flag==DATE_SETUP)
							{
								PassDate_flag=DATE_SETUP;
								if(K1Count==2)
								{
									K1Count=0;
									ModeStatus=MODE_NOMALE;
								       kind=0;
									DayData[0]=KK;
									DayData[1]=0x00;
							       	EepromDayDataWr();
								}
			   	             		}
							break;
			   	             	default:
							break;
			   	             	}
			   		    break;
			   	   case	KEY_K4:  //k4
				   	   	if(ModeStatus==MODE_PASSWORD)
				   	   	{
				   	   		if(PassDate_flag==INVALE_SETUP || PassDate_flag==PASSWORD_SETUP){
							PassDate_flag=PASSWORD_SETUP;
//							if(KK==0 && K4Count>0)
							if(K4Count>5)
							{
								   if(Password_Enable==FALSE)
								   {
									K1Count=0;
									ModeStatus=MODE_NOMALE;
								       kind=0;
								       EepromPasswordWr();
								   	Password_Enable=TRUE;
									break;
								   }
								   else
							   	   {
									if(tempPW[0]==PasswordData[0] &&tempPW[1]==PasswordData[1]&&tempPW[2]==PasswordData[2]&&tempPW[3]==PasswordData[3]&&tempPW[4]==PasswordData[4])
									{
										ModeStatus=MODE_PASSWORD;
										PassDate_flag=PASSWORD_SETUP;
										PwModify_flag=TRUE;
										K1Count=0;
										K4Count=0;
										KK=0;
										break;
									}
									else
									{
										if(PwModify_flag==3)
										{
											EepromPasswordWr();
										}
										K1Count=0;
										ModeStatus=MODE_NOMALE;
									       kind=0;
										break;
									}
								   }
							}
							K4Count++;
							switch(K4Count)
							{
							case	2:   //byte1
								PasswordData[0]=KK;
								break;
							case	3:   //byte2
								PasswordData[1]=KK;
								break;
							case	4:   //byte3
								PasswordData[2]=KK;
								break;
							case	5:   //byte4
								PasswordData[3]=KK;
								break;
							case	6:   //byte5
								PasswordData[4]=KK;
								break;
							default:
								break;
							}
//						   	if(Password_Enable==TRUE && PwModify_flag>=TRUE)
						   	if(Password_Enable==TRUE && PwModify_flag==TRUE) //070616 modify
					   	   	{
								if(K4Count==2 && PasswordData[0]==0x3)
								{
									ModeStatus=MODE_PASSWORD;
									PassDate_flag=PASSWORD_SETUP;
									PwModify_flag=3;								
									K1Count=0;
									K4Count=0;
									KK=0;
								}
								else if(K4Count==2 && PasswordData[0]==0x8)
								{
									ModeStatus=MODE_PASSWORD;
									PassDate_flag=DATE_SETUP;
									K1Count=0;
									K4Count=0;
									KK=0;
								}
								else  if(K4Count==3 && PasswordData[0]==38&& PasswordData[1]==83)
								{
									K1Count=0;
									ModeStatus=MODE_NOMALE;
								       kind=0;
								       PasswordCannel();
									break;
								}
						   	}

							KK=0;
				   	   		}
				   	   	}
						break;
			   	   case	KEY_K1K4RST://k1k4
						FactorySetup();
						EepromICnumberWr();
						EepromViewModeWr();
				   		WatchDog(0);
						while(1);
			   		    break;
			       case	KEY_K3K4RST: //k3k4
					       EepromPasswordRd();
						PwModify_flag=FALSE;
			       		if(Password_Enable==FALSE)
		       			{
							ModeStatus=MODE_PASSWORD;
							PassDate_flag=INVALE_SETUP;
							K1Count=0;
							K4Count=0;
							KK=0;
		       			}
						else
						{
							ModeStatus=MODE_PASSWORD;
							PassDate_flag=PASSWORD_SETUP;
							K1Count=0;
							K4Count=0;
							for(i=0;i<PASSWORDLENGHT;i++)
								tempPW[i]=PasswordData[i];
							KK=0;
						}
			   		    break;
			       default:
			   		    break;
			       }
				KeyCode=0;   
				if(ModeStatus==MODE_LENGHT)
				{
				   DispBuffer[0]=CharFont[17];
				   loop=val_lenght;
			          bit=loop/1000;
				   DispBuffer[1]=CharFont[bit];
				   loop=loop-bit *1000;
			          bit=loop/100;
				   DispBuffer[2]=CharFont[bit];
				   loop=loop-bit *100;
			          bit=loop/10;
				   DispBuffer[3]=CharFont[bit];
				   loop=loop-bit *10;
				   DispBuffer[4]=CharFont[loop];

				   BLenghtCount=val_lenght;
				   
				}
				else if(ModeStatus==MODE_KIND)
				{
				   DispBuffer[0]=CharFont[0];
				   loop=val_kind;
				   DispBuffer[1]=CharFont[16];
			          bit=loop/100;
				   DispBuffer[2]=CharFont[bit];
				   loop=loop-bit *100;
			          bit=loop/10;
				   DispBuffer[3]=CharFont[bit];
				   loop=loop-bit *10;
				   DispBuffer[4]=CharFont[loop];
				}
				else if(ModeStatus==MODE_PASSWORD)
				{
		   	   		if(PassDate_flag==PASSWORD_SETUP)
					{
				   			DispBuffer[0]=CharFont[18];
				   			DispBuffer[2]=CharFont[0];
							switch(K4Count)
							{
							case	1:   //byte1
							   	DispBuffer[1]=CharFont[1];
								break;
							case	2:   //byte2
				   				DispBuffer[1]=CharFont[2];
								break;
							case	3:   //byte3
				   				DispBuffer[1]=CharFont[3];
								break;
							case	4:   //byte4
				   				DispBuffer[1]=CharFont[4];
								break;
							case	5:   //byte5
				   				DispBuffer[1]=CharFont[5];
								break;
							default:
								if(PwModify_flag==TRUE) //070616 modify
									DispBuffer[1]=CharFont[18];
								else if(PwModify_flag==3)//070616 modify
				   					DispBuffer[1]=CharFont[16];
									else
				   					DispBuffer[1]=CharFont[6];
								break;
							}
							   loop=KK;
						          bit=loop/10;
							   DispBuffer[3]=CharFont[bit];
							   loop=loop-bit *10;
							   DispBuffer[4]=CharFont[loop];
					}
					else if(PassDate_flag==DATE_SETUP)
					{
				   			DispBuffer[0]=CharFont[19];
				   			DispBuffer[1]=CharFont[19];
							   loop=KK;
						          bit=loop/100;
							   DispBuffer[2]=CharFont[bit];
							   loop=loop-bit *100;
						          bit=loop/10;
							   DispBuffer[3]=CharFont[bit];
							   loop=loop-bit *10;
							   DispBuffer[4]=CharFont[loop];
					}
					else
					{
				   			   DispBuffer[0]=CharFont[18];
				   			   DispBuffer[1]=CharFont[19];
							   loop=KK;
						          bit=loop/100;
							   DispBuffer[2]=CharFont[bit];
							   loop=loop-bit *100;
						          bit=loop/10;
							   DispBuffer[3]=CharFont[bit];
							   loop=loop-bit *10;
							   DispBuffer[4]=CharFont[loop];
					}
				}
				else
				{
				   DispBuffer[0]=CharFont[16];
				   DispBuffer[1]=CharFont[16];
				   DispBuffer[2]=CharFont[0];
				   DispBuffer[3]=CharFont[0];
				   DispBuffer[4]=CharFont[0];
				}

				DispBuffer[5]=0x00;

			   }

			if(ModeStatus==MODE_NOMALE)
			{
				if(Password_alarm==FALSE)  
				{
					if(KindData[kind]==TRUE)
					{
					   DispBuffer[0]=CharFont[16];
					   DispBuffer[1]=CharFont[16];
					   loop=kind;
				          bit=loop/100;
					   DispBuffer[2]=CharFont[bit];
					   loop=loop-bit *100;
				          bit=loop/10;
					   DispBuffer[3]=CharFont[bit];
					   loop=loop-bit *10;
					   DispBuffer[4]=CharFont[loop];
					   Display();

					   SendKindData(kind);
/*					for(i=1;i<val_lenght;i++)
					{
						if(SendKindData(0x0 | 0x80)==1) break;
					}
*/
					}
					kind++;
					if(kind>=MAXVAL_KIND)
						kind=0;
				 }
				else
				{
					   kind=0;
					   DispBuffer[0]=CharFont[16];
					   DispBuffer[1]=CharFont[16];
					   loop=kind;
				          bit=loop/100;
					   DispBuffer[2]=CharFont[bit];
					   loop=loop-bit *100;
				          bit=loop/10;
					   DispBuffer[3]=CharFont[bit];
					   loop=loop-bit *10;
					   DispBuffer[4]=CharFont[loop];
					   Display();

					   SendKindData(kind);
				}
			}

/*
			KK++;
			if(KK>1500)
			{KK=0;
				   ReadTime();
				   DispBuffer[0]=CharFont[hour1];
				   DispBuffer[1]=CharFont[hour0];
				   DispBuffer[2]=CharFont[minute1];
				   DispBuffer[3]=CharFont[minute0];
				   DispBuffer[4]=CharFont[second0];
			}
*/			
			Display();
		   	if(pwloop>100)
   			{
   				pwloop=0;
	   			if(Password_Enable==TRUE)
	   	   		{
   		   			PasswordProcess();
	   			}
		   	}
		   	else pwloop++;

	   }
}
void   Display(void)
{	
 	   PORTD=0xf7;
	   PORTA=DispBuffer[0];
	   Delay(10);
 	   PORTD=0xef;
	   PORTA=DispBuffer[1];
	   Delay(10);
 	   PORTD=0xdf;
	   PORTA=DispBuffer[2];
	   Delay(10);
 	   PORTD=0xbf;
	   PORTA=DispBuffer[3];
	   Delay(10);
 	   PORTD=0x7f;
	   PORTA=DispBuffer[4];
	   Delay(10);

#ifdef VERSION_CONTROL
	/* WDT 复位*/
	_WDR();
#endif
	   
}
void   Display_Fast(void)
{	
 	   PORTD=0xf7;
	   PORTA=DispBuffer[0];
	   Delay(1);
 	   PORTD=0xef;
	   PORTA=DispBuffer[1];
	   Delay(1);
 	   PORTD=0xdf;

⌨️ 快捷键说明

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