diff --git a/Libraries/u8glib/u8g_arm.c b/Libraries/u8glib/u8g_arm.c new file mode 100644 --- /dev/null +++ b/Libraries/u8glib/u8g_arm.c @@ -0,0 +1,63 @@ +uint8_t u8g_com_hw_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + + switch(msg) + { + case U8G_COM_MSG_STOP: + break; //do nothing... + + case U8G_COM_MSG_INIT: + i2c_init(); //inits the i2c hardware, gpios and timers + u8g_MicroDelay(); + break; + + case U8G_COM_MSG_ADDRESS: + //the control byte switches the mode on the device and is set here + if (arg_val == 0) + { + control = 0; + } + else + { + control = 0x40; + } + u8g_10MicroDelay(); + break; + + case U8G_COM_MSG_RESET: + //pin 9 is my reset pin + GPIO_WriteBit(GPIOB, GPIO_Pin_9, arg_val); + u8g_10MicroDelay(); + break; + + case U8G_COM_MSG_WRITE_BYTE: + //simple: just write one byte + i2c_out(arg_val); + u8g_MicroDelay(); + break; + + case U8G_COM_MSG_WRITE_SEQ: + case U8G_COM_MSG_WRITE_SEQ_P: + { + register uint8_t *ptr = arg_ptr; + //send the control byte (to switch from command to data mode) + I2C_start(SSD1306_I2C_ADDRESS, I2C_Direction_Transmitter); + I2C_SendData(I2C2, control); + while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + + //now send the rest of data + while( arg_val > 0 ) + { + I2C_SendData(I2C2, *ptr++); + arg_val--; + while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); + } + //done + I2C_stop(); + u8g_MicroDelay(); + } + break; + + } + return 1; +}