/*---------------------------------------------------------------- 字节数据传送函数 函数原型: unsigned char I2C_RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数。 ------------------------------------------------------------------*/ unsigned char I2C_RcvByte(void) { unsigned char retc; unsigned char BitCnt; retc=0; SDA(1); //置数据线为输入方式 for(BitCnt = 0; BitCnt < 8; BitCnt++) { _Nop(); SCL(0); //置时钟线为低,准备接收数据位 _Nop(); _Nop(); //时钟低电平周期大于4.7us _Nop(); _Nop(); _Nop(); SCL(1); //置时钟线为高使数据线上数据有效 _Nop(); _Nop(); retc = retc << 1; if(Read_SDA()) retc = retc + 1; //读数据位,接收的数据位放入retc中 _Nop(); _Nop(); } SCL(0); _Nop(); _Nop(); return(retc); }
/*---------------------------------------------------------------- 字节数据传送函数 函数原型: void SendByte(unsigned char c); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0 假) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。 ------------------------------------------------------------------*/ void I2C_SendByte(unsigned char c) { unsigned char BitCnt; for(BitCnt = 0; BitCnt < 8; BitCnt++) //要传送的数据长度为8位 { if(( c << BitCnt) & 0x80) //判断发送位 { SDA(1); } else { SDA(0); } _delay_us(10); SCL(1); //置时钟线为高,通知被控器开始接收数据位 _delay_us(15); //保证时钟高电平周期大于4μ SCL(0); } //SDA(1); //8位发送完后释放数据线,准备接收应答位 DDRF &= ~(1 << PF7); // 变为输入 PORTF |= (1 << PF7); _delay_us(30); // without this wait read unstable value. SCL(1); _delay_us(15); if(Read_SDA()) ack = 0; else ack = 1; //判断是否接收到应答信号 SCL(0); SDA(0); // 变为输出 _delay_us(10); }
/*------------------------------------------------ 启动总线 ------------------------------------------------*/ void I2C_Start(void) { SDA(1); //发送起始条件的数据信号 _delay_us(5); SCL(1); _delay_us(10); //起始条件建立时间大于4.7us,延时 SDA(0); //发送起始信号 _delay_us(10); //起始条件锁定时间大于4μ SCL(0); //钳住I2C总线,准备发送或接收数据 _delay_us(10); }
SpecialCaseList *SpecialCaseList::create( const MemoryBuffer *MB, std::string &Error) { OwningPtr<SpecialCaseList> SCL(new SpecialCaseList()); if (!SCL->parse(MB, Error)) return 0; return SCL.take(); }
std::unique_ptr<SpecialCaseList> SpecialCaseList::create(const MemoryBuffer *MB, std::string &Error) { std::unique_ptr<SpecialCaseList> SCL(new SpecialCaseList()); if (SCL->createInternal(MB, Error)) return SCL; return nullptr; }
/*---------------------------------------------------------------- 非应答子函数 原型: void NoAck_I2c(void); ----------------------------------------------------------------*/ void NoAck_I2c(void) { SDA(1); _Nop(); _Nop(); _Nop(); SCL(1); _Nop(); _Nop(); //时钟低电平周期大于4μ _Nop(); _Nop(); _Nop(); SCL(0); //清时钟线,钳住I2C总线以便继续接收 _Nop(); _Nop(); }
std::unique_ptr<SpecialCaseList> SpecialCaseList::create(const std::vector<std::string> &Paths, std::string &Error) { std::unique_ptr<SpecialCaseList> SCL(new SpecialCaseList()); if (SCL->createInternal(Paths, Error)) return SCL; return nullptr; }
std::unique_ptr<SpecialCaseList> SpecialCaseList::create(const MemoryBuffer *MB, std::string &Error) { std::unique_ptr<SpecialCaseList> SCL(new SpecialCaseList()); if (!SCL->parse(MB, Error)) return nullptr; SCL->compile(); return SCL; }
/*------------------------------------------------ 结束总线 ------------------------------------------------*/ void I2C_Stop(void) { SDA(0); //发送结束条件的数据信号 _delay_us(10); //发送结束条件的时钟信号 SCL(1); //结束条件建立时间大于4μ _delay_us(10); SDA(1); //发送I2C总线结束信号 _delay_us(10); }
int CMP3::PlayMP3( const char *pszSong ) { if( m_iIsPlaying ) { // sound system is already initialized SCL( m_Stream ); } else { SOP( FSOUND_OUTPUT_DSOUND ); SBS( 200 ); SDRV( 0 ); INIT( 44100, 1, 0 ); // we need just one channel, multiple mp3s at a time would be, erm, strange... }//AJH not for really cool effects, say walking past cars in a street playing different tunes, might change this later. char song[256]; sprintf( song, "%s/%s", gEngfuncs.pfnGetGameDirectory(), pszSong); //gEngfuncs.Con_Printf("Using fmod.dll version %f\n",VER()); if (SO) { m_Stream = SO( song, FSOUND_NORMAL | FSOUND_LOOP_NORMAL, 0 ,0); //AJH new version fmod uses Open } else if( SOF ) { m_Stream = SOF( song, FSOUND_NORMAL | FSOUND_LOOP_NORMAL, 1 ); //AJH old version fmod OpenFile } if(m_Stream) { SPLAY( 0, m_Stream ); m_iIsPlaying = 1; return 1; } else { m_iIsPlaying = 0; gEngfuncs.Con_Printf("Error: Could not load %s\n",song); return 0; } }
std::unique_ptr<SpecialCaseList> SpecialCaseList::create(const std::vector<std::string> &Paths, std::string &Error) { std::unique_ptr<SpecialCaseList> SCL(new SpecialCaseList()); for (const auto &Path : Paths) { ErrorOr<std::unique_ptr<MemoryBuffer>> FileOrErr = MemoryBuffer::getFile(Path); if (std::error_code EC = FileOrErr.getError()) { Error = (Twine("can't open file '") + Path + "': " + EC.message()).str(); return nullptr; } std::string ParseError; if (!SCL->parse(FileOrErr.get().get(), ParseError)) { Error = (Twine("error parsing file '") + Path + "': " + ParseError).str(); return nullptr; } } SCL->compile(); return SCL; }
int CMP3::StopMP3( void ) { SCL( m_Stream ); m_iIsPlaying = 0; return 1; }
unsigned char read_SCL(void) // Set SCL as input and return current level of line, 0 or 1 { SCL_IN(); return !!SCL(); }