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

📄 card.cpp

📁 基于单片机ATmega16制作IC card 。程序中包含数据的采集和通信。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
							}
						break;
/////////
			case	KEY_IPOD_BACK:																								
							if(!(FlagBuff&BT_AUDIO_ON)&&(FMTxStatus ==AUTHENTICATION_FINISH_STATUS))	
							{		
				
									while(IpodLongKey)
									{
									TurnOnLed(MS_30000);								
									wStatusDelay=0;
									SendContextButtonStatus(PREVIOUS_TRACK);
									while(wStatusDelay < MS_50);									
									}							
								
							}													
							
						break;
///////
					case	KEY_IPOD_UP:																							
								if(!(FlagBuff&BT_AUDIO_ON)&&(FMTxStatus ==AUTHENTICATION_FINISH_STATUS))	
							{	
								
									while(IpodLongKey)
									{
									TurnOnLed(MS_30000);
									wStatusDelay=0;
									SendContextButtonStatus(UP_ARROW);
									while(wStatusDelay < MS_50);									
									}							
																																						
							}
						break;
/////						
						case	KEY_IPOD_DOWNP:							
									if(!(FlagBuff&BT_AUDIO_ON)&&(FMTxStatus ==AUTHENTICATION_FINISH_STATUS))	
							{	
									while(IpodLongKey)
									{
									TurnOnLed(MS_30000);
									wStatusDelay=0;
									SendContextButtonStatus(DOWN_ARROW);
									while(wStatusDelay < MS_50);									
									}							
							}																							
						break;
///////////////////////////
		
						case	KEY_IPOD_STAUS:									
									if(!(FlagBuff&BT_AUDIO_ON)&&(FMTxStatus ==AUTHENTICATION_FINISH_STATUS))																											
									{TurnOnLed(MS_30000);
									get_ipod_play_staus();
									UartReceive = UART_RECEIVE;									
									}
									break;
						case	KEY_IPOD_MENU:																	
							if(!(FlagBuff&BT_AUDIO_ON)&&(FMTxStatus ==AUTHENTICATION_FINISH_STATUS))
									{
									TurnOnLed(MS_30000);
									SendContextButtonStatus(MENU);									
									}									
									break;
////////////////////BLUETOOTH附加功能
						case	KEY_HAND_UP:
									if(FlagBuff&BT_AUDIO_ON)
									send_bt_command((prog_uchar *)McuAnswerReq);
									break;

						case	KEY_HAND_DOWN:
									if(FlagBuff&BT_AUDIO_ON)
									send_bt_command((prog_uchar *)McuHangUpReq);
									break;



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

								 case KEY_PRIVACY:
									  if(FlagBuff & BT_AUDIO_ON)
  							        {
 									   BTTxBuff[2] = 0x01;
									   if(FlagBuff & FM_MUTE_ON)
									   {
									    //PORTB &= ~FM_MUTE;     //Turn on FM
								    	I2cWriteByteData(0x02,(~ENABLE_MUTE&PILOT_PRE_EMPH_AMPL));   
									    FlagBuff &= ~FM_MUTE_ON;
										BTTxBuff[3] = 0x00;//0x03;//0x02;	  //No privacy 
									    BTTxBuff[4] = 0x01;//0x03;//0x02;
									   }
									   else
									   {
										//PORTB |= FM_MUTE;    //Turn off FM 
										I2cWriteByteData(0x02,(ENABLE_MUTE|PILOT_PRE_EMPH_AMPL));
  							          FlagBuff |= FM_MUTE_ON;			
									    BTTxBuff[3] = 0x01;//0x03;//0x01;  //Privacy
									    BTTxBuff[4] = 0x02;//0x03;//0x01;
									   }
  							         BTTxConfig();
  							  	   TurnOnLed(MS_30000);		   
									  }
									  break;	  
/////////
										case	KEY_OFF_BLUETOOTH:										//关闭蓝牙
										send_bt_command((prog_uchar *)McuHfPownOnOffReq);									
										break;

//////////	  
     								default:
	      						break;
    }
  }	
}

//////////////////////////////////写EEROM数据
void	write_data_to_eeprom(unsigned	int	addr,unsigned int	data)		
{
/*
		unsigned	char	addrbuff;
					addrbuff=addr;			
	
							while (!eeprom_is_ready())
  						{
  						 asm("wdr"); 
 							 } 
  eeprom_write_byte((uint8_t *) &addrbuff,*(uint8_t *)&data+1);	
							while (!eeprom_is_ready())
  						{
  						 asm("wdr"); 
 						} 																				
								addrbuff++;
	eeprom_write_byte((uint8_t *)&addrbuff,*(uint8_t *)&data);	
						while (!eeprom_is_ready())
  						{
  						 asm("wdr"); 
 							 } 		

*/											//low byte
										/* Wait for completion of previous write */
										while(EECR & (1<<EEWE));									
										/* Set up address and data registers */
										EEAR = addr;
										EEDR = *(unsigned char *)&data;
										/* Write logical one to EEMWE */
										EECR |= (1<<EEMWE);
										/* Start eeprom write by setting EEWE */
										EECR |= (1<<EEWE);
										while(EECR & (1<<EEWE));
										//high byte		
										EEAR=addr+1;
										EEDR=*((unsigned char *)&data+1);
										EECR |= (1<<EEMWE);
										/* Start eeprom write by setting EEWE */
										EECR |= (1<<EEWE);
									//	while(EECR & (1<<EEWE));
										
									
}
///////////////////////////////
void	write_fm_data_to_eeprom(unsigned int	addr,unsigned int	data)				
{			
	
	if(bReleaseKey == TRUE)
		{
				if(bFMFrequenceChange == TRUE)
					{
							bFMFrequenceChange = FALSE;
							write_data_to_eeprom(addr,data);	
					}
		
		}
}
///////////////////////////////////////////读EEROM数据
unsigned int	read_data_from_eeprom(unsigned int	addr)	
{	
		
		unsigned int	databuff;						
/*																												
			while (!eeprom_is_ready())
  						{
  						 asm("wdr"); 
 							 } 
						databuff=eeprom_read_word((uint16_t *)&addr);
			
						return	databuff;	
*/
			/* Wait for completion of previous write */
				while(EECR & (1<<EEWE));				
				/* Set up address register */
				EEAR = addr+1;
				/* Start eeprom read by writing EERE */
				EECR |= (1<<EERE);
				/* Return data from data register */
				databuff=EEDR;
				databuff<<=8;
			
				while(EECR & (1<<EEWE));
				EEAR = addr;
				EECR |= (1<<EERE);
				databuff+=EEDR;
				return	databuff;
		
}

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

void	retry_cp_rest(void)
{
if(FMTxStatus == CP_RESET_DELAY_STATUS)
  {
   if(wStatusDelay > MS_5000)
   {
	if(TxRetryCounts1> 0)
	{
     TxRetryCounts1--;	 
     FMTxStatus = TX_SYN_CODE_STATUS;
     //bTxCommand = TRUE;
     //wStatusDelay = 0; 
	}
	else
	{   
     bTxBuffLock = FALSE;
	 UartReceive = UART_RECEIVE;
	 SendIdentify();   
    //bTxCommand = FALSE;
	 FMTxStatus = IDENTIFY_STATUS;
	 //bTxCommand = TRUE;
     //wStatusDelay = 0;
	}
    bTxCommand = TRUE;
    wStatusDelay = 0;	
   }
  }
}
//////////////////
void	bluetooth_lcd_display(void)											//电话号码LCD显示
{
		unsigned char i,data_long,j;	
		unsigned char	DisplayDigital[BtRxData[2]-2];	
									
			if(BtRxDataPackOver)
			{
					if(BtRxData[2]==HF_MCU_CALLER_ID_IND)
					{
						if((BtRxData[2]-2)>LCD_DIPLAY_LENG)
							data_long=LCD_DIPLAY_LENG;
						else
							data_long=BtRxData[2]-2;
						for(i=0;i<5;i++)														
								DisplayDigital[9-i]=BtRxData[3+i];			//LCD前五位显示								
						for(j=0;i<data_long;i++,j++)
								DisplayDigital[j]=BtRxData[i];					//LCD后五位显示							
						if(data_long<LCD_DIPLAY_LENG)								//如果显示位数小于LCD字段长度
						for(i=0;i<(LCD_DIPLAY_LENG-data_long);i++)
							DisplayDigital[4-i]=10;										//后面字段不显示
						for(i=0;i<data_long;i++)
						DisplayBuff[i]=LCDDigitalToSegment[DisplayDigital[i]];
						DisplayFrequence();						
					}	
																																				
			}
			BtRxDataPackOver=0;		
}
/////////////bluetooth	transmiting 	staus 
void	FM_bluetooth_transmit_display(void)				//来电时状态检测与转换转换
{
	//#if defined(FM_CUP_BLUETOOTH) || defined(FM_CUP_RECORD_BLUETOOTH) 
  if(FlagBuff & BT_AUDIO_ON)						//是否有电话进来	蓝牙状态
  {
   if(!(FlagBuff & BT_AUDIO_ON_HOLD))
   {
	bluetooth_lcd_display();
	PORTB &= ~BT_MUTE;
	FlagBuff |= BT_AUDIO_ON_HOLD;
	FlagBuff1 &= MICROPHONE_MUTE_ON;
	if(!(FlagBuff & AUDIO_TRANSMIT))		//是否用FM传输音频
    {
	 PORTC |= KT0801_RESET;						
	 KT0801Configuration(FmFrequenceData);
	 FlagBuff |= (AUDIO_TRANSMIT | AUDIO_ON);
	 FlagBuff &= ~FM_MUTE_ON;								//开启FM音频发送,关闭私人模式						
	 WriteCommand(LCD_ON);
	 FlagBuff1 |= LCD_LIGHT_KEEP;
    }
	if(FMTxStatus == AUTHENTICATION_FINISH_STATUS)
	{
	 ReadFlash(TxBuff,(prog_uchar *)GetPlayStatus,GET_PLAY_STATUS_LEN);
     WriteUart(GET_PLAY_STATUS_LEN,WAIT_TX);
//     FlagBuff1 &= ~GET_IPOD_PLAY_STATUS;
	} 
   }
  }
  else															//IPOD 播放状态
  { 
   if(FlagBuff & BT_AUDIO_ON_HOLD)
   { 
	FmFrequenceToLcdDiplaySub(FmFrequenceData);
	FlagBuff &= ~BT_AUDIO_ON_HOLD; 		
    PORTB |= BT_MUTE;								//如果挂机则关闭蓝牙音频
    
//    if(FlagBuff & FM_MUTE_ON)				//是否用耳机,关闭FM
//    {
//     I2cWriteByteData(0x02,(~ENABLE_MUTE&PILOT_PRE_EMPH_AMPL));
//     FlagBuff &= ~FM_MUTE_ON;
//    }
//    if(FlagBuff1 & GET_IPOD_PLAY_STATUS)	
	{
//	 FlagBuff1 &= ~GET_IPOD_PLAY_STATUS;	
	 if(FlagBuff1 & IPOD_PLAY)
	 {
	  SendContextButtonStatus(PLAY);//PRESS_PAUSE_KEY);			//如果处于播放状态,挂机后则继续播放
	  FMTxStatus1 = CONTEX_BOTTON_PRESS_STATUS;
	  bTxCommand1 = TRUE;
	  wStatusDelay1 = 0; 
	 }		 
	}
   }
  }
}	
/////////////FM_audio on or off
void	FM_audio_test(void)
{
	
  if(!(FlagBuff & BT_AUDIO_ON))
  {
   if(FlagBuff & AUDIO_TRANSMIT)
   {
    if(!(FlagBuff & AUDIO_ON))
    {
	 if(wAudioDetectDelay > MS_55000)
	 {
	  FlagBuff &= ~AUDIO_TRANSMIT;				//IPOD无音频输入时时关闭FM	
	  PORTC &= ~KT0801_RESET;
	  LCDFlashTime = 0;
	 }
    }	  
   }
   else
   {
    if(FlagBuff & AUDIO_ON)
    {
	 PORTC |= KT0801_RESET;
	 KT0801Configuration(FmFrequenceData);
	 FlagBuff |= AUDIO_TRANSMIT;				//IPOD有音频输入,且设置FM输出时,打开FM发送
	 FlagBuff &= ~FM_MUTE_ON;
	 WriteCommand(LCD_ON);
	 FlagBuff1 |= LCD_LIGHT_KEEP;
	}  
   }
  }
  else
  {
   cli();	  
   wAudioDetectDelay = 0;
   sei();
  }
  		
}
///////////////
void	led_work_delay(void)
{
		if(B_10ms)
		{	
				B_10ms=0;
			if(LedWorkMode == LED_ON_DELAY)
 				{
 					 if(wLedOffDelay > wLedTurnOnTime)
 					 {
 					  PORTC |= LED;
 					  LedWorkMode = LED_OFF;
 					 }
 				}
	
	}
}

/////////////////////////////////////////////////////////////主控程序
int main(void)
{	
 	io_init();
 	timers_init();
 	InitWdt();
 	WriteCommand(SYS_DIS);
 	adc_init();
 	spi_init();
 	uart_init(); 
	extint_init();
 
 	sei();
	 
	 
 	TurnOnLed(MS_30000);
 	lcd_init();
//////////// 
 	while(1)
 	{
 	asm("wdr");
 	PORTC=0x0ff;
 
 	
 	wStatusDelay = 0; 
 	while(wStatusDelay < MS_60)
 	{
  	asm("wdr"); 
 	}
 	PORTC=0;
 
 	wStatusDelay = 0; 
 	while(wStatusDelay < MS_60)
 	{
  	asm("wdr"); 
 	}
 

 }
 
/////// 
 
 	PORTD |= (BT_POWER_ON | KT0801_POWER_ON); 
 	PORTC &= ~KT0801_RESET;
 	wStatusDelay = 0; 
 	while(wStatusDelay < MS_30)
 	{
  	asm("wdr"); 
 	}
 	PORTC |= KT0801_RESET;
/////////EEPROMM 读写操作
	if(read_data_from_eeprom(INIT_EEPROM_ADDR)==TEST_DATA)
			FmFrequenceData=read_data_from_eeprom(EEPROM_FM_DATA_ADDR);
	else
		{	write_data_to_eeprom(INIT_EEPROM_ADDR,TEST_DATA);
				FmFrequenceData=FIRST_INIT_DATA;
		}	
	
								
 ////////////////////
 	KT0801Configuration(FmFrequenceData);
 	FlagBuff |= (AUDIO_TRANSMIT | AUDIO_ON);  //Turn off mute because FlagBuff is inialized as 0
 	
 	wStatusDelay = 0;
	while(wStatusDelay < MS_100)
 {
  asm("wdr"); 
 }		   
 
////////lcd display	
 	FmFrequenceToLcdDiplaySub(FmFrequenceData); 
   
 while(1)
 {
  	asm("wdr");
  // TODO: Add your code here   
  //ad_key_scan();
  	led_work_delay();
  	ipod_power_test();									//IPOD上电检测	
  	ipod_receiving_pack();							//数据包接收
 		ipod_key_dothing();
  	asm("wdr");
  	write_fm_data_to_eeprom(EEPROM_FM_DATA_ADDR,FmFrequenceData); 
  	retry_cp_rest();									//重复CP初始化,发送ID认证 
  	FM_bluetooth_transmit_display();		//蓝牙打开时状态与显示	
  	FM_audio_test();										//FM音频检测
	}
}

/*  
  if(!(FlagBuff & AUDIO_TRANSMIT))
  {
   
   LCDFlash();
  }  
*/	
	  /*
   if(FlagBuff1 & LCD_LIGHT)
   {
    if(!(FlagBuff1 & LCD_LIGHT_KEEP))
    {
	 FlagBuff1 |= LCD_LIGHT_KEEP;
	 WriteCommand(LCD_OFF);
    }
   }
   else 
   {
    if(FlagBuff1 & LCD_LIGHT_KEEP)
    { 
     FlagBuff1 &= ~LCD_LIGHT_KEEP;
     WriteCommand(LCD_ON);  
    }
   }
  }*/
  
//#endif  












⌨️ 快捷键说明

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