📄 card.cpp
字号:
}
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 + -