2022-12-01 08:27:53 -05:00
|
|
|
/**
|
|
|
|
* --------------------------------------------------------------------------------------+
|
2020-10-13 04:45:09 -04:00
|
|
|
* @desc SSD1306 OLED Driver
|
2022-12-01 08:27:53 -05:00
|
|
|
* --------------------------------------------------------------------------------------+
|
2020-10-13 04:45:09 -04:00
|
|
|
* Copyright (C) 2020 Marian Hrinko.
|
|
|
|
* Written by Marian Hrinko (mato.hrinko@gmail.com)
|
|
|
|
*
|
|
|
|
* @author Marian Hrinko
|
|
|
|
* @datum 06.10.2020
|
2022-11-24 16:50:38 -05:00
|
|
|
* @update 24.11.2022
|
2021-04-29 02:47:08 -04:00
|
|
|
* @file ssd1306.c
|
2022-11-21 08:31:26 -05:00
|
|
|
* @version 3.0
|
2022-11-24 16:50:38 -05:00
|
|
|
* @tested AVR Atmega328p
|
2020-10-13 04:48:15 -04:00
|
|
|
*
|
|
|
|
* @depend font.h, twi.h
|
2022-12-01 08:27:53 -05:00
|
|
|
* --------------------------------------------------------------------------------------+
|
2021-07-19 09:06:29 -04:00
|
|
|
* @descr Version 1.0 -> applicable for 1 display
|
2021-07-20 04:59:08 -04:00
|
|
|
* Version 2.0 -> rebuild to 'cacheMemLcd' array
|
2022-11-21 08:31:26 -05:00
|
|
|
* Version 3.0 -> remove 'cacheMemLcd' approach
|
2022-12-01 08:27:53 -05:00
|
|
|
* --------------------------------------------------------------------------------------+
|
2021-04-29 03:02:31 -04:00
|
|
|
* @usage Basic Setup for OLED Display
|
2020-10-13 04:45:09 -04:00
|
|
|
*/
|
2022-12-01 08:27:53 -05:00
|
|
|
|
2022-12-01 08:38:26 -05:00
|
|
|
// @includes
|
2020-10-13 04:45:09 -04:00
|
|
|
#include "ssd1306.h"
|
|
|
|
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set MUX Ratio |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xA8, 0x3F |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set Display Offset |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xD3, 0x00 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set Display Start Line |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0x40 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set Segment Remap |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xA0 / 0xA1 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set COM Output Scan |
|
|
|
|
// | Direction |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xC0 / 0xC8 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set COM Pins hardware |
|
|
|
|
// | configuration |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xDA, 0x02 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set Contrast Control |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0x81, 0x7F |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Disable Entire Display On |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xA4 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set Normal Display |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xA6 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Set Osc Frequency |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xD5, 0x80 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Enable charge pump |
|
|
|
|
// | regulator |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0x8D, 0x14 |
|
|
|
|
// +---------------------------+
|
|
|
|
// |
|
|
|
|
// +---------------------------+
|
|
|
|
// | Display On |
|
|
|
|
// +---------------------------+
|
|
|
|
// | 0xAF |
|
|
|
|
// +---------------------------+
|
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
// @array Init command
|
2020-10-13 04:45:09 -04:00
|
|
|
const uint8_t INIT_SSD1306[] PROGMEM = {
|
2022-11-21 08:31:26 -05:00
|
|
|
18, // number of initializers
|
|
|
|
0, SSD1306_DISPLAY_OFF, // 0xAE = Set Display OFF
|
2022-11-25 03:05:32 -05:00
|
|
|
1, SSD1306_SET_MUX_RATIO, 0x3F, // 0xA8 - 64MUX
|
2022-11-21 08:31:26 -05:00
|
|
|
1, SSD1306_MEMORY_ADDR_MODE, 0x00, // 0x20 = Set Memory Addressing Mode
|
|
|
|
// 0x00 - Horizontal Addressing Mode
|
|
|
|
// 0x01 - Vertical Addressing Mode
|
|
|
|
// 0x02 - Page Addressing Mode (RESET)
|
2022-12-01 08:27:53 -05:00
|
|
|
2, SSD1306_SET_COLUMN_ADDR, START_COL_ADDR, END_COL_ADDR, // 0x21 = Set Column Address, 0 - 127
|
2022-11-25 03:05:32 -05:00
|
|
|
2, SSD1306_SET_PAGE_ADDR, START_PAGE_ADDR, END_PAGE_ADDR, // 0x22 = Set Page Address, 0 - 7
|
2022-11-21 08:31:26 -05:00
|
|
|
0, SSD1306_SET_START_LINE, // 0x40
|
|
|
|
1, SSD1306_DISPLAY_OFFSET, 0x00, // 0xD3
|
|
|
|
0, SSD1306_SEG_REMAP_OP, // 0xA0 / remap 0xA1
|
|
|
|
0, SSD1306_COM_SCAN_DIR_OP, // 0xC0 / remap 0xC8
|
2022-11-25 03:05:32 -05:00
|
|
|
1, SSD1306_COM_PIN_CONF, 0x12, // 0xDA, 0x12 - Disable COM Left/Right remap, Alternative COM pin configuration
|
|
|
|
1, SSD1306_SET_CONTRAST, 0x7F, // 0x81, 0x7F - reset value (max 0xFF)
|
2022-11-21 08:31:26 -05:00
|
|
|
0, SSD1306_DIS_ENT_DISP_ON, // 0xA4
|
|
|
|
0, SSD1306_DIS_NORMAL, // 0xA6
|
2022-11-25 03:05:32 -05:00
|
|
|
1, SSD1306_SET_OSC_FREQ, 0x80, // 0xD5, 0x80 => D=1; DCLK = Fosc / D <=> DCLK = Fosc
|
|
|
|
1, SSD1306_SET_PRECHARGE, 0xc2, // 0xD9, higher value less blinking
|
|
|
|
// 0xC2, 1st phase = 2 DCLK, 2nd phase = 13 DCLK
|
2022-11-21 08:31:26 -05:00
|
|
|
1, SSD1306_VCOM_DESELECT, 0x20, // Set V COMH Deselect, reset value 0x22 = 0,77xUcc
|
2022-11-25 03:05:32 -05:00
|
|
|
1, SSD1306_SET_CHAR_REG, 0x14, // 0x8D, Enable charge pump during display on
|
2022-11-21 08:31:26 -05:00
|
|
|
0, SSD1306_DISPLAY_ON // 0xAF = Set Display ON
|
2020-10-13 04:45:09 -04:00
|
|
|
};
|
|
|
|
|
2022-12-01 08:38:26 -05:00
|
|
|
uint8_t _indexCol = START_COL_ADDR; // @var global - cache index column
|
|
|
|
uint8_t _indexPage = START_PAGE_ADDR; // @var global - cache index page
|
2021-07-19 09:06:29 -04:00
|
|
|
|
2020-10-13 04:45:09 -04:00
|
|
|
/**
|
|
|
|
* @desc SSD1306 Init
|
|
|
|
*
|
2022-11-24 16:50:38 -05:00
|
|
|
* @param void
|
2020-10-13 04:45:09 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-13 04:45:09 -04:00
|
|
|
*/
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t SSD1306_Init (void)
|
2022-12-01 08:27:53 -05:00
|
|
|
{
|
2022-12-01 08:38:26 -05:00
|
|
|
const uint8_t * commands = INIT_SSD1306; // variables
|
|
|
|
uint8_t no_of_commands = pgm_read_byte (commands++); // number of commands
|
2022-11-21 08:31:26 -05:00
|
|
|
uint8_t no_of_arguments; // number od arguments
|
|
|
|
uint8_t command; // command
|
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
|
|
|
|
|
|
// TWI INIT
|
|
|
|
// -------------------------------------------------------------------------------------
|
2021-07-19 09:06:29 -04:00
|
|
|
TWI_Init ();
|
2020-10-13 04:45:09 -04:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI Start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
2022-11-24 16:50:38 -05:00
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
2022-11-21 08:31:26 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// MAIN LOOP
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
while (no_of_commands) { // commands loop
|
|
|
|
no_of_arguments = pgm_read_byte (commands++); // number of arguments
|
|
|
|
command = pgm_read_byte (commands++); // command
|
|
|
|
// SEND COMMAND
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_Command (command); // send command
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// SEND ARGUMENTS
|
|
|
|
// -----------------------------------------------------------------------------------
|
2020-10-13 04:45:09 -04:00
|
|
|
while (no_of_arguments--) {
|
2022-11-21 08:31:26 -05:00
|
|
|
status = SSD1306_Send_Command (pgm_read_byte(commands++)); // send argument
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
no_of_commands--; // next command
|
|
|
|
}
|
|
|
|
// TWI STOP
|
|
|
|
// -------------------------------------------------------------------------------------
|
2021-07-19 09:06:29 -04:00
|
|
|
TWI_Stop ();
|
2020-10-13 04:45:09 -04:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @desc SSD1306 Send Start and SLAW request
|
|
|
|
*
|
2022-12-01 08:38:26 -05:00
|
|
|
* @param uint8_t address
|
2020-10-13 04:45:09 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-13 04:45:09 -04:00
|
|
|
*/
|
2021-07-19 09:06:29 -04:00
|
|
|
uint8_t SSD1306_Send_StartAndSLAW (uint8_t address)
|
2020-10-13 04:45:09 -04:00
|
|
|
{
|
2022-11-21 08:31:26 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
2020-10-13 04:45:09 -04:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI START
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Start (); // start
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Send_SLAW (address); // start & SLAW
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
2022-12-01 08:27:53 -05:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @desc SSD1306 Send command
|
|
|
|
*
|
2021-07-20 04:59:08 -04:00
|
|
|
* @param uint8_t command
|
2020-10-13 04:45:09 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-13 04:45:09 -04:00
|
|
|
*/
|
2021-07-19 09:06:29 -04:00
|
|
|
uint8_t SSD1306_Send_Command (uint8_t command)
|
2020-10-13 04:45:09 -04:00
|
|
|
{
|
2022-11-21 08:31:26 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
2020-10-13 04:45:09 -04:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI send control byte
|
2022-12-01 08:27:53 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
2022-11-21 08:31:26 -05:00
|
|
|
status = TWI_MT_Send_Data (SSD1306_COMMAND); // send control byte
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI send command
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Send_Data (command); // send command
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
|
|
|
|
2020-10-27 08:05:53 -04:00
|
|
|
/**
|
2021-07-20 04:59:08 -04:00
|
|
|
* @desc SSD1306 Normal colors
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2022-11-24 16:50:38 -05:00
|
|
|
* @param void
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-27 08:05:53 -04:00
|
|
|
*/
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t SSD1306_NormalScreen (void)
|
2020-10-27 08:05:53 -04:00
|
|
|
{
|
2022-11-21 08:31:26 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
2020-10-27 08:05:53 -04:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
2022-11-24 16:50:38 -05:00
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
2022-11-21 08:31:26 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI send command
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_Command (SSD1306_DIS_NORMAL); // command 0xA6
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2022-12-01 08:38:26 -05:00
|
|
|
* @desc SSD1306 Inverse screen colors
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2022-11-24 16:50:38 -05:00
|
|
|
* @param void
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-27 08:05:53 -04:00
|
|
|
*/
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t SSD1306_InverseScreen (void)
|
2020-10-27 08:05:53 -04:00
|
|
|
{
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
2020-10-27 08:05:53 -04:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
2022-11-24 16:50:38 -05:00
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
2022-11-21 08:31:26 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI send command
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_Command (SSD1306_DIS_INVERSE); // command 0xA7
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2022-11-24 16:50:38 -05:00
|
|
|
* @desc SSD1306 Clear screen
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2022-11-24 16:50:38 -05:00
|
|
|
* @param void
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-27 08:05:53 -04:00
|
|
|
*/
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t SSD1306_ClearScreen (void)
|
2020-10-27 08:05:53 -04:00
|
|
|
{
|
2022-11-21 08:31:26 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
|
|
uint16_t i = 0; // counter
|
2022-11-24 16:50:38 -05:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
2022-11-24 16:50:38 -05:00
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
2022-11-21 08:31:26 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI control byte data stream
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Send_Data (SSD1306_DATA_STREAM); // send data 0x40
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
2022-11-24 16:50:38 -05:00
|
|
|
// send clear byte to memory lcd
|
2022-11-21 08:31:26 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
2021-07-19 09:06:29 -04:00
|
|
|
while (i < CACHE_SIZE_MEM) {
|
2022-11-24 16:50:38 -05:00
|
|
|
status = TWI_MT_Send_Data (CLEAR_COLOR); // send data 0x00
|
2022-11-21 08:31:26 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2022-11-24 16:50:38 -05:00
|
|
|
i++; // update counter
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2022-11-21 08:31:26 -05:00
|
|
|
// TWI stop
|
|
|
|
// -------------------------------------------------------------------------------------
|
2021-07-19 09:06:29 -04:00
|
|
|
TWI_Stop ();
|
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
|
|
|
|
2020-10-13 04:45:09 -04:00
|
|
|
/**
|
2021-07-20 04:59:08 -04:00
|
|
|
* @desc SSD1306 Set position
|
2020-10-13 04:45:09 -04:00
|
|
|
*
|
2022-12-01 08:38:26 -05:00
|
|
|
* @param uint8_t x / column -> 0 ... 127
|
|
|
|
* @param uint8_t y / page -> 0 ... 7
|
2020-10-13 04:45:09 -04:00
|
|
|
*
|
2021-07-20 04:59:08 -04:00
|
|
|
* @return void
|
2020-10-13 04:45:09 -04:00
|
|
|
*/
|
2022-12-01 08:27:53 -05:00
|
|
|
uint8_t SSD1306_SetPosition (uint8_t x, uint8_t y)
|
|
|
|
{
|
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
|
|
|
|
|
|
// Set Window
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_SetWindow (x, END_COL_ADDR, y, END_PAGE_ADDR);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
return SSD1306_SUCCESS; // success
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @desc SSD1306 Set window
|
|
|
|
*
|
|
|
|
* @param uint8_t x1 / column -> 0 ... 127
|
|
|
|
* @param uint8_t x2 / column -> 0 ... 127
|
|
|
|
* @param uint8_t y1 / page -> 0 ... 7
|
|
|
|
* @param uint8_t y2 / page -> 0 ... 7
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
uint8_t SSD1306_SetWindow (uint8_t x1, uint8_t x2, uint8_t y1, uint8_t y2)
|
2020-10-13 04:45:09 -04:00
|
|
|
{
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
|
|
|
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// COLUMN
|
2022-12-01 08:27:53 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
2022-11-24 16:50:38 -05:00
|
|
|
status = SSD1306_Send_Command (SSD1306_SET_COLUMN_ADDR); // 0x21
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// start COLUMN
|
2022-12-01 08:27:53 -05:00
|
|
|
status = SSD1306_Send_Command (x1);
|
2022-11-24 16:50:38 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// end COLUMN
|
2022-12-01 08:27:53 -05:00
|
|
|
status = SSD1306_Send_Command (x2);
|
2022-11-24 16:50:38 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// update column index
|
|
|
|
_indexCol = x;
|
|
|
|
|
|
|
|
// PAGE
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_Command (SSD1306_SET_PAGE_ADDR); // 0x22
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// start PAGE
|
2022-12-01 08:27:53 -05:00
|
|
|
status = SSD1306_Send_Command (y1);
|
2022-11-24 16:50:38 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// end PAGE
|
2022-12-01 08:27:53 -05:00
|
|
|
status = SSD1306_Send_Command (y2);
|
2022-11-24 16:50:38 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// update column index
|
|
|
|
_indexPage = y;
|
|
|
|
|
|
|
|
// TWI stop
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
TWI_Stop ();
|
|
|
|
|
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
|
|
|
|
2020-10-27 08:05:53 -04:00
|
|
|
/**
|
2022-11-24 16:50:38 -05:00
|
|
|
* @desc SSD1306 Update text poisition - this ensure that character will not be divided
|
|
|
|
* at the end of row, the whole character will be depicted on the new row
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2021-07-20 04:59:08 -04:00
|
|
|
* @param void
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-27 08:05:53 -04:00
|
|
|
*/
|
2022-12-01 08:27:53 -05:00
|
|
|
uint8_t SSD1306_UpdatePosition (void)
|
2020-10-27 08:05:53 -04:00
|
|
|
{
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
|
|
uint8_t x = _indexCol + CHARS_COLS_LENGTH + 1; // check end col position
|
|
|
|
|
|
|
|
// check position
|
|
|
|
// -------------------------------------------------------------------------------------
|
2022-12-01 08:27:53 -05:00
|
|
|
if (x > END_COL_ADDR) {
|
2022-11-24 16:50:38 -05:00
|
|
|
// last page not reached
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
if (_indexPage < END_PAGE_ADDR) {
|
|
|
|
_indexCol = 0; // update column
|
|
|
|
_indexPage = _indexPage + 1; // update page
|
|
|
|
status = SSD1306_SetPosition (_indexCol, _indexPage); // update position
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// last page reached
|
|
|
|
// -----------------------------------------------------------------------------------
|
|
|
|
if (_indexPage >= END_PAGE_ADDR) {
|
2022-12-01 08:27:53 -05:00
|
|
|
return SSD1306_ERROR; // return out of range
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
2022-12-01 08:27:53 -05:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2021-07-21 01:19:58 -04:00
|
|
|
* @desc SSD1306 Draw character
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @param char character
|
2020-10-27 08:05:53 -04:00
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @return uint8_t
|
2020-10-27 08:05:53 -04:00
|
|
|
*/
|
2022-11-21 08:31:26 -05:00
|
|
|
uint8_t SSD1306_DrawChar (char ch)
|
2020-10-27 08:05:53 -04:00
|
|
|
{
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
|
|
uint16_t i = 0; // counter
|
2021-07-19 09:06:29 -04:00
|
|
|
|
|
|
|
// update text position
|
2022-11-24 16:50:38 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_UpdatePosition();
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2022-11-24 16:50:38 -05:00
|
|
|
// TWI control byte data stream
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Send_Data (SSD1306_DATA_STREAM); // send data 0x40
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2020-10-27 08:05:53 -04:00
|
|
|
}
|
2022-11-24 16:50:38 -05:00
|
|
|
// send character byte to memory lcd
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
while (i < CHARS_COLS_LENGTH) {
|
|
|
|
status = TWI_MT_Send_Data (pgm_read_byte (&FONTS[ch-32][i])); // send data col
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
i++; // update counter
|
|
|
|
}
|
|
|
|
// send empty column to memory lcd
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Send_Data (CLEAR_COLOR); // ONE empty column
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
_indexCol = _indexCol + CHARS_COLS_LENGTH + 1; // update global col
|
|
|
|
|
|
|
|
// TWI stop
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
TWI_Stop ();
|
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @desc SSD1306 Draw String
|
|
|
|
*
|
2021-07-19 09:06:29 -04:00
|
|
|
* @param char * string
|
2020-10-13 04:45:09 -04:00
|
|
|
*
|
2022-11-24 16:50:38 -05:00
|
|
|
* @return uint8_t
|
2020-10-13 04:45:09 -04:00
|
|
|
*/
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t SSD1306_DrawString (char *str)
|
2020-10-13 04:45:09 -04:00
|
|
|
{
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t i = 0; // char counter
|
|
|
|
|
|
|
|
// send characters of string
|
2022-12-01 08:27:53 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
2022-11-24 16:50:38 -05:00
|
|
|
while (str[i] != '\0') {
|
|
|
|
SSD1306_DrawChar (str[i++]); // send char
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
2022-11-24 16:50:38 -05:00
|
|
|
|
|
|
|
return SSD1306_SUCCESS; // success
|
2020-10-13 04:45:09 -04:00
|
|
|
}
|
2020-10-27 08:05:53 -04:00
|
|
|
|
2021-07-19 09:06:29 -04:00
|
|
|
/**
|
|
|
|
* @desc Draw pixel
|
|
|
|
*
|
2021-07-20 04:59:08 -04:00
|
|
|
* @param uint8_t x -> 0 ... MAX_X
|
|
|
|
* @param uint8_t y -> 0 ... MAX_Y
|
2021-07-19 09:06:29 -04:00
|
|
|
*
|
2021-07-20 04:59:08 -04:00
|
|
|
* @return uint8_t
|
2021-07-19 09:06:29 -04:00
|
|
|
*/
|
2021-07-20 04:59:08 -04:00
|
|
|
uint8_t SSD1306_DrawPixel (uint8_t x, uint8_t y)
|
2021-07-19 09:06:29 -04:00
|
|
|
{
|
2022-12-01 08:27:53 -05:00
|
|
|
uint8_t page = y >> 3; // page
|
|
|
|
uint8_t pixel = 1 << (y - (page << 3)); // pixel
|
2022-11-24 16:50:38 -05:00
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
2022-12-01 08:27:53 -05:00
|
|
|
|
2022-11-21 08:31:26 -05:00
|
|
|
if ((x > MAX_X) && (y > MAX_Y)) { // if out of range
|
2022-11-24 16:50:38 -05:00
|
|
|
return SSD1306_ERROR; // error
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2022-11-24 16:50:38 -05:00
|
|
|
|
2022-12-01 08:27:53 -05:00
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// COLUMN
|
2022-11-24 16:50:38 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
2022-12-01 08:27:53 -05:00
|
|
|
status = SSD1306_Send_Command (SSD1306_SET_COLUMN_ADDR); // 0x21
|
2022-11-24 16:50:38 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2022-12-01 08:27:53 -05:00
|
|
|
// start COLUMN
|
|
|
|
status = SSD1306_Send_Command (x);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// end COLUMN
|
|
|
|
status = SSD1306_Send_Command (x);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
_indexCol = x; // update column index
|
2021-07-19 09:06:29 -04:00
|
|
|
|
2022-12-01 08:27:53 -05:00
|
|
|
// PAGE
|
2022-11-24 16:50:38 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
2022-12-01 08:27:53 -05:00
|
|
|
status = SSD1306_Send_Command (SSD1306_SET_PAGE_ADDR); // 0x22
|
2022-11-24 16:50:38 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2022-11-21 08:31:26 -05:00
|
|
|
}
|
2022-12-01 08:27:53 -05:00
|
|
|
// start PAGE
|
|
|
|
status = SSD1306_Send_Command (page);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// end PAGE
|
|
|
|
status = SSD1306_Send_Command (page);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
_indexPage = y; // update page index
|
|
|
|
|
2022-11-24 16:50:38 -05:00
|
|
|
// TWI control byte data stream
|
|
|
|
// -------------------------------------------------------------------------------------
|
2022-12-01 08:27:53 -05:00
|
|
|
status = TWI_MT_Send_Data (SSD1306_DATA); // send data 0xC0
|
2022-11-24 16:50:38 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2022-11-24 16:50:38 -05:00
|
|
|
// send clear byte to memory lcd
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Send_Data (pixel); // send pixel
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
|
|
|
|
// TWI stop
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
TWI_Stop ();
|
|
|
|
|
|
|
|
return SSD1306_SUCCESS; // success
|
2021-07-19 09:06:29 -04:00
|
|
|
}
|
2022-11-25 03:05:32 -05:00
|
|
|
|
2022-12-01 08:27:53 -05:00
|
|
|
/**
|
|
|
|
* @desc Draw line horizontal
|
|
|
|
*
|
|
|
|
* @param uint8_t x
|
|
|
|
* @param uint8_t y1
|
|
|
|
* @param uint8_t y2
|
|
|
|
*
|
|
|
|
* @return uint8_t
|
|
|
|
*/
|
|
|
|
uint8_t SSD1306_DrawLineHorz (uint8_t y, uint8_t x1, uint8_t x2)
|
|
|
|
{
|
|
|
|
uint8_t i = 0; // counter
|
|
|
|
uint8_t len = x2 - x1; // length
|
|
|
|
uint8_t page = y >> 3; // page
|
|
|
|
uint8_t pixel = 1 << (y - (page << 3)); // pixel
|
|
|
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
|
|
|
|
|
|
if ((x > MAX_X) && (y > MAX_Y)) { // if out of range
|
|
|
|
return SSD1306_ERROR; // error
|
|
|
|
}
|
|
|
|
|
|
|
|
// TWI start & SLAW
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// COLUMN
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_Command (SSD1306_SET_COLUMN_ADDR); // 0x21
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// start COLUMN
|
|
|
|
status = SSD1306_Send_Command (x1);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// end COLUMN
|
|
|
|
status = SSD1306_Send_Command (x2);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
_indexCol = x; // update column index
|
|
|
|
|
|
|
|
// PAGE
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = SSD1306_Send_Command (SSD1306_SET_PAGE_ADDR); // 0x22
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// start PAGE
|
|
|
|
status = SSD1306_Send_Command (page);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
// end PAGE
|
|
|
|
status = SSD1306_Send_Command (page);
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
2022-12-01 08:38:26 -05:00
|
|
|
_indexPage = y; // update page index
|
2022-12-01 08:27:53 -05:00
|
|
|
|
|
|
|
// TWI control byte data stream
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
status = TWI_MT_Send_Data (SSD1306_DATA_STREAM); // send data 0x40
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
|
|
|
|
// send pixels
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
while (i < len) {
|
|
|
|
status = TWI_MT_Send_Data (pixel); // send pixel
|
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
// TWI stop
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
TWI_Stop ();
|
|
|
|
|
|
|
|
return SSD1306_SUCCESS; // success return
|
|
|
|
}
|
|
|
|
|
2022-11-25 03:05:32 -05:00
|
|
|
/**
|
|
|
|
* @desc Draw line by Bresenham algoritm
|
2022-12-01 08:38:26 -05:00
|
|
|
* @note Approach with DrawPixel function takes 9 bytes for drawing 1 pixel
|
2022-11-25 03:05:32 -05:00
|
|
|
*
|
|
|
|
* @param uint8_t x start position / 0 <= cols <= MAX_X-1
|
|
|
|
* @param uint8_t x end position / 0 <= cols <= MAX_X-1
|
|
|
|
* @param uint8_t y start position / 0 <= rows <= MAX_Y-1
|
|
|
|
* @param uint8_t y end position / 0 <= rows <= MAX_Y-1
|
|
|
|
*
|
|
|
|
* @return uint8_t
|
|
|
|
*/
|
|
|
|
uint8_t SSD1306_DrawLine (uint8_t x1, uint8_t x2, uint8_t y1, uint8_t y2)
|
|
|
|
{
|
|
|
|
int16_t D; // determinant
|
|
|
|
int16_t delta_x, delta_y; // deltas
|
|
|
|
int16_t trace_x = 1, trace_y = 1; // steps
|
2022-12-01 08:27:53 -05:00
|
|
|
uint16_t buffer[]; // buffer
|
2022-11-25 03:05:32 -05:00
|
|
|
|
|
|
|
delta_x = x2 - x1; // delta x
|
|
|
|
delta_y = y2 - y1; // delta y
|
|
|
|
|
2022-12-01 08:27:53 -05:00
|
|
|
// draw line with faster draw horizontal line function
|
2022-11-25 07:57:31 -05:00
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
if (delta_y == 0) {
|
2022-12-01 08:27:53 -05:00
|
|
|
status = SSD1306_DrawLineHorz (y1, x1, x2); // draw horiyontal line
|
2022-11-25 07:57:31 -05:00
|
|
|
if (SSD1306_SUCCESS != status) { // check status
|
|
|
|
return status; // error
|
|
|
|
}
|
2022-12-01 08:27:53 -05:00
|
|
|
return SSD1306_SUCCESS; // success return
|
|
|
|
}
|
2022-11-25 07:57:31 -05:00
|
|
|
|
2022-11-25 03:05:32 -05:00
|
|
|
if (delta_x < 0) { // check if x2 > x1
|
|
|
|
delta_x = -delta_x; // negate delta x
|
|
|
|
trace_x = -trace_x; // negate step x
|
|
|
|
}
|
|
|
|
if (delta_y < 0) { // check if y2 > y1
|
|
|
|
delta_y = -delta_y; // negate delta y
|
|
|
|
trace_y = -trace_y; // negate step y
|
|
|
|
}
|
|
|
|
// condition for m < 1 (dy < dx)
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
if (delta_y < delta_x) { //
|
|
|
|
D = (delta_y << 1) - delta_x; // calculate determinant
|
|
|
|
SSD1306_DrawPixel (x1, y1); // draw first pixel
|
|
|
|
while (x1 != x2) { // check if x1 equal x2
|
|
|
|
x1 += trace_x; // update x1
|
|
|
|
if (D >= 0) { // positive?
|
|
|
|
y1 += trace_y; // update y1
|
|
|
|
D -= 2*delta_x; // update determinant
|
|
|
|
}
|
|
|
|
D += 2*delta_y; // update deteminant
|
|
|
|
SSD1306_DrawPixel (x1, y1); // draw next pixel
|
|
|
|
}
|
|
|
|
// condition for m >= 1 (dy >= dx)
|
|
|
|
// -------------------------------------------------------------------------------------
|
|
|
|
} else {
|
|
|
|
D = delta_y - (delta_x << 1); // calculate determinant
|
|
|
|
SSD1306_DrawPixel (x1, y1); // draw first pixel
|
|
|
|
while (y1 != y2) { // check if y2 equal y1
|
|
|
|
y1 += trace_y; // update y1
|
|
|
|
if (D <= 0) { // positive?
|
|
|
|
x1 += trace_x; // update y1
|
|
|
|
D += 2*delta_y; // update determinant
|
|
|
|
}
|
|
|
|
D -= 2*delta_x; // update deteminant
|
|
|
|
SSD1306_DrawPixel (x1, y1); // draw next pixel
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return SSD1306_SUCCESS; // success return
|
|
|
|
}
|