Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
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");
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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
}
Ejemplo n.º 7
0
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);
}
Ejemplo n.º 8
0
__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();
}