void noinline hd44780_output_4bit(uint8_t rs, uint8_t nibble, uint8_t en) { /* switch to write operation and set rs */ #ifdef HAVE_HD44780_RW PIN_CLEAR(HD44780_RW); #endif PIN_CLEAR(HD44780_RS); if (rs) PIN_SET(HD44780_RS); /* compute data bits */ PIN_CLEAR(HD44780_D4); PIN_CLEAR(HD44780_D5); PIN_CLEAR(HD44780_D6); PIN_CLEAR(HD44780_D7); if (nibble & _BV(0)) PIN_SET(HD44780_D4); if (nibble & _BV(1)) PIN_SET(HD44780_D5); if (nibble & _BV(2)) PIN_SET(HD44780_D6); if (nibble & _BV(3)) PIN_SET(HD44780_D7); /* set bits in mask, and delete bits not in mask */ DATA_OUTPUT(); /* toggle EN */ hd44780_clock_write(en); }
void noinline hd44780_hw_init(void) { /* init io pins */ CTRL_OUTPUT(); #ifdef HAVE_LCDON PIN_SET(LCDON); #endif PIN_CLEAR(HD44780_RS); #ifndef HD44780_MULTIENSUPPORT PIN_CLEAR(HD44780_EN1); #endif #ifdef HD44780_MULTIENSUPPORT PIN_CLEAR(HD44780_EN1); PIN_CLEAR(HD44780_EN2); #endif #ifdef HAVE_HD44780_RW PIN_CLEAR(HD44780_RW); #endif PIN_CLEAR(HD44780_D4); PIN_CLEAR(HD44780_D5); PIN_CLEAR(HD44780_D6); PIN_CLEAR(HD44780_D7); DATA_OUTPUT(); #ifdef HD44780_BACKLIGHT_SUPPORT PIN_CLEAR(HD44780_BL); #endif }
void hd44780_init(void) { /* init io pins */ CTRL_OUTPUT(); PIN_CLEAR(HD44780_RS); PIN_CLEAR(HD44780_EN); #ifdef HAVE_HD44780_RW PIN_CLEAR(HD44780_RW); #endif PIN_CLEAR(HD44780_D4); PIN_CLEAR(HD44780_D5); PIN_CLEAR(HD44780_D6); PIN_CLEAR(HD44780_D7); DATA_OUTPUT(); _delay_ms(40); PIN_SET(HD44780_D4); PIN_SET(HD44780_D5); clock_write(); _delay_ms(4); clock_write(); _delay_ms(1); clock_write(); /* init done */ _delay_ms(1); PIN_CLEAR(HD44780_D4); clock_write(); _delay_ms(1); /* configure for 4 bit, 2 lines, 5x9 font (datasheet, page 24) */ output_byte(0, CMD_FUNCTIONSET(0, 1, 0)); /* turn on display, cursor and blinking */ hd44780_config(0,0); /* clear display */ hd44780_clear(); /* set shift and increment */ output_byte(0, CMD_ENTRY_MODE(1, 0)); /* set ddram address */ output_byte(0, CMD_SETDRAMADR(0)); /* open file descriptor */ lcd = fdevopen(hd44780_put, NULL); /* set current virtual postion */ current_pos = 0; }
void noinline hd44780_hw_init(void) { HD44780DEBUG("starte HW init\n"); // set data direction to output & clear pins CTRL_OUTPUT(); DATA_OUTPUT(); PIN_CLEAR(HD44780_2WIRE_CLK); PIN_CLEAR(HD44780_2WIRE_D); _delay_ms(50); // Delay for power up time clear_shift_register(); HD44780DEBUG("HW init finished\n"); }
uint8_t noinline input_nibble(uint8_t rs, uint8_t en) { /* configure data pins as input */ DATA_INPUT(); /* set write bit */ PIN_SET(HD44780_RW); /* set rs, if given */ PIN_CLEAR(HD44780_RS); if (rs) PIN_SET(HD44780_RS); uint8_t data = clock_read(en); /* reconfigure data pins as output */ DATA_OUTPUT(); /* delete RW bit */ PIN_CLEAR(HD44780_RW); return data; }
void noinline hd44780_hw_init(void) { /* init io pins */ CTRL_OUTPUT(); PIN_CLEAR(HD44780_RS); #ifndef HD44780_MULTIEN_SUPPORT PIN_CLEAR(HD44780_EN1); #endif #ifdef HD44780_MULTIEN_SUPPORT PIN_CLEAR(HD44780_EN1); PIN_CLEAR(HD44780_EN2); #endif #ifdef HAVE_HD44780_RW PIN_CLEAR(HD44780_RW); #endif PIN_CLEAR(HD44780_D4); PIN_CLEAR(HD44780_D5); PIN_CLEAR(HD44780_D6); PIN_CLEAR(HD44780_D7); DATA_OUTPUT(); #ifdef HD44780_BACKLIGHT_SUPPORT #ifdef HD44780_BACKLIGHT_INV if (hd44780_backlight_state) PIN_CLEAR(HD44780_BL); else PIN_SET(HD44780_BL); #else if (hd44780_backlight_state) PIN_SET(HD44780_BL); else PIN_CLEAR(HD44780_BL); #endif #endif }
void noinline hd44780_hw_init(void) { uint8_t data = 0; CTRL_OUTPUT(); PIN_CLEAR(HD44780_SER_CLK); PIN_CLEAR(HD44780_SER_EN1); PIN_CLEAR(HD44780_SER_D); DATA_OUTPUT(); #ifdef HD44780_BACKLIGHT_SUPPORT #ifdef HD44780_BACKLIGHT_INV if (hd44780_backlight_state == 0) data |= (1 << LCD_LIGHT_PIN); #else if (hd44780_backlight_state) data |= (1 << LCD_LIGHT_PIN); #endif #endif shift_data_out(data); }
__interrupt void USI_TXRX (void) { if (START_ISSUED) { ChangeState(HANDLE_START_BIT); } switch(state) { case HANDLE_START_BIT: ChangeState(HANDLE_ADDRESS_AND_READ_WRITE); DATA_INPUT(); set_bits_remaining(8); CLEAR_START(); break; case HANDLE_ADDRESS_AND_READ_WRITE: if ((DATA_BUFFER & ADDRESS_MASK) == current_address) { read = DATA_BUFFER & READ_BIT; ChangeState(HANDLE_ADDRESS_ACK); DATA_OUTPUT(); DATA_BUFFER = DATA_ACK; set_bits_remaining(1); } else // address did not match { DATA_INPUT(); // TODO: should we just ignore bad addresses? //DATA_BUFFER = DATA_NACK; // Send NAck ChangeState(IDLE); } break; case HANDLE_ADDRESS_ACK: if (read) { ChangeState(HANDLE_DATA_READ); DATA_OUTPUT(); if (reg == I2C_ADDR_ADDRESS) { DATA_BUFFER = current_address; } else if (reg == I2C_ADDR_TYPE) { DATA_BUFFER = device_type; } else if (reg == I2C_ADDR_NUM_READ_ENDPOINTS) { DATA_BUFFER = GetNumReadEndpoints(); } else if (reg == I2C_ADDR_START_READ_ENDPOINTS) { DATA_BUFFER = READ_ENDPOINTS_START; } else if (reg == I2C_ADDR_NUM_WRITE_ENDPOINTS) { DATA_BUFFER = GetNumWriteEndpoints(); } else if (reg == I2C_ADDR_START_WRITE_ENDPOINTS) { DATA_BUFFER = WRITE_ENDPOINTS_START; } else if (reg >= READ_ENDPOINTS_START && reg < READ_ENDPOINTS_START + GetNumReadEndpoints()) { DATA_BUFFER = GetReadEndpoint(reg - READ_ENDPOINTS_START); } else { // todo: this should nack as well I think - KSH DATA_BUFFER = 0x00; } set_bits_remaining(8); } else { ChangeState(HANDLE_REGISTER); DATA_INPUT(); set_bits_remaining(8); } break; case HANDLE_REGISTER: reg = DATA_BUFFER; ChangeState(HANDLE_REGISTER_ACK); DATA_OUTPUT(); DATA_BUFFER = DATA_ACK; set_bits_remaining(1); break; case HANDLE_REGISTER_ACK: ChangeState(HANDLE_DATA_WRITTEN); DATA_INPUT(); set_bits_remaining(8); break; case HANDLE_DATA_READ: ChangeState(HANDLE_DATA_ACK); DATA_OUTPUT(); DATA_BUFFER = DATA_ACK; set_bits_remaining(1); break; case HANDLE_DATA_WRITTEN: ChangeState(HANDLE_DATA_ACK); DATA_OUTPUT(); if (reg == I2C_ADDR_ADDRESS) { // todo: find a way to store this in NVRAM current_address = DATA_BUFFER; } else if (reg >= WRITE_ENDPOINTS_START && reg < WRITE_ENDPOINTS_START + GetNumWriteEndpoints()) { SetWriteEndpoint(reg - WRITE_ENDPOINTS_START, DATA_BUFFER); } else { DATA_BUFFER = DATA_NACK; set_bits_remaining(1); break; } DATA_BUFFER = DATA_ACK; set_bits_remaining(1); break; case HANDLE_DATA_ACK: DATA_INPUT(); ChangeState(IDLE); break; default: break; } CLEAR_INT(); }