void set_led(unsigned char sel_pin, unsigned char led_pin) { SET_PIN_OUTPUT(LED_BUTTON_PORT, led_pin); SET_PIN_LOW(LED_BUTTON_PORT, led_pin); SET_PIN_OUTPUT(LED_BUTTON_SEL_PORT, sel_pin); if (LED_STATUS(sel_pin * led_pin)) { SET_PIN_HIGH(LED_BUTTON_SEL_PORT, sel_pin); } else { SET_PIN_LOW(LED_BUTTON_SEL_PORT, sel_pin); } }
inline void MULTIPLEX_Setup() { //BIT_HIGH(MULTIPLEX_1_PORT, MULTIPLEX_1_PIN); //BIT_HIGH(MULTIPLEX_2_PORT, MULTIPLEX_2_PIN); //BIT_HIGH(MULTIPLEX_3_PORT, MULTIPLEX_3_PIN); SET_PIN_OUTPUT(MULTIPLEX_1_DDR, MULTIPLEX_1_PIN); SET_PIN_OUTPUT(MULTIPLEX_2_DDR, MULTIPLEX_2_PIN); SET_PIN_OUTPUT(MULTIPLEX_3_DDR, MULTIPLEX_3_PIN); // Timer 0 running multiplexing TCCR0 |= (1 << CS01) | (1 << CS00); // Set prescaler and start the timer TIMSK |= (1 << TOIE0); // Set interrupt on overflow }
////////////////////////////////////////////////////////////////////// // Returns 0 for no errors = the ACK bit from the slave unsigned short I2C_Wr(unsigned short data) { unsigned short ret=0,i; // grab the data for(i = 0; i < 8; i++) { I2C_SCL_0; // Clock low if (data & 0x80) I2C_SDA_1; else I2C_SDA_0; // Data output data <<= 1; // Next data bit. I2C_delay(); // low T/2. I2C_SCL_1; // Clock released to high. I2C_delay(); // high T/2. } // get ACK or NACK I2C_SCL_0; I2C_SDA_1; // Release the data line SET_PIN_INPUT(I2C_SDA_PIN); I2C_delay(); // low T/2. I2C_SCL_1; // Sample the ACK ret = I2C_SDA_IN; I2C_delay(); // high T/2. I2C_SCL_0; // Return clock to safe state SET_PIN_OUTPUT(I2C_SDA_PIN); return ret; }
void I2C_Init(unsigned long speed) { // must do following in one go else port takes time to do it so R-M-F stops it. SET_PIN_OUTPUT(I2C_SDA_PIN|I2C_SCL_PIN); I2C_SDA_1; // release data (high). I2C_SCL_1; // release clock (high). }