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

📄 card.cpp.bak

📁 基于单片机ATmega16制作IC card 。程序中包含数据的采集和通信。
💻 BAK
📖 第 1 页 / 共 5 页
字号:
 	
 PORTD &= ~FM_DATA;	
 //DelayUs(6);
 //PORTD &= ~FM_CLK;
 //DelayUs(6); 
 PORTD |= FM_CLK;
 DelayUs(6);
 PORTD |= FM_DATA;	
 DelayUs(6);	
	
}
////////////
void NoAck(void)
{
 PORTD |= FM_DATA;	
 DelayUs(6);	 
 PORTD |= FM_CLK;
 DelayUs(6);
 PORTD &= ~FM_CLK;
 DelayUs(6);
 //PORTD &= ~FM_DATA;	
 //DelayUs(6); 
}
/////////////
unsigned char I2cWriteByte(unsigned char byte)
{
 unsigned char counts,ack;
 
 counts = 0;
 ack = TRUE;
 while(counts < 8)
 {
 
  asm("wdr");	 
  if(byte & 0x80)
  {
   PORTD |= FM_DATA; 
  }
  else
  {
   PORTD &= ~FM_DATA; 
  }
  
  DelayUs(3);
  PORTD |= FM_CLK;
  DelayUs(6);
  PORTD &= ~FM_CLK;
  DelayUs(3);  
  counts++;
  byte <<= 1;
 }
 PORTD &= ~FM_DATA;
 DDRD &= ~FM_DATA;
 DelayUs(6); 
 PORTD |= FM_CLK; 
 DelayUs(6);
 if(PIND & FM_DATA)
 {
  ack = FALSE;
 }
 //PORTD &= ~FM_CLK;
 DelayUs(3); 
 //PORTD |= FM_DATA;
 //DelayUs(6);
 DDRD |= FM_DATA; 
 DelayUs(6);
 
 return ack;
}
///////////
unsigned char I2cWriteByteData(unsigned char I2cAddress,unsigned char data)
{
 unsigned char counts = 0,result = FALSE;
	
 while(counts < 3)
 {
  I2cStart();
  if(I2cWriteByte(0x6c) == TRUE)
  {
   if(I2cWriteByte(I2cAddress) == TRUE)
   {
    if(I2cWriteByte(data) == TRUE)
    {
     I2cStop();
	 result = TRUE;
	 break;
    }
   }
  }
  I2cStop();
  asm("wdr"); 
  counts++;
 }
 return result;
}
///////////////
void KT0801Configuration(unsigned int wFMFrequence)
{
 unsigned char FrequenceLow,FrequenceHigh;
 
 I2cWriteByteData(0x02,(ENABLE_MUTE|PILOT_PRE_EMPH_AMPL));
 FrequenceLow = *(char *)&wFMFrequence;
 FrequenceHigh = *((char *)&wFMFrequence + 1);
 FrequenceHigh |= RF_AUDIO_GAIN;
 I2cWriteByteData(0x00,FrequenceLow);
 I2cWriteByteData(0x01,FrequenceHigh);
I2cWriteByteData(0x13,ENABLE_HIGH_POWER);
 wStatusDelay = 0;   
 while(wStatusDelay < MS_20)
 {
  asm("wdr"); 	 
 }
 I2cWriteByteData(0x02,((~ENABLE_MUTE)&PILOT_PRE_EMPH_AMPL));
}
////////
void FMFrequeceControl(unsigned int wFMFrequence)
{
 unsigned char FrequenceLow,FrequenceHigh;	
	
 FrequenceLow = *(char *)&wFMFrequence;
 FrequenceHigh = *((char *)&wFMFrequence + 1);
 FrequenceHigh |= RF_AUDIO_GAIN;
 I2cWriteByteData(0x00,FrequenceLow);
 I2cWriteByteData(0x01,FrequenceHigh);
}

//void DisplayMode(void)
//{

//}


//cLCD LCD;
/*
void PresetFMFrequenceAndMode(void)
{
 FMFrequenceAndMode.wModeFrequenceValue[0] = FM_FREQUENCE_MODE1;
 FMFrequenceAndMode.wModeFrequenceValue[1] = FM_FREQUENCE_MODE2;
 FMFrequenceAndMode.wModeFrequenceValue[2] = FM_FREQUENCE_MODE3;
 FMFrequenceAndMode.wModeFrequenceValue[3] = FM_FREQUENCE_MODE;
 FMFrequenceAndMode.wModeFrequenceValue[4] = FM_FREQUENCE_MODE4;
 FMFrequenceAndMode.FMFrequence.wFMFrequence = FM_PRESET_FREQUENCE;
 FMFrequenceAndMode.FMFrequenceMode = NO_M;	
}


unsigned char ReadFMFrequenceAndMode(FMFrequence  *FMFrequenceAndMode)
{
 unsigned char i,temp = 0;
 for(i = 0;i < EEPROM_FREQUENCE_DATA_LEN;i++)
 {
  *(unsigned char *)((unsigned char *)FMFrequenceAndMode + i) = eeprom_read_byte((const uint8_t *)((wFMFrequenceAndModeAddress) + i));
 }
 for(i = 0;i < (EEPROM_FREQUENCE_DATA_LEN - 1);i++)
 {
  temp += *(unsigned char *)((unsigned char *)FMFrequenceAndMode + i);  
 }
 if(temp == *(unsigned char *)((unsigned char *)FMFrequenceAndMode + (EEPROM_FREQUENCE_DATA_LEN - 1)))
 {
  return TRUE;
 }
 else
 {
  return FALSE;
 } 
}
///
unsigned char WriteFMFrequenceAndMode(void)
{
 unsigned char i,j,temp = 0;
 unsigned char bWriteEeprom;
 FMFrequence  lFMFrequenceAndMode;
  
 bWriteEeprom = FALSE;
 for(j = 0;j < EEPROM_RW_RETRY_COUNTS;j++)
 {
  for(i = 0;i < (EEPROM_FREQUENCE_DATA_LEN - 1);i++)
  {
   while (!eeprom_is_ready())
   {
    asm("wdr"); 
   } 
   eeprom_write_byte((uint8_t *)((wFMFrequenceAndModeAddress) + i),*(unsigned char *)((unsigned char *)&FMFrequenceAndMode + i));
   temp += *(unsigned char *)((unsigned char *)&FMFrequenceAndMode + i); 
  }
  while (!eeprom_is_ready())
  {
   asm("wdr"); 
  } 
  eeprom_write_byte((uint8_t *)((wFMFrequenceAndModeAddress) + (EEPROM_FREQUENCE_DATA_LEN - 1)),temp);
  while (!eeprom_is_ready())
  {
   asm("wdr"); 
  } 
  temp = ReadFMFrequenceAndMode(&lFMFrequenceAndMode);
  if(temp == TRUE) 
  {	 
   bWriteEeprom = TRUE;
   break;  
  }
 } 
 return bWriteEeprom; 
}
///////////////
void WriteFMFrequenceAndModeAddress(void)
{
 unsigned char i;
 unsigned int temp;
 
 for(i = 0;i < EEPROM_RW_RETRY_COUNTS;i++)
 {
  while (!eeprom_is_ready())
  {
   asm("wdr"); 
  } 
  eeprom_write_word(&FMFrequenceEepromAddress,wFMFrequenceAndModeAddress);
  while (!eeprom_is_ready())
  {
   asm("wdr"); 
  } 
  eeprom_write_word(&FMFrequenceEepromAddress1,wFMFrequenceAndModeAddress);
  while (!eeprom_is_ready())
  {
   asm("wdr"); 
  } 
  temp = eeprom_read_word(&FMFrequenceEepromAddress);
  if(temp == eeprom_read_word(&FMFrequenceEepromAddress1))
  {
   break;
  }
 }
}
/////////
//////////////when	ReleaseKey that data is saved 
void	WriteFMF_data_to_eeprom(void)
{
if(bReleaseKey == TRUE) //&& FMTxStatus != CP_RESET_DELAY_STATUS)
  {
   if(bFMFrequenceChange == TRUE)
   {
	bFMFrequenceChange = FALSE;
    while(wFMFrequenceAndModeAddress < (256 - EEPROM_FREQUENCE_DATA_LEN))
    {
     if(WriteFMFrequenceAndMode() == TRUE)
	 {
	  break;
	 }
	 wFMFrequenceAndModeAddress += EEPROM_FREQUENCE_DATA_LEN;
	 WriteFMFrequenceAndModeAddress();
    }
   }
  }		
}	
*/     
////////////sub	progam in main program
void ipod_power_test(void)									//IPOD	 上电检测
{
			
				if((FlagBuff1 & INSERT_IPOD) && (FlagBuff & IPOD_POWER_UP))
  			{
  			 if(!(FlagBuff & IPOD_POWER_UP_HOLD)) 
  			 {
				FlagBuff |= IPOD_POWER_UP_HOLD;						//IPOD刚上电延时等待稳定标志
				IpodPowerUpDelay = 0;
  			 }
  			 else
  			 { 
				if(!(FlagBuff1 & IPOD_POWER_STEADY))
				{
 				 if(IpodPowerUpDelay > MS_120)
				 {
  			    FlagBuff1 |= IPOD_POWER_STEADY;  		//进入稳定状态
				  TxBuff[0] = 0xff;											//发送同步字节SYNC
  			    WriteUart(1,UN_WAIT_TX);
				  FMTxStatus = TX_SYN_CODE_STATUS;			//CP进入初始化等待状态,发送授权命令
 				  wStatusDelay = 0; 
  			    bTxCommand = TRUE;
				  TxRetryCounts1 = TX_RETRY_COUNTS;			//发送PACK字节长度	
				 }
				}
  			 }
  			}	 
  			else if(!(FlagBuff1 & INSERT_IPOD) || !(FlagBuff & IPOD_POWER_UP))
  			{
  			 if(FlagBuff1 & IPOD_POWER_STEADY)
  			 {
  			  UartReceive = UART_RECEIVE;
  			  bTxCommand = FALSE;
				bTxCommand1 = FALSE;
  			  FMTxStatus = NO_IPOD_CONNECT_STATUS;
  			  bTxBuffLock = FALSE;
  			  FlagBuff &= (~IPOD_POWER_UP & ~IPOD_POWER_UP_HOLD);
  			  FlagBuff1 &= (~IPOD_POWER_STEADY & ~GET_IPOD_PLAY_STATUS);
  			 }
  			
  			} 	
		
				
}
///////////////
void	get_ipod_play_staus(void)
{
		ReadFlash(TxBuff,(prog_uchar *)GetPlayStatus,GET_PLAY_STATUS_LEN);
    WriteUart(GET_PLAY_STATUS_LEN,WAIT_TX);				
}

//////////////ipod	Authentication and send pack
void	ipod_receiving_pack(void)
{
    
  if(FlagBuff1 & IPOD_POWER_STEADY) 
  {
   if(UartReceive == UART_IS_RECEIVING)			//start of packet(0x55)是否接收成功
   {
    if(RxTimeOut > MS_300)									
    {
     UartReceive = UART_RECEIVE;						//接收时间若大于300MS,则接收失败,从新接收
    }		
   }

   if(UartReceive == UART_RECEIVE_ONE_PACKET)	//数据包是否接收完成
   {		
    UartReceive = UART_RECEIVE;
    switch(RxBuff[1]) 												
    {
     case DISPLAY_REMOTE_LINGO:								//Lingo ID 判断
		  switch(RxBuff[2])												//Command ID 判断
		  {
		   case RET_PLAY_STATUS:									//播放状态
		//	    FlagBuff1 |= GET_IPOD_PLAY_STATUS;
				if((RxBuff[3] == 0x00) || (RxBuff[3] == 0x02))
				{
			     if(!(FlagBuff & BT_AUDIO_ON))
			    {
			     	FlagBuff1 &= ~IPOD_PLAY;
						SendContextButtonStatus(PLAY);
					}
								
				}
				else
				{
				 FlagBuff1 |= IPOD_PLAY;
				 SendContextButtonStatus(PAUSE);//PRESS_PAUSE_KEY);
			     FMTxStatus1 = CONTEX_BOTTON_PRESS_STATUS;
				 bTxCommand1 = TRUE;
				 wStatusDelay1 = 0;
				}
                break;
				
		   default:
				break;
		  }
		  break;
		
     case GENERAL_LINGO:											//Lingo ID 判断
	      switch(RxBuff[2])											//Command ID 判断
	      {
		   case REQUEST_IDENTIFY:									//请求AC从新发送认证信息
			    FMTxStatus = TX_SYN_CODE_STATUS;
				TxRetryCounts = TX_RETRY_COUNTS;
				TxRetryCounts1 = TX_RETRY_COUNTS;
                bTxCommand = TRUE;
                wStatusDelay = 0;
		        break;

				
		  /*		
		   case NOTIFY_IPOD_STATE_CHANGE:
		        if(RxBuff[3] == LIGHT_SLEEP)
		        {
                 iPodPowerStatus = LIGHT_SLEEP;
                }
		        if(RxBuff[3] == POWER_ON)
			    {
			     iPodPowerStatus = POWER_ON;
                } 
		        break;*/
	
           case GET_ACCESSORY_INFO:			//IPOD获取AC相关信息	
                switch(RxBuff[3])
                {
			     case ACCESSORY_CAPABILITIES:
		              ReadFlash(TxBuff,(prog_uchar *)RetAccessoryCapbilites,RET_ACCESSORY_CAPBILITES_LEN);
                      WriteUart(RET_ACCESSORY_CAPBILITES_LEN,WAIT_TX);	
		              break;
                /*
                case ACCESSORY_NAME:
                     ReadFlash(TxBuff,(prog_uchar *)RetAccessoryName,RET_ACCESSORY_NAME_LEN);
                     WriteUart(RET_ACCESSORY_NAME_LEN,WAIT_TX);
				     break;

                //case ACCESSORY_FIRMARE_VERSION:
                     //ReadFlash(TxBuff,(prog_uchar *)RetAccessoryFirmwareVer,RET_ACCESSORY_FIRMWARE_VER_LEN);
                     //WriteUart(RET_ACCESSORY_FIRMWARE_VER_LEN,WAIT_TX);
				     //break;*/

                 default:
				      break;
                }
			    break;				
				
		   case GET_DEV_AUTHENTICATION_INFO:		//IPDO请求AC认证确认是否通过
		        SendDevAuthenticationInfo();
				//FMTxStatus = AUTHENTICATION_PROCESS_STATUS;
	           	TxRetryCounts = TX_RETRY_COUNTS;	//重复发送几次
			    break;					 
                 
           case ACK_DEV_AUTHENTICATION_INFO:	//应答确认信息
		        if(RxBuff[3] != ACK_OK)
		  	    {
				 if(TxRetryCounts > 0)
				 {
                  SendDevAuthenticationInfo();
				  TxRetryCounts--;
				 }
				 //else
				 //{
				  //SendIdentify();
				  //FMTxStatus = IDENTIFY_STATUS;	
				 //}
                }
                break;
		   			  
		   case GET_DEV_AUTHENTICATION_SIGNATURE:	
#if defined AUTH_PROT_VER10				
				for(i = 0;i < 20;i++)
                {
                 TxBuff[i] = RxBuff1[i];
                }
#endif
#if defined AUTH_PROT_VER20				
				for(i = 0;i < 24;i++)
                {
                 TxBuff[i] = RxBuff1[i];
                }
#endif				
		        SendDevAuthenticationSignature();
				UartReceive = UART_RECEIVE;
			    break;
			
           case ACK_AUTHENTICATION_STATUS:
		        if(RxBuff[3] == ACK_OK)
				{
				 FMTxStatus = AUTHENTICATION_FINISH_STATUS;			//IPOD 授权通过
	             SendSetIpodPreferences();								//发送建立CLASS ID 
				}
				//else
				//{
				 //if(AckAuthStatCoun == 0)   //Permit to retry only twice
				 //{
				  //SendIdentify();
				  //FMTxStatus = IDENTIFY_STATUS;	
				 //} 
				//}
                break;				
			      
           case ACK:
		        switch(RxBuff[4])
			    {
                 case IDENTIFY_DEVICE_LINGO:		//发送COMMAND ID号
				      if(RxBuff[3] == ACK_OK)
				      {
                       //FMTxStatus = IDENTIFY_DEVICE_LINGO_STATUS;
					   FlagBuff1 |= IDENTIFY_ACK;						
					   bTxCommand = FALSE;
              }
					  else if(RxBuff[3] != ACK_PENDING)
				      {
				       if(TxRetryCounts > 0)
				       {
				        TxRetryCounts--;
                        FMTxStatus = CP_RESET_DELAY_STATUS;		//等待收到完整的ACK数据包
						IdentifyRetryCounts = IDENTIFY_RETRY_COUNTS;
						FlagBuff1 &= ~IDENTIFY_ACK;
		                bTxCommand = TRUE;
                        wStatusDelay = 0;
                 }
					   else
					   {
						SendIdentify();												//发送认证AC认证信息
						FMTxStatus = IDENTIFY_STATUS;
					    FlagBuff1 |= IDENTIFY_ACK;	
		                bTxCommand = TRUE;
                        wStatusDelay = 0;				
					   }
					  }
					  //FlagBuff1 |= IDENTIFY_ACK;
					  break;
					 
			       default:
				        break;
			     }
				 break;

		   default:
		        break; 
		  }
		  break;
 
     default:
	      break;
    }
   }
  
  
   if(bTxCommand == TRUE)				//复位初始化CP 
   {
    switch(FMTxStatus)

⌨️ 快捷键说明

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