uint8_t u8g_com_arduino_st7920_custom_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch(msg) { case U8G_COM_MSG_INIT: u8g_com_arduino_assign_pin_output_high(u8g); u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); // u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, HIGH); u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, LOW); u8g_com_arduino_init_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK]); u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ break; case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_RESET: if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE ) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); break; case U8G_COM_MSG_CHIP_SELECT: if ( arg_val == 0 ) { /* disable, note: the st7920 has an active high chip select */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); } else { /* enable */ //u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, HIGH); u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); } break; case U8G_COM_MSG_WRITE_BYTE: u8g_com_arduino_st7920_write_byte( u8g->pin_list[U8G_PI_A0_STATE], arg_val); //u8g->pin_list[U8G_PI_A0_STATE] = 2; //u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val); break; case U8G_COM_MSG_WRITE_SEQ: u8g_com_arduino_st7920_write_byte_seq(u8g->pin_list[U8G_PI_A0_STATE], (uint8_t *)arg_ptr, arg_val); break; case U8G_COM_MSG_WRITE_SEQ_P: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_com_arduino_st7920_write_byte(u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr) ); //u8g->pin_list[U8G_PI_A0_STATE] = 2; ptr++; arg_val--; } } break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g->pin_list[U8G_PI_A0_STATE] = arg_val; break; } return 1; }
uint8_t u8g_com_arduino_std_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch(msg) { case U8G_COM_MSG_INIT: u8g_com_arduino_assign_pin_output_high(u8g); u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_MOSI, LOW); break; case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_RESET: if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE ) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); break; case U8G_COM_MSG_CHIP_SELECT: if ( arg_val == 0 ) { /* disable */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); } else { /* enable */ u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); } break; case U8G_COM_MSG_WRITE_BYTE: u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val); break; case U8G_COM_MSG_WRITE_SEQ: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], *ptr++); arg_val--; } } break; case U8G_COM_MSG_WRITE_SEQ_P: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], u8g_pgm_read(ptr)); ptr++; arg_val--; } } break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val); break; } return 1; }
uint8_t u8g_com_arduino_parallel_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch(msg) { case U8G_COM_MSG_INIT: /* setup the RW pin as output and force it to low */ if ( u8g->pin_list[U8G_PI_RW] != U8G_PIN_NONE ) { pinMode(u8g->pin_list[U8G_PI_RW], OUTPUT); u8g_com_arduino_digital_write(u8g, U8G_PI_RW, LOW); } /* set all pins (except RW pin) */ u8g_com_arduino_assign_pin_output_high(u8g); break; case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_CHIP_SELECT: if ( arg_val == 0 ) { /* disable */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH); u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH); } else if ( arg_val == 1 ) { /* enable */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, HIGH); } else if ( arg_val == 2 ) { /* enable */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, HIGH); u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW); } else { /* enable */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS1, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_CS2, LOW); } break; case U8G_COM_MSG_WRITE_BYTE: u8g_com_arduino_parallel_write(u8g, arg_val); break; case U8G_COM_MSG_WRITE_SEQ: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_com_arduino_parallel_write(u8g, *ptr++); arg_val--; } } break; case U8G_COM_MSG_WRITE_SEQ_P: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_com_arduino_parallel_write(u8g, u8g_pgm_read(ptr)); ptr++; arg_val--; } } break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g_com_arduino_digital_write(u8g, U8G_PI_DI, arg_val); break; case U8G_COM_MSG_RESET: if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE ) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); break; } return 1; }
uint8_t u8g_com_arduino_t6963_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch(msg) { case U8G_COM_MSG_INIT: u8g->pin_list[U8G_PI_A0_STATE] = 0; u8g_com_arduino_t6963_init(u8g); /* setup the RW (equal to WR) pin as output and force it to high */ if ( u8g->pin_list[U8G_PI_WR] != U8G_PIN_NONE ) { pinMode(u8g->pin_list[U8G_PI_WR], OUTPUT); u8g_com_arduino_digital_write(u8g, U8G_PI_WR, HIGH); } /* set all pins (except WR pin) */ u8g_com_arduino_assign_pin_output_high(u8g); break; case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_CHIP_SELECT: if ( arg_val == 0 ) { /* disable, active low chip select */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); } else { /* enable */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); } break; case U8G_COM_MSG_WRITE_BYTE: if ( u8g->pin_list[U8G_PI_A0_STATE] == 0 ) { u8g_com_arduino_t6963_write_data(u8g, arg_val); } else { u8g_com_arduino_t6963_write_cmd(u8g, arg_val); } break; case U8G_COM_MSG_WRITE_SEQ: { register uint8_t *ptr = arg_ptr; u8g_com_arduino_t6963_write_cmd(u8g, 0x0b0); /* auto write */ while( arg_val > 0 ) { if ( u8g_com_arduino_t6963_write_auto_data(u8g, *ptr++) == 0 ) break; arg_val--; } u8g_com_arduino_t6963_write_cmd(u8g, 0x0b2); /* auto reset */ } break; case U8G_COM_MSG_WRITE_SEQ_P: { register uint8_t *ptr = arg_ptr; u8g_com_arduino_t6963_write_cmd(u8g, 0x0b0); /* auto write */ while( arg_val > 0 ) { if ( u8g_com_arduino_t6963_write_auto_data(u8g, u8g_pgm_read(ptr)) == 0 ) break; ptr++; arg_val--; } u8g_com_arduino_t6963_write_cmd(u8g, 0x0b2); /* auto reset */ } break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 1) or data mode (arg_val = 0) */ u8g->pin_list[U8G_PI_A0_STATE] = arg_val; //u8g_com_arduino_digital_write(u8g, U8G_PI_DI, arg_val); break; case U8G_COM_MSG_RESET: if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE ) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); break; } return 1; }
uint8_t u8g_com_arduino_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch(msg) { case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_INIT: u8g_com_arduino_assign_pin_output_high(u8g); pinMode(PIN_SCK, OUTPUT); digitalWrite(PIN_SCK, LOW); pinMode(PIN_MOSI, OUTPUT); digitalWrite(PIN_MOSI, LOW); /* pinMode(PIN_MISO, INPUT); */ pinMode(PIN_CS, OUTPUT); /* system chip select for the atmega board */ digitalWrite(PIN_CS, HIGH); /* SPR1 SPR0 0 0 fclk/4 0 1 fclk/16 1 0 fclk/64 1 1 fclk/128 */ SPCR = 0; SPCR = (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(0<<CPOL)|(0<<CPHA); break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g_com_arduino_digital_write(u8g, U8G_PI_A0, arg_val); break; case U8G_COM_MSG_CHIP_SELECT: if ( arg_val == 0 ) { /* disable */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); } else { /* enable */ u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); } break; case U8G_COM_MSG_RESET: if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE ) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); break; case U8G_COM_MSG_WRITE_BYTE: u8g_spi_out(arg_val); break; case U8G_COM_MSG_WRITE_SEQ: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_spi_out(*ptr++); arg_val--; } } break; case U8G_COM_MSG_WRITE_SEQ_P: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_spi_out(u8g_pgm_read(ptr)); ptr++; arg_val--; } } break; } return 1; }
uint8_t u8g_com_arduino_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch(msg) { case U8G_COM_MSG_INIT: u8g_com_arduino_assign_pin_output_high(u8g); u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); DDRB |= _BV(3); /* D0, MOSI */ DDRB |= _BV(5); /* SCK */ DDRB |= _BV(2); /* slave select */ PORTB &= ~_BV(3); /* D0, MOSI = 0 */ PORTB &= ~_BV(5); /* SCK = 0 */ /* SPR1 SPR0 0 0 fclk/4 0 1 fclk/16 1 0 fclk/64 1 1 fclk/128 */ SPCR = 0; /* 20 Dez 2012: set CPOL and CPHA to 1 !!! */ SPCR = (1<<SPE) | (1<<MSTR)|(0<<SPR1)|(0<<SPR0)|(1<<CPOL)|(1<<CPHA); #ifdef U8G_HW_SPI_2X SPSR = (1 << SPI2X); /* double speed, issue 89 */ #endif u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */ break; case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_RESET: if ( u8g->pin_list[U8G_PI_RESET] != U8G_PIN_NONE ) u8g_com_arduino_digital_write(u8g, U8G_PI_RESET, arg_val); break; case U8G_COM_MSG_CHIP_SELECT: if ( arg_val == 0 ) { /* disable, note: the st7920 has an active high chip select */ u8g_com_arduino_digital_write(u8g, U8G_PI_CS, LOW); } else { /* enable */ //u8g_com_arduino_digital_write(u8g, U8G_PI_SCK, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_CS, HIGH); } break; case U8G_COM_MSG_WRITE_BYTE: u8g_com_arduino_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val); // u8g->pin_list[U8G_PI_A0_STATE] = 2; //u8g_arduino_sw_spi_shift_out(u8g->pin_list[U8G_PI_MOSI], u8g->pin_list[U8G_PI_SCK], arg_val); break; case U8G_COM_MSG_WRITE_SEQ: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_com_arduino_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], *ptr++); // u8g->pin_list[U8G_PI_A0_STATE] = 2; arg_val--; } } break; case U8G_COM_MSG_WRITE_SEQ_P: { register uint8_t *ptr = arg_ptr; while( arg_val > 0 ) { u8g_com_arduino_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr) ); // u8g->pin_list[U8G_PI_A0_STATE] = 2; ptr++; arg_val--; } } break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g->pin_list[U8G_PI_A0_STATE] = arg_val; break; } return 1; }