//----------------------- // wr_data //----------------------- void wr_data(unsigned char dat) { LCDE_L; RW_L; RS_H; LCDE_H; SET_LCMDATA(dat); delay50us(); LCDE_L; RS_L; delay5ms(); //delay50us(); }
void senddata(uchar data1) { uchar tempdata,i; tempdata=data1; cls=0; delay50us(1); for(i=0;i<8;i++) { dat=(tempdata & 0x80)>>7; clk=1; tempdata=tempdata<<1; delay(1); clk=0; delay(1); } dat=0; }
//----------------------- // wr_com //----------------------- void wr_com(unsigned char comm) { // 8bit LCDE_L; RS_L; RW_L; LCDE_H; SET_LCMDATA(comm); delay50us(); LCDE_L; delay5ms(); //delay50us(); }
uchar keyscan() { uchar i,tempdata=0; if(key==0) { senddata(0x15); dat=1; delay50us(1); for(i=0;i<8;i++) { clk=1; delay(1); tempdata=(tempdata<<1) | dat; clk=0; delay(1); } dat=0; return tempdata; } else return 0xFF; }
void main(void) { unsigned char cnt=0, i, j; unsigned char receivedByte; bit validKeyPressed = 0; union { unsigned char byteVal[2]; unsigned int intVal; } keyValue; RDA5802Init(); // RDA5802ForceMono( 0 ); // RDA5802BoostBass( 1 ); RDA5802SetVolume( currentVol ); //初始化红外口 IR=1; RELAY_SPEAKER=1;//继电器关 RELAY_POWER=1; while(1) { validKeyPressed = 0; //如果检测到合法按键,则此变量将被置1 // 等待下降沿 while(IR); //记录9ms低电平的长度 cnt=0; while((!IR)&& cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if(cnt<170||cnt>180) continue; //9ms低电平不符合,判为干扰 //记录4.5ms高电平的长度 cnt=0; while(IR && cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if(cnt<80||cnt>95) continue; //4.5ms高电平不符合,判为干扰 //收取4个字节 for( i=0; i<4; i++ ) { receivedByte=0; for( j=0; j<8; j++ ) { //记录0.56ms低电平 cnt=0; while(!IR && cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if(cnt<8||cnt>15) continue; //0.56ms低电平不符合,判为干扰 //记录高电平长度,决定是0还是1 cnt=0; while(IR && cnt<IR_COUNT_TIME_OUT ) { delay50us(); cnt++; } if( cnt>7 && cnt<16 )//0.56ms高电平,判为0 { if( j!=0 ) receivedByte <<= 1; //首位不用左移 } else if(cnt>28 && cnt<40)//1.68ms高电平,判为0 { //该位为1 if( j!=0 ) receivedByte <<= 1; //首位不用左移 receivedByte |= 1; } else break; //低电平不符合0.56ms或1.68ms,判为干扰 } if( cnt >= IR_COUNT_TIME_OUT) break; //干扰 //第一字节为0x00,第二字节为0xff //第三、四字节为键值 if( i==0 && receivedByte!=0 ) break; else if( i==1 && receivedByte!=0xff ) break; else if( i==2 ) { keyValue.byteVal[0] = receivedByte; } else if( i==3 ) { keyValue.byteVal[1] = receivedByte; validKeyPressed = 1; //检测到了合法按键 } } if(validKeyPressed) { //检测到合法的按键了 switch( keyValue.intVal ) { // case 0xa25d: //CH- // case 0x629d: //CH // case 0xe21d: //CH+ // if(powerUp) // { // RDA5802PowerUp(0); // powerUp=0; // } // break; // case 0x22dd: //|<< // RDA5802PowerUp(0); // break; // // case 0x02fd: //>>| // RDA5802PowerUp(1); // break; case 0xe01f: //VOL- if( powerUp && (currentVol>1) ) { currentVol--; RDA5802SetVolume(currentVol); } break; case 0xa857: //VOL+ if( powerUp && (currentVol<15) ) { currentVol++; RDA5802SetVolume(currentVol); } break; case 0x906f: //EQ (Power Off) if(powerUp) { RELAY_SPEAKER=1; delay250ms(); delay250ms(); RELAY_POWER=1; //延时关电源,避免爆炸声 RDA5802PowerUp(0); //关模块 powerUp=0; } break; case 0x30cf: //1 currentStationIndex=0; playStation(); break; case 0x18e7: //2 currentStationIndex=1; playStation(); break; case 0x7a85: //3 currentStationIndex=2; playStation(); break; case 0x10ef: //4 currentStationIndex=3; playStation(); break; case 0x38c7: //5 currentStationIndex=4; playStation(); break; case 0x5aa5: //6 currentStationIndex=5; playStation(); break; case 0x42bd: //7 currentStationIndex=6; playStation(); break; default: break; } } } }
void interrupt_init(int int_vect,int mode) { switch ( int_vect ) { case INT0: if (mode==0) { sbi(EICRA, ISC01); cbi(EICRA, ISC00); } else { sbi(EICRA, ISC01); sbi(EICRA, ISC00); } delay50us(1); break; case INT1: if (mode==0) { sbi(EICRA, ISC11); cbi(EICRA, ISC10); } else { sbi(EICRA, ISC01); sbi(EICRA, ISC00); } delay50us(1); break; case INT2: if (mode==0) { sbi(EICRA, ISC21); cbi(EICRA, ISC20); } else { sbi(EICRA, ISC21); sbi(EICRA, ISC20); } delay50us(1); break; case INT3: if (mode==0) { sbi(EICRA, ISC31); cbi(EICRA, ISC30); } else { sbi(EICRA, ISC31); sbi(EICRA, ISC30); } delay50us(1); break; case INT4: if (mode==0) { sbi(EICRB, ISC41); cbi(EICRB, ISC40); } else { sbi(EICRB, ISC41); sbi(EICRB, ISC40); } delay50us(1); break; case INT5: if (mode==0) { sbi(EICRB, ISC51); cbi(EICRB, ISC50); } else { sbi(EICRB, ISC51); sbi(EICRB, ISC50); } delay50us(1); break; case INT6: if (mode==0) { sbi(EICRB, ISC61); cbi(EICRB, ISC60); } else { sbi(EICRB, ISC61); sbi(EICRB, ISC60); } delay50us(1); break; case INT7: if (mode==0) { sbi(EICRB, ISC71); cbi(EICRB, ISC70); } else { sbi(EICRB, ISC71); sbi(EICRB, ISC70); } delay50us(1); break; } }