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

📄 card.cpp

📁 基于单片机ATmega16制作IC card 。程序中包含数据的采集和通信。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  }	  
  DelayUs(6);
  asm("sbi 0x15,1");
  DelayUs(6);
  Data <<= 1;
 }
}
/////////
void WriteDataBit(unsigned char Data,unsigned char Number)
{
 unsigned char i;

 for(i = 0;i < Number;i++)
 {
  asm("wdr");
  asm("cbi 0x15,1");
  if(Data & 0x01)
  {
   asm("sbi 0x15,0");
  }
  else
  {
   asm("cbi 0x15,0");  
  }	  
  DelayUs(6);
  asm("sbi 0x15,1");
  DelayUs(6);
  Data >>= 1;
 }	
}
/////////////

void WriteCommand(unsigned char Command)
{
 asm("cbi 0x15,2");
 WriteBit(COMMAND_ID,3);
 WriteBit(Command,9); 
 asm("sbi 0x15,2"); 
}
///////////////////////

void FrequenceToDisplayBuff(unsigned int wFrequence)		//LCD Diplay			
{
 					
 unsigned char i,DisplayDigital[MAX_DIGITAL_NUMBER];
 unsigned int wTemp1,wTemp2;

 for(i = 0;i <=MAX_DIGITAL_NUMBER;i++)
 {
 DisplayBuff[i] = 0;
	} 
 wTemp1 = wFrequence; 
 wTemp2 = 1000;

	
 for(i=0;i<=3;i++)
 {
  DisplayDigital[i] = wTemp1/wTemp2;
  wTemp1 = wTemp1%wTemp2;
  wTemp2 = wTemp2/10;  
 }
 
 	for(i=2;i<=4;i++)
 	DisplayBuff[i]=LCDDigitalToSegment[DisplayDigital[i-1]];
 	if(DisplayDigital[0]==0)																//最高位为零,则最高位不显示
 	DisplayBuff[1]=0;
 	else
 	DisplayBuff[1]=LCDDigitalToSegment[DisplayDigital[0]];
 	DisplayBuff[MAX_DIGITAL_NUMBER]|=FM;
 	DisplayBuff[MAX_DIGITAL_NUMBER]|=MHZ;
	DisplayBuff[MAX_DIGITAL_NUMBER-9]|= DOT;	
 		
}

/////////////////////
void	ad_key_scan(void)			//按键扫描
{
	
  	if(B_10ms)
  	{			
  			B_10ms=0;
  			ADMUX = 0x67;
 			 ADCSRA |= (1 << ADSC);
				while(ADCSRA&ADSC);
				adc_data = ADCH;
				if(ADCBuff >= adc_data)
 			 {
 			  ADC_INT_Temp1 = ADCBuff - adc_data;  
 			 }  
 			 else
 			 {
 			  ADC_INT_Temp1 = adc_data - ADCBuff;
 			 }
 			 ADCBuff = adc_data;
 			 if(ADC_INT_Temp1 < 10)
 			 { 
 			  if(adc_data < 50)
 			  {
				FlagBuff1 |= INSERT_IPOD;
 			  }
 			  else
 			  {
 			   FlagBuff1 &= ~INSERT_IPOD; 
 			  }
 			 }
			//ADMUX = 0x66;
	

////////////	
	
				ADMUX = 0x66;
				ADCSRA |= (1 << ADSC);
				while(ADCSRA&ADSC);
				adc_data = ADCH;	
					if(ADCBuff1 >= adc_data)
				  {
				   ADC_INT_Temp1 = ADCBuff1 - adc_data;  
				  }  
				  else
				  {
				   ADC_INT_Temp1 = adc_data - ADCBuff1;
				  }
				  ADCBuff1 = adc_data;
				  if(ADC_INT_Temp1 < 10)
				  {
				   
				   if(adc_data > ADC_DATA)				//没有按键按下
				   {
					KeyBuff = KEY_CODE;
				    bFastChange = FALSE;
					if(bReleaseKey == FALSE)
					{
				     if(KeyValue == KEY_PRIVACY)	//ON/OFF与PRIVACY开关转换
				     {
					  bKeyUse = TRUE;	  
				     }
					 if(KeyValue == KEY_RECORD)
				     {
					  bKeyUse = TRUE;	  
				     }		 
					}
				    bReleaseKey = TRUE;
				   }
				   
				///////按键码判断   
				   
				   else if((adc_data > (ADC_DATA1 - ADC_DATA_LEN)) && (adc_data < (ADC_DATA1 + ADC_DATA_LEN)))
				   {
					KeyBuff = KEY_CODE5;
				   }
				   else if((adc_data > (ADC_DATA2 - ADC_DATA_LEN)) && (adc_data < (ADC_DATA2 + ADC_DATA_LEN)))
				   {
					KeyBuff = KEY_CODE4;
				   }
				   else if((adc_data > (ADC_DATA3 - ADC_DATA_LEN)) && (adc_data < (ADC_DATA3 + ADC_DATA_LEN)))
				   {
					KeyBuff = KEY_CODE3;  
				   }
				   else if((adc_data > (ADC_DATA4 - ADC_DATA_LEN)) && (adc_data < (ADC_DATA4 + ADC_DATA_LEN)))
				   {
					KeyBuff = KEY_CODE2;
				   }
				   else if(adc_data < (ADC_DATA5 + ADC_DATA_LEN))
				   {
					KeyBuff = KEY_CODE1;   
				   }   
				  }
				  switch(KeyBuff)
				  {
				   case KEY_CODE2:												//FM发送频率档位设置
				   case KEY_CODE3:
				   case KEY_CODE5:
					              if(bReleaseKey == TRUE)
								  {
								  KeyValue = KeyBuff;
				                   bReleaseKey = FALSE;
					               FastChangeTime = 0;
					               bKeyUse = TRUE;
								  }
								  else if((KeyValue == KeyBuff) && ((KeyBuff == KEY_CODE2) || (KeyBuff == KEY_CODE3)))
								  {
								   if(bFastChange == TRUE)
				                   {	 	
					                if(FastChangeCount < FAST_CHANGE_COUNT)
					                {	 
				                     if(FastChangeTime > MS_300)
					                 {
					                  bKeyUse = TRUE;
				                      FastChangeTime = 0;
					                  FastChangeCount++;
					                 }
					                }
					                else if (FastChangeTime > MS_80)
					                { 
					                 bKeyUse = TRUE;
				                     FastChangeTime = 0;
					                } 
					               }
				                   else
				                   {
				                    if(FastChangeTime > MS_500)
					                {
					                 bFastChange = TRUE;				//按键长按起始标志
					                 FastChangeCount = 0;
									 FastChangeTime = 0;
					                }
				                   }
				  				  }
								  break;
								 
				   case KEY_CODE1:												//按键ON/OFF选择
				   case KEY_CODE4:												//OS FM频率档位设置
				                  if(bReleaseKey == TRUE)
								  {
							       FastChangeTime = 0; 
								   bReleaseKey = FALSE; 
								   KeyValue = KeyBuff;
								  }
								  else if(KeyValue == KeyBuff)
								  {
								   if(KeyValue == KEY_CODE4)
								   {
								    if(FastChangeTime >= MS_2000)
									{
								     KeyValue = KEY_FQ_MODE_SET;	
									 bFastChange = TRUE;
									 bKeyUse = TRUE;
								     //FastChangeTime = 0;				   
								     }
									}
								   else  if(FastChangeTime >= MS_1000) 
								    {
									//KeyValue = (KeyBuff == KEY_CODE4) ? KEY_FM_TOGGLE : KEY_ON_OFF;
								     if(KeyValue == KeyBuff)
									 {
									  KeyValue = KEY_ON_OFF;	
									  bFastChange = TRUE;
									  bKeyUse = TRUE;
								      //FastChangeTime = 0;
									 } 
									}
								   }
				                   break; 
				   default:
					     break;			  
					

						}
					//ADMUX = 0x67;
//////////
					PINBBuff = 0;
 					PINDBuff |= (PIND & AUDIO_DETECT);							//音频检测开关
 					PINBBuff |= (PINB & BT_SWITCH_DETECT);					//来电检测开关
 					PINBBuff |= (PINB & IPOD_POWER_UP_DETECT);			//IPOD电源检测开关
//////// 					
		if((PINB & BT_SWITCH_DETECT) == (PINBBuff & BT_SWITCH_DETECT))
  {
   if(PINBBuff & BT_SWITCH_DETECT)
   {
	FlagBuff |= BT_AUDIO_ON;    
   }
   else
   {
	FlagBuff &= ~BT_AUDIO_ON;   
   }   
  }
  if((PIND & AUDIO_DETECT)== (PINDBuff & AUDIO_DETECT))
  {
   if(PINDBuff & AUDIO_DETECT_OFF)
   {
	wAudioDetectDelay++;
	if(FlagBuff & AUDIO_ON)
	{
	 FlagBuff &= ~AUDIO_ON;	
	 wAudioDetectDelay = 0;	
	}
   }
   else
   {
	if(!(FlagBuff & AUDIO_ON))
	{
	 FlagBuff |= AUDIO_ON;	
	}
   }   
  } 
  if((PINB & IPOD_POWER_UP_DETECT) == (PINBBuff & IPOD_POWER_UP_DETECT))
  {
   if(PINBBuff & IPOD_POWER_UP_DETECT)
   {
	FlagBuff |= IPOD_POWER_UP;
   }
   else
   {
	FlagBuff &= ~IPOD_POWER_UP;
   }   
  }  
					
 }	
}
					
////////////////////
void FrequenceAreaToDisplayBuff(unsigned char FrequenceArea)
{
 DisplayBuff[0]= 0x00;
 DisplayBuff[0]|= FrequenceArea;
}


//////////////
void DisplayFrequence(void)				//LCD液晶显示
{
 unsigned char i,temp;
 
 //asm("cbi 0x08,2");		//this port is	cs
 
 PORTC&=~LCD_CS;
 WriteBit(WRITE_ID,3); 
 WriteBit(LCD_ADDRESS,6);
 for(i = 0;i<=MAX_DIGITAL_NUMBER;i++)
 {
  WriteDataBit(DisplayBuff[i],4);
  temp = (DisplayBuff[i] >> 4);
  WriteDataBit(temp,4);
  asm("wdr");
 }
 //asm("sbi 0x08,2");	//this port is cs
	PORTC|=LCD_CS;

}	
////////////
void	FmFrequenceToLcdDiplaySub(unsigned int wFrequence)					//FM/IPOD LCD SHOW
{
		FrequenceToDisplayBuff(wFrequence);
		DisplayFrequence();
}

///////////

void DelayUs(unsigned char UsNumber)  //Delay us amount counts is UsNumber * 3
{
 
	  //_delay_loop_1(UsNumber*8);
		TCNT0=0;
		while(TCNT0<UsNumber*8);


}
//////////
/*
void Delay(unsigned char UsNumber)
{
 unsigned char i = 0;
 for(i = 0;i < UsNumber;i++)
 {
  asm("wdr");
 }
}*/

void ReadFlash(unsigned char *pDestinationAddr,unsigned char *pFlashAddr,unsigned char Number)
{
 unsigned int i;
 for(i = 0;i < Number;i++)
 {
  *(pDestinationAddr + i) = pgm_read_byte((pFlashAddr + i));
 }  
}



/////////////////////////////////////////////////////////////////////////////
//card
void lcd_init(void)
{
 WriteCommand(BIAS);
 WriteCommand(SYS_EN);
 WriteCommand(LCD_ON);
 DisplayFrequence();
}
////////
void LCDFlash(void)
{
 if(LCDFlashTime > LCDFlashTimePreset)
 {
  if(FlagBuff1 & LCD_LIGHT_KEEP)
  {
   FlagBuff1 &= ~LCD_LIGHT_KEEP;
   WriteCommand(LCD_OFF);
  }  
  else
  {
   FlagBuff1 |= LCD_LIGHT_KEEP;
   WriteCommand(LCD_ON);  
  }
  LCDFlashTime = 0;
 }
}
///////////
void InitWdt(void)
{
 //asm("cli");
 asm("wdr");
 //WDTCSR |= (1 << WDCE) | (1 << WDE);
 //WDTCSR = (1 << WDE) | (1 << WDP2) | (1 << WDP0);
 WDTCR|=(1 << WDE) | (1 << WDP2) | (1 << WDP0);
 
 
 //asm("sei");
} 
/*
void StopWdt(void)
{
 asm("cli");
 asm("wdr");
 MCUSR &= ~(1 << WDRF);
 WDTCSR |= (1 << WDCE) | (1 << WDE);
 WDTCSR = 0x00;
 asm("sei"); 
}*/
/////////////
void BTTxConfig(void)
{
 BTTxBuff[0] = 0x55;	  //No privacy 
 BTTxBuff[1] = 0x03;    //Command length
 //TIFR2 |= (1 << TOV2);
 TCNT2 = 0xcd;  //0xb4 Wait for 104+52-2-2 us,-2-2 is running time for instruction 
 TCCR2= 0x02;	//TCCR2B = 0x02;//Timer 2 init;
 TIMSK = 0x86;	//TIMSK2 = 0x01;  //Turn on timer2 interrupt 
 PORTD &= ~BT_RX; 
 BTTxBitCount = 0;
 BTTxByteCount = 0;
}
/////////////
void io_init(void)
{
	PORTA=0b00000000;
	DDRA=0b01111111;
	
	
	PORTB = 0b10111110; 
	DDRB = 	0b10111100; 
	// PortC
	PORTC = 0b00011111;
	DDRC = 0b11111111;
	// PortD
	PORTD = 0b11101110;
	DDRD = 0b11010010;
	
	ACSR = 0x80;

}
/////////////
void TurnOnLed(unsigned int wTurnOnTime)
{
 PORTC &= ~LED;
 LedWorkMode = LED_ON_DELAY;
 wLedOffDelay = 0;
 wLedTurnOnTime = wTurnOnTime;
}

/////
/*
void FMFrequeceControl(unsigned int wFMFrequence,unsigned int wFMControlBitmap)
{
 unsigned int wFMControlCommand;
 unsigned char i; 
 
 wFMControlCommand = wFMFrequence & FM_CONTROL_MASK;
 wFMControlCommand |= wFMControlBitmap;
 //asm("cbi 11,5");
 asm("sbi 0x0b,5");    //PORTD  Set FM_CE
 for(i = 0;i < 16;i++)
 {
  asm("wdr");
  if(wFMControlCommand & 0x01)
  {
   asm("sbi 0x0b,7");  //PORTB Set FM_DATA
  }
  else
  {
   asm("cbi 0x0b,7");
  }
  DelayUs(3);
  asm("sbi 0x0b,6");  //PORTD Set FM_CLK
  DelayUs(6);
  asm("cbi 0x0b,6");
  DelayUs(3);
  wFMControlCommand >>= 1;
 }
 asm("cbi 0x0b,5");    //PORTD  Clear FM_CE 
 //asm("sbi 11,5")
}*/

void I2cStart(void)
{
 
 PORTD |= FM_DATA;
 //DelayUs(6);
 PORTD |= FM_CLK;
 DelayUs(6);
 PORTD &= ~FM_DATA;
 //DelayUs(6);
 //PORTD &= ~FM_CLK;
 DelayUs(6); 
	
}
///////////
void I2cStop(void)
{

⌨️ 快捷键说明

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