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); }
void display_draw( bool sleep ) { // Turn on the busy LED: display_busy( true ); // Blank the display if requested: if ( sleep ) { u8g_SleepOn( &u8g ); } // Render the image: u8g_FirstPage( &u8g ); do { // Stop if the draw function doesn't want to continue: if ( ! ui_draw( &u8g ) ) { break; } } while ( u8g_NextPage( &u8g ) ); u8g_Delay( 100 ); // Turn the display back on if blanking was requested: if ( sleep ) { u8g_SleepOff( &u8g ); } // Turn off the busy LED: display_busy( false ); }
uint8_t u8g_com_HAL_DUE_shared_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_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, 1); u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, 1); u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_CS); u8g_SetPIOutput_DUE_hw_spi(u8g, U8G_PI_A0); u8g_Delay(5); spiBegin(); #ifndef SPI_SPEED #define SPI_SPEED SPI_FULL_SPEED // use same SPI speed as SD card #endif spiInit(2); break; case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_A0, arg_val); break; case U8G_COM_MSG_CHIP_SELECT: u8g_SetPILevel_DUE_hw_spi(u8g, U8G_PI_CS, (arg_val ? 0 : 1)); break; case U8G_COM_MSG_RESET: break; case U8G_COM_MSG_WRITE_BYTE: spiSend((uint8_t)arg_val); break; case U8G_COM_MSG_WRITE_SEQ: { uint8_t *ptr = (uint8_t*) arg_ptr; while (arg_val > 0) { spiSend(*ptr++); arg_val--; } } break; case U8G_COM_MSG_WRITE_SEQ_P: { uint8_t *ptr = (uint8_t*) arg_ptr; while (arg_val > 0) { spiSend(*ptr++); arg_val--; } } break; } return 1; }
//************************************************************************************* //************************************************************************************* uint8_t u8g_com_uart_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { switch(msg) { case U8G_COM_MSG_STOP: //STOP THE DEVICE break; case U8G_COM_MSG_INIT: //INIT HARDWARE INTERFACES, TIMERS, GPIOS... u8g_Delay(500); init_UART3(); //init_LCD(); //set 8 bit etc break; case U8G_COM_MSG_ADDRESS: //SWITCH FROM DATA TO COMMAND MODE (arg_val == 0 for command mode) // define cmd (arg_val = 0) or data mode (arg_val = 1) // cmd - if (arg_val == 0) { control = ST7920_CMD; } else { control = ST7920_DATA; } break; case U8G_COM_MSG_RESET: //TOGGLE THE RESET PIN ON THE DISPLAY BY THE VALUE IN arg_val break; case U8G_COM_MSG_WRITE_BYTE: //WRITE BYTE TO DEVICE UART_write_byte(control << 1); //shift RS left, RW == 0 == write UART_write_byte(arg_val); u8g_MicroDelay(); break; case U8G_COM_MSG_WRITE_SEQ: case U8G_COM_MSG_WRITE_SEQ_P: //WRITE A SEQUENCE OF BYTES TO THE DEVICE { register uint8_t *ptr = arg_ptr; //UART_write_byte((1 << 2) | (control << 1)); //0x04 for initialization of byte sequence, shift RS left, RW == 0 == write while( arg_val > 0 ) { UART_write_byte(control << 1); //shift RS left, RW == 0 == write UART_write_byte( *ptr); ptr++; arg_val--; } } break; } return 1; }
uint8_t u8g_dev_a2_micro_printer_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { switch(msg) { case U8G_DEV_MSG_INIT: u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_NONE); break; case U8G_DEV_MSG_STOP: break; case U8G_DEV_MSG_PAGE_NEXT: { uint8_t y, i, j; uint8_t *ptr; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); y = pb->p.page_y0; ptr = (uint8_t*)pb->buf; u8g_WriteByte(u8g, dev, 27); /* ESC */ u8g_WriteByte(u8g, dev, 55 ); /* parameter command */ u8g_WriteByte(u8g, dev, 7); /* Max printing dots,Unit(8dots),Default:7(64 dots) 8*(x+1)*/ u8g_WriteByte(u8g, dev, 160); /* 3-255 Heating time,Unit(10us),Default:80(800us) */ u8g_WriteByte(u8g, dev, 20); /* 0-255 Heating interval,Unit(10us),Default:2(20us)*/ u8g_WriteByte(u8g, dev, 18); /* DC2 */ u8g_WriteByte(u8g, dev, 42 ); /* * */ u8g_WriteByte(u8g, dev, pb->p.page_height ); u8g_WriteByte(u8g, dev, pb->width/8 ); for( i = 0; i < pb->p.page_height; i ++ ) { for( j = 0; j < pb->width/8; j++ ) { u8g_WriteByte(u8g, dev, *ptr); ptr++; } u8g_Delay(LINE_DELAY); y++; } /* set parameters back to their default values */ u8g_WriteByte(u8g, dev, 27); /* ESC */ u8g_WriteByte(u8g, dev, 55 ); /* parameter command */ u8g_WriteByte(u8g, dev, 7); /* Max printing dots,Unit(8dots),Default:7(64 dots) 8*(x+1)*/ u8g_WriteByte(u8g, dev, 80); /* 3-255 Heating time,Unit(10us),Default:80(800us) */ u8g_WriteByte(u8g, dev, 2); /* 0-255 Heating interval,Unit(10us),Default:2(20us)*/ } break; } return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); }
int main(void) { uint8_t i; sys_init(); u8g_setup(); for(;;) { /* why do we need two conversons??? seen notes above */ for( i = 0; i < 100; i++ ) { adc_val1 = sys_adc7(); //adc_val1 = sys_adc7(); adc_val2 = sys_diff_adc_2_3(1); //adc_val2 = sys_diff_adc_2_3(1); sign = 0; val = adc_val2; if ( val >= 512 ) { sign = 1; val = 1024-val ; } sval = val; if ( sign != 0 ) sval = -sval; if ( min > sval ) min = sval; if ( max < sval ) max = sval; } u8g_FirstPage(&u8g); do { draw(); } while ( u8g_NextPage(&u8g) ); u8g_Delay(10); } }
int main(void) { sys_init(); u8g_setup(); for(;;) { u8g_FirstPage(&u8g); do { draw(); } while ( u8g_NextPage(&u8g) ); u8g_Delay(100); } }
uint8_t u8g_com_stm32duino_fsmc_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { if (msgInitCount) { if (msg == U8G_COM_MSG_INIT) msgInitCount--; if (msgInitCount) return -1; } static uint8_t isCommand; switch (msg) { case U8G_COM_MSG_STOP: break; case U8G_COM_MSG_INIT: u8g_SetPIOutput(u8g, U8G_PI_RESET); LCD_IO_Init(u8g->pin_list[U8G_PI_CS], u8g->pin_list[U8G_PI_A0]); u8g_Delay(100); if (arg_ptr != NULL) *((uint32_t *)arg_ptr) = LCD_IO_ReadData(LCD_READ_ID, 3); isCommand = 0; break; case U8G_COM_MSG_ADDRESS: // define cmd (arg_val = 0) or data mode (arg_val = 1) isCommand = arg_val == 0 ? 1 : 0; break; case U8G_COM_MSG_RESET: u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val); break; case U8G_COM_MSG_WRITE_BYTE: if (isCommand) LCD_IO_WriteReg(arg_val); else LCD_IO_WriteData((uint16_t)arg_val); break; case U8G_COM_MSG_WRITE_SEQ: for (uint8_t i = 0; i < arg_val; i += 2) LCD_IO_WriteData(*(uint16_t *)(((uint32_t)arg_ptr) + i)); break; } return 1; }
void main() { uint8_t pos = 0; /* Please uncomment one of the displays below Notes: - "2x", "4x": high speed version, which uses more RAM - "hw_spi": All hardware SPI devices can be used with software SPI also. Access type is defined by u8g_com_hw_spi_fn */ // u8g_InitComFn(&u8g, &u8g_dev_uc1701_dogs102_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1701_dogs102_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1701_mini12864_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1701_mini12864_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_dogm132_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_dogm128_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_dogm128_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_lm6059_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_lm6059_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_lm6063_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_lm6063_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_nhd_c12864_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_nhd_c12864_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_nhd_c12832_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_64128n_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_st7565_64128n_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1601_c128032_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1601_c128032_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1610_dogxl160_bw_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1610_dogxl160_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1610_dogxl160_2x_bw_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_uc1610_dogxl160_2x_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_pcd8544_84x48_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_pcf8812_96x65_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1325_nhd27oled_bw_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1325_nhd27oled_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1325_nhd27oled_2x_bw_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1325_nhd27oled_2x_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1327_96x96_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1327_96x96_2x_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1322_nhd31oled_bw_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1322_nhd31oled_2x_bw_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1322_nhd31oled_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1322_nhd31oled_2x_gr_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x64_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x64_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1309_128x64_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x32_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1306_128x32_2x_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1351_128x128_332_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1351_128x128_4x_332_hw_spi, u8g_com_hw_spi_fn); u8g_InitComFn(&u8g, &u8g_dev_ssd1351_128x128_hicolor_hw_spi, u8g_com_hw_spi_fn); // u8g_InitComFn(&u8g, &u8g_dev_ssd1351_128x128_4x_hicolor_hw_spi, u8g_com_hw_spi_fn); u8g_SetDefaultForegroundColor(&u8g); for(;;) { /* picture loop */ u8g_FirstPage(&u8g); do { draw(pos); } while ( u8g_NextPage(&u8g) ); /* refresh screen after some delay */ u8g_Delay(100); /* update position */ pos++; pos &= 15; } }
/* sequence := { direct_value | escape_sequence } direct_value := 0..254 escape_sequence := value_255 | sequence_end | delay | adr | cs | not_used value_255 := 255 255 sequence_end = 255 254 delay := 255 0..127 adr := 255 0x0e0 .. 0x0ef cs := 255 0x0d0 .. 0x0df not_used := 255 101..254 #define U8G_ESC_DLY(x) 255, ((x) & 0x7f) #define U8G_ESC_CS(x) 255, (0xd0 | ((x)&0x0f)) #define U8G_ESC_ADR(x) 255, (0xe0 | ((x)&0x0f)) #define U8G_ESC_VCC(x) 255, (0xbe | ((x)&0x01)) #define U8G_ESC_END 255, 254 #define U8G_ESC_255 255, 255 #define U8G_ESC_RST(x) 255, (0xc0 | ((x)&0x0f)) */ uint8_t u8g_WriteEscSeqP(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq) { uint8_t is_escape = 0; uint8_t value; for(;;) { value = u8g_pgm_read(esc_seq); if ( is_escape == 0 ) { if ( value != 255 ) { if ( u8g_WriteByte(u8g, dev, value) == 0 ) return 0; } else { is_escape = 1; } } else { if ( value == 255 ) { if ( u8g_WriteByte(u8g, dev, value) == 0 ) return 0; } else if ( value == 254 ) { break; } else if ( value >= 0x0f0 ) { /* not yet used, do nothing */ } else if ( value >= 0xe0 ) { u8g_SetAddress(u8g, dev, value & 0x0f); } else if ( value >= 0xd0 ) { u8g_SetChipSelect(u8g, dev, value & 0x0f); } else if ( value >= 0xc0 ) { u8g_SetResetLow(u8g, dev); value &= 0x0f; value <<= 4; value+=2; u8g_Delay(value); u8g_SetResetHigh(u8g, dev); u8g_Delay(value); } else if ( value >= 0xbe ) { /* not yet implemented */ /* u8g_SetVCC(u8g, dev, value & 0x01); */ } else if ( value <= 127 ) { u8g_Delay(value); } is_escape = 0; } esc_seq++; } return 1; }
uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { uint8_t i, y; switch (msg) { case U8G_DEV_MSG_INIT: { OUT_WRITE(ST7920_CS_PIN, LOW); OUT_WRITE(ST7920_DAT_PIN, LOW); OUT_WRITE(ST7920_CLK_PIN, HIGH); ST7920_CS(); u8g_Delay(120); //initial delay for boot up ST7920_SET_CMD(); ST7920_WRITE_BYTE(0x20); //non-extended mode ST7920_WRITE_BYTE(0x08); //display off, cursor+blink off ST7920_WRITE_BYTE(0x01); //clear DDRAM ram u8g_Delay(15); //delay for DDRAM clear ST7920_WRITE_BYTE(0x24); //extended mode ST7920_WRITE_BYTE(0x26); //extended mode + GDRAM active for (y = 0; y < (LCD_PIXEL_HEIGHT) / 2; y++) { //clear GDRAM ST7920_WRITE_BYTE(0x80 | y); //set y ST7920_WRITE_BYTE(0x80); //set x = 0 ST7920_SET_DAT(); for (i = 0; i < 2 * (LCD_PIXEL_WIDTH) / 8; i++) //2x width clears both segments ST7920_WRITE_BYTE(0); ST7920_SET_CMD(); } ST7920_WRITE_BYTE(0x0C); //display on, cursor+blink off ST7920_NCS(); } break; case U8G_DEV_MSG_STOP: break; case U8G_DEV_MSG_PAGE_NEXT: { uint8_t* ptr; u8g_pb_t* pb = (u8g_pb_t*)(dev->dev_mem); y = pb->p.page_y0; ptr = (uint8_t*)pb->buf; ST7920_CS(); for (i = 0; i < PAGE_HEIGHT; i ++) { ST7920_SET_CMD(); if (y < 32) { ST7920_WRITE_BYTE(0x80 | y); //y ST7920_WRITE_BYTE(0x80); //x=0 } else { ST7920_WRITE_BYTE(0x80 | (y - 32)); //y ST7920_WRITE_BYTE(0x80 | 8); //x=64 } ST7920_SET_DAT(); ST7920_WRITE_BYTES(ptr, (LCD_PIXEL_WIDTH) / 8); //ptr is incremented inside of macro y++; } ST7920_NCS(); } break; } #if PAGE_HEIGHT == 8 return u8g_dev_pb8h1_base_fn(u8g, dev, msg, arg); #elif PAGE_HEIGHT == 16 return u8g_dev_pb16h1_base_fn(u8g, dev, msg, arg); #else return u8g_dev_pb32h1_base_fn(u8g, dev, msg, arg); #endif }