void u8g_com_arduino_parallel_write(u8g_t *u8g, uint8_t val) { u8g_com_arduino_digital_write(u8g, U8G_PI_D0, val&1); val >>= 1; u8g_com_arduino_digital_write(u8g, U8G_PI_D1, val&1); val >>= 1; u8g_com_arduino_digital_write(u8g, U8G_PI_D2, val&1); val >>= 1; u8g_com_arduino_digital_write(u8g, U8G_PI_D3, val&1); val >>= 1; u8g_com_arduino_digital_write(u8g, U8G_PI_D4, val&1); val >>= 1; u8g_com_arduino_digital_write(u8g, U8G_PI_D5, val&1); val >>= 1; u8g_com_arduino_digital_write(u8g, U8G_PI_D6, val&1); val >>= 1; u8g_com_arduino_digital_write(u8g, U8G_PI_D7, val&1); /* EN cycle time must be 1 micro second, digitalWrite is slow enough to do this */ u8g_Delay(1); u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH); u8g_Delay(1); u8g_MicroDelay(); /* delay by 1000ns, reference: ST7920: 140ns, SBN1661: 100ns */ u8g_com_arduino_digital_write(u8g, U8G_PI_EN, LOW); u8g_10MicroDelay(); /* ST7920 commands: 72us */ u8g_Delay(2); }
static void u8g_com_arduino_t6963_write(u8g_t *u8g, uint8_t val) { U8G_ATOMIC_START(); u8g_com_arduino_t6963_write_data_pin( 0, val&1 ); val >>= 1; u8g_com_arduino_t6963_write_data_pin( 1, val&1 ); val >>= 1; u8g_com_arduino_t6963_write_data_pin( 2, val&1 ); val >>= 1; u8g_com_arduino_t6963_write_data_pin( 3, val&1 ); val >>= 1; u8g_com_arduino_t6963_write_data_pin( 4, val&1 ); val >>= 1; u8g_com_arduino_t6963_write_data_pin( 5, val&1 ); val >>= 1; u8g_com_arduino_t6963_write_data_pin( 6, val&1 ); val >>= 1; u8g_com_arduino_t6963_write_data_pin( 7, val&1 ); val >>= 1; U8G_ATOMIC_END(); u8g_com_arduino_digital_write(u8g, U8G_PI_WR, 0); u8g_MicroDelay(); /* 80ns, reference: t6963 datasheet */ u8g_com_arduino_digital_write(u8g, U8G_PI_WR, 1); u8g_MicroDelay(); /* 10ns, reference: t6963 datasheet */ }
static uint8_t u8g_com_arduino_t6963_read(u8g_t *u8g) { uint8_t val = 0; u8g_com_arduino_digital_write(u8g, U8G_PI_RD, 0); u8g_MicroDelay(); /* 150ns, reference: t6963 datasheet */ U8G_ATOMIC_START(); /* only read bits 0, 1 and 3 */ if ( (*u8g_input_data_port[3] & u8g_data_mask[3]) != 0 ) val++; val <<= 1; val <<= 1; if ( (*u8g_input_data_port[1] & u8g_data_mask[1]) != 0 ) val++; val <<= 1; if ( (*u8g_input_data_port[0] & u8g_data_mask[0]) != 0 ) val++; U8G_ATOMIC_END(); u8g_com_arduino_digital_write(u8g, U8G_PI_RD, 1); u8g_MicroDelay(); /* 10ns, reference: t6963 datasheet */ return val; }
void u8g_com_arduino_fast_parallel_write(u8g_t *u8g, uint8_t val) { U8G_ATOMIC_START(); u8g_com_arduino_fast_write_data_pin( 0, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 1, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 2, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 3, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 4, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 5, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 6, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 7, val&1 ); val >>= 1; U8G_ATOMIC_END(); /* EN cycle time must be 1 micro second */ u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH); u8g_MicroDelay(); /* delay by 1000ns, reference: ST7920: 140ns, SBN1661: 100ns */ u8g_com_arduino_digital_write(u8g, U8G_PI_EN, LOW); u8g_10MicroDelay(); /* ST7920 commands: 72us */ u8g_10MicroDelay(); /* ST7920 commands: 72us */ }
static void u8g_com_arduino_port_d_8bit_wr(u8g_t *u8g, uint8_t val) { PORTD = val; /* WR cycle time must be 1 micro second, digitalWrite is slow enough to do this */ u8g_com_arduino_digital_write(u8g, U8G_PI_EN, LOW); u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH); }
static uint8_t u8g_com_arduino_t6963_write_auto_data(u8g_t *u8g, uint8_t val) { u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 1); if ( u8g_com_arduino_t6963_until_3_ok(u8g) == 0 ) return 0; u8g_com_arduino_digital_write(u8g, U8G_PI_A0, 0); u8g_com_arduino_t6963_write(u8g, val); return 1; }
void u8g_com_arduino_fast_parallel_write(u8g_t *u8g, uint8_t val) { u8g_com_arduino_fast_write_data_pin( 0, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 1, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 2, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 3, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 4, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 5, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 6, val&1 ); val >>= 1; u8g_com_arduino_fast_write_data_pin( 7, val&1 ); val >>= 1; /* EN cycle time must be 1 micro second, digitalWrite is slow enough to do this */ u8g_com_arduino_digital_write(u8g, U8G_PI_EN, HIGH); u8g_com_arduino_digital_write(u8g, U8G_PI_EN, LOW); }
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; }