mirror of
https://github.com/Matiasus/SSD1306.git
synced 2024-10-03 18:18:46 -04:00
Add drawLine horizontal, vertical lines
This commit is contained in:
parent
f18ec22fd1
commit
6def203ae8
691
lib/ssd1306.c
691
lib/ssd1306.c
@ -7,16 +7,16 @@
|
|||||||
*
|
*
|
||||||
* @author Marian Hrinko
|
* @author Marian Hrinko
|
||||||
* @date 06.10.2020
|
* @date 06.10.2020
|
||||||
* @update 15.12.2022
|
* @update 06.12.2022
|
||||||
* @file ssd1306.c
|
* @file ssd1306.c
|
||||||
* @version 3.0.0
|
* @version 3.0
|
||||||
* @tested AVR Atmega328p
|
* @tested AVR Atmega328p
|
||||||
*
|
*
|
||||||
* @depend ssd1306.h
|
* @depend font.h, twi.h
|
||||||
* --------------------------------------------------------------------------------------+
|
* --------------------------------------------------------------------------------------+
|
||||||
* @descr Version 1.0.0 -> applicable for 1 display
|
* @descr Version 1.0 -> applicable for 1 display
|
||||||
* Version 2.0.0 -> rebuild to 'cacheMemLcd' array
|
* Version 2.0 -> rebuild to 'cacheMemLcd' array
|
||||||
* Version 3.0.0 -> simplified alphanumeric version for 1 display
|
* Version 3.0 -> simplified alphanumeric version
|
||||||
* --------------------------------------------------------------------------------------+
|
* --------------------------------------------------------------------------------------+
|
||||||
* @usage Basic Setup for OLED Display
|
* @usage Basic Setup for OLED Display
|
||||||
*/
|
*/
|
||||||
@ -24,109 +24,34 @@
|
|||||||
// @includes
|
// @includes
|
||||||
#include "ssd1306.h"
|
#include "ssd1306.h"
|
||||||
|
|
||||||
// +---------------------------+
|
// @const uint8_t - List of init commands according to datasheet SSD1306
|
||||||
// | 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 |
|
|
||||||
// +---------------------------+
|
|
||||||
|
|
||||||
// @array Init command
|
|
||||||
const uint8_t INIT_SSD1306[] PROGMEM = {
|
const uint8_t INIT_SSD1306[] PROGMEM = {
|
||||||
18, // number of initializers
|
17, // number of initializers
|
||||||
0, SSD1306_DISPLAY_OFF, // 0xAE = Set Display OFF
|
//SSD1306_RESET, 0, // 0xE4 = Software Reset?
|
||||||
1, SSD1306_SET_MUX_RATIO, 63, // 0xA8 - 64MUX for 128 x 64 version
|
SSD1306_DISPLAY_OFF, 0, // 0xAE = Set Display OFF
|
||||||
// - 32MUX for 128 x 32 version
|
SSD1306_SET_MUX_RATIO, 1, 0x3F, // 0xA8 - 0x3F for 128 x 64 version (64MUX)
|
||||||
1, SSD1306_MEMORY_ADDR_MODE, 0x00, // 0x20 = Set Memory Addressing Mode
|
// - 0x1F for 128 x 32 version (32MUX)
|
||||||
|
SSD1306_MEMORY_ADDR_MODE, 1, 0x00, // 0x20 = Set Memory Addressing Mode
|
||||||
// 0x00 - Horizontal Addressing Mode
|
// 0x00 - Horizontal Addressing Mode
|
||||||
// 0x01 - Vertical Addressing Mode
|
// 0x01 - Vertical Addressing Mode
|
||||||
// 0x02 - Page Addressing Mode (RESET)
|
// 0x02 - Page Addressing Mode (RESET)
|
||||||
2, SSD1306_SET_COLUMN_ADDR, START_COLUMN_ADDR, END_COLUMN_ADDR, // 0x21 = Set Column Address, 0 - 127
|
SSD1306_SET_START_LINE, 0, // 0x40
|
||||||
2, SSD1306_SET_PAGE_ADDR, START_PAGE_ADDR, END_PAGE_ADDR, // 0x22 = Set Page Address, 0 - 7
|
SSD1306_DISPLAY_OFFSET, 1, 0x00, // 0xD3
|
||||||
0, SSD1306_SET_START_LINE, // 0x40
|
SSD1306_SEG_REMAP_OP, 0, // 0xA0 / remap 0xA1
|
||||||
1, SSD1306_DISPLAY_OFFSET, 0x00, // 0xD3
|
SSD1306_COM_SCAN_DIR_OP, 0, // 0xC0 / remap 0xC8
|
||||||
0, SSD1306_SEG_REMAP_OP, // 0xA0 / remap 0xA1
|
SSD1306_COM_PIN_CONF, 1, 0x12, // 0xDA, 0x12 - Disable COM Left/Right remap, Alternative COM pin configuration
|
||||||
0, SSD1306_COM_SCAN_DIR_OP, // 0xC0 / remap 0xC8
|
|
||||||
1, SSD1306_COM_PIN_CONF, 0x12, // 0xDA, 0x12 - Disable COM Left/Right remap, Alternative COM pin configuration
|
|
||||||
// 0x12 - for 128 x 64 version
|
// 0x12 - for 128 x 64 version
|
||||||
// 0x02 - for 128 x 32 version
|
// 0x02 - for 128 x 32 version
|
||||||
1, SSD1306_SET_CONTRAST, 0x7F, // 0x81, 0x7F - reset value (max 0xFF)
|
SSD1306_SET_CONTRAST, 1, 0x7F, // 0x81, 0x7F - reset value (max 0xFF)
|
||||||
0, SSD1306_DIS_ENT_DISP_ON, // 0xA4
|
SSD1306_DIS_ENT_DISP_ON, 0, // 0xA4
|
||||||
0, SSD1306_DIS_NORMAL, // 0xA6
|
SSD1306_DIS_NORMAL, 0, // 0xA6
|
||||||
1, SSD1306_SET_OSC_FREQ, 0x80, // 0xD5, 0x80 => D=1; DCLK = Fosc / D <=> DCLK = Fosc
|
SSD1306_SET_OSC_FREQ, 1, 0x80, // 0xD5, 0x80 => D=1; DCLK = Fosc / D <=> DCLK = Fosc
|
||||||
1, SSD1306_SET_PRECHARGE, 0xc2, // 0xD9, higher value less blinking
|
SSD1306_SET_PRECHARGE, 1, 0xc2, // 0xD9, higher value less blinking
|
||||||
// 0xC2, 1st phase = 2 DCLK, 2nd phase = 13 DCLK
|
// 0xC2, 1st phase = 2 DCLK, 2nd phase = 13 DCLK
|
||||||
1, SSD1306_VCOM_DESELECT, 0x20, // Set V COMH Deselect, reset value 0x22 = 0,77xUcc
|
SSD1306_VCOM_DESELECT, 1, 0x20, // Set V COMH Deselect, reset value 0x22 = 0,77xUcc
|
||||||
1, SSD1306_SET_CHAR_REG, 0x14, // 0x8D, Enable charge pump during display on
|
SSD1306_SET_CHAR_REG, 1, 0x14, // 0x8D, Enable charge pump during display on
|
||||||
0, SSD1306_DISPLAY_ON // 0xAF = Set Display ON
|
SSD1306_DEACT_SCROLL, 0, // 0x2E
|
||||||
|
SSD1306_DISPLAY_ON, 0 // 0xAF = Set Display ON
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned short int _indexCol = START_COLUMN_ADDR; // @var global - cache index column
|
unsigned short int _indexCol = START_COLUMN_ADDR; // @var global - cache index column
|
||||||
@ -189,50 +114,56 @@ uint8_t SSD1306_Send_Command (uint8_t command)
|
|||||||
/**
|
/**
|
||||||
* @desc SSD1306 Init
|
* @desc SSD1306 Init
|
||||||
*
|
*
|
||||||
* @param void
|
* @param uint8_t address
|
||||||
*
|
*
|
||||||
* @return uint8_t
|
* @return uint8_t
|
||||||
*/
|
*/
|
||||||
uint8_t SSD1306_Init (void)
|
uint8_t SSD1306_Init (uint8_t address)
|
||||||
{
|
{
|
||||||
const uint8_t *commands = INIT_SSD1306; // variables
|
const uint8_t * list = INIT_SSD1306;
|
||||||
uint8_t no_of_commands = pgm_read_byte (commands++); // number of commands
|
uint8_t status = INIT_STATUS; // init status
|
||||||
uint8_t no_of_arguments; // number od arguments
|
uint8_t arguments;
|
||||||
uint8_t command; // command
|
uint8_t commands = pgm_read_byte (list++);
|
||||||
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
|
||||||
|
|
||||||
// TWI INIT
|
// TWI: Init
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
TWI_Init ();
|
TWI_Init ();
|
||||||
|
|
||||||
// TWI START & SLAW
|
// TWI: start & SLAW
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
status = SSD1306_Send_StartAndSLAW (address);
|
||||||
if (SSD1306_SUCCESS != status) { // check status
|
if (SSD1306_SUCCESS != status) {
|
||||||
return status; // error
|
return status;
|
||||||
}
|
}
|
||||||
// SEND COMMAND & ARGUMENTS
|
|
||||||
|
// SW RESET
|
||||||
|
// -----------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_RESET);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
_delay_ms (1);
|
||||||
|
|
||||||
|
// Commands & Arguments
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
while (no_of_commands) { // commands loop
|
while (commands--) {
|
||||||
no_of_arguments = pgm_read_byte (commands++); // number of arguments
|
// Command
|
||||||
command = pgm_read_byte (commands++); // command
|
|
||||||
// Send commands
|
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
status = SSD1306_Send_Command (command); // send command
|
status = SSD1306_Send_Command (pgm_read_byte(list++));
|
||||||
if (SSD1306_SUCCESS != status) { // check status
|
if (SSD1306_SUCCESS != status) {
|
||||||
return status; // error
|
return status;
|
||||||
}
|
}
|
||||||
// Send arguments
|
// Arguments
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
while (no_of_arguments--) {
|
arguments = pgm_read_byte (list++);
|
||||||
status = SSD1306_Send_Command (pgm_read_byte(commands++)); // send argument
|
while (arguments--) {
|
||||||
if (SSD1306_SUCCESS != status) { // check status
|
status = SSD1306_Send_Command (pgm_read_byte(list++)); // argument
|
||||||
return status; // error
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
no_of_commands--; // next command
|
|
||||||
}
|
}
|
||||||
// TWI STOP
|
// TWI: Stop
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
TWI_Stop ();
|
TWI_Stop ();
|
||||||
|
|
||||||
@ -309,8 +240,7 @@ uint8_t SSD1306_InverseScreen (void)
|
|||||||
uint8_t SSD1306_ClearScreen (void)
|
uint8_t SSD1306_ClearScreen (void)
|
||||||
{
|
{
|
||||||
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
||||||
uint16_t i = 0; // counter
|
|
||||||
|
|
||||||
// TWI START & SLAW
|
// TWI START & SLAW
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
|
||||||
@ -353,6 +283,68 @@ uint8_t SSD1306_ClearScreen (void)
|
|||||||
if (SSD1306_SUCCESS != status) { // check status
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
return status; // error
|
return status; // error
|
||||||
}
|
}
|
||||||
|
// send clear byte to memory lcd
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
for (uint16_t i=0; i<CACHE_SIZE_MEM; i++) {
|
||||||
|
status = TWI_MT_Send_Data (CLEAR_COLOR); // send data 0x00
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TWI STOP
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
TWI_Stop ();
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS; // success
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc SSD1306 Clear screen
|
||||||
|
*
|
||||||
|
* @param uint8_t page
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_ClearPage (uint8_t page)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_SET_COLUMN_ADDR); // 0x21
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (0); // start COLUMN
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (END_COLUMN_ADDR); // end COLUMN
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexCol = 0; // update column index
|
||||||
|
// PAGE
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_SET_PAGE_ADDR); // 0x22
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (page); // start PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (page); // end PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexPage = 0; // update column index
|
||||||
// TWI control byte data stream
|
// TWI control byte data stream
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
status = TWI_MT_Send_Data (SSD1306_DATA_STREAM); // send data 0x40
|
status = TWI_MT_Send_Data (SSD1306_DATA_STREAM); // send data 0x40
|
||||||
@ -361,12 +353,80 @@ uint8_t SSD1306_ClearScreen (void)
|
|||||||
}
|
}
|
||||||
// send clear byte to memory lcd
|
// send clear byte to memory lcd
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
while (i < CACHE_SIZE_MEM) {
|
for (uint16_t i=0; i<=END_COLUMN_ADDR; i++) {
|
||||||
|
status = TWI_MT_Send_Data (CLEAR_COLOR); // send data 0x00
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// TWI STOP
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
TWI_Stop ();
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS; // success
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc SSD1306 Clear screen
|
||||||
|
*
|
||||||
|
* @param uint8_t page
|
||||||
|
* @param uint8_t margin
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_ClearPageFromToEnd (uint8_t page, uint8_t margin)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_SET_COLUMN_ADDR); // 0x21
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (margin); // start COLUMN
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (END_COLUMN_ADDR-margin); // end COLUMN
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexCol = margin; // update column index
|
||||||
|
// PAGE
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_SET_PAGE_ADDR); // 0x22
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (page); // start PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (END_PAGE_ADDR); // end PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexPage = 0; // update column index
|
||||||
|
// 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 clear byte to memory lcd
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
for (uint16_t i=0; i<=((END_PAGE_ADDR-page) * (END_COLUMN_ADDR - 2*margin)); i++) {
|
||||||
status = TWI_MT_Send_Data (CLEAR_COLOR); // send data 0x00
|
status = TWI_MT_Send_Data (CLEAR_COLOR); // send data 0x00
|
||||||
if (SSD1306_SUCCESS != status) { // check status
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
return status; // error
|
return status; // error
|
||||||
}
|
}
|
||||||
i++; // update counter
|
|
||||||
}
|
}
|
||||||
// TWI STOP
|
// TWI STOP
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
@ -474,7 +534,7 @@ uint8_t SSD1306_UpdatePosition (uint8_t x, uint8_t p)
|
|||||||
// last page not reached
|
// last page not reached
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
if (p < END_PAGE_ADDR) {
|
if (p < END_PAGE_ADDR) {
|
||||||
_indexCol = 0; // update column
|
_indexCol = 2; // update column
|
||||||
_indexPage = _indexPage + 1; // update page
|
_indexPage = _indexPage + 1; // update page
|
||||||
status = SSD1306_SetPosition (_indexCol, _indexPage); // update position
|
status = SSD1306_SetPosition (_indexCol, _indexPage); // update position
|
||||||
if (SSD1306_SUCCESS != status) { // check status
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
@ -625,3 +685,366 @@ uint8_t SSD1306_DrawString (char *str, enum E_Font font)
|
|||||||
|
|
||||||
return SSD1306_SUCCESS; // success
|
return SSD1306_SUCCESS; // success
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc SSD1306 Draw String
|
||||||
|
*
|
||||||
|
* @param char * string
|
||||||
|
* @param E_Font
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawSongName (char * str, enum E_Font font)
|
||||||
|
{
|
||||||
|
uint8_t i = 0; // char counter
|
||||||
|
uint8_t n = 8;
|
||||||
|
|
||||||
|
// send characters of string
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
while (i < n) {
|
||||||
|
if (str[i] == ' ') {
|
||||||
|
i++;
|
||||||
|
} else {
|
||||||
|
SSD1306_DrawChar (str[i++], font); // send char
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS; // success
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Draw line vertical
|
||||||
|
*
|
||||||
|
* @param uint8_t x {0 -> END_COLUMN_ADDRESS}
|
||||||
|
* @param uint8_t y {0 -> END_PAGE_ADDR}
|
||||||
|
* @param uint8_t height
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawLineVertical (uint8_t x, uint8_t y, uint8_t height)
|
||||||
|
{
|
||||||
|
uint8_t i = 0;
|
||||||
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
||||||
|
|
||||||
|
if ((y + height) > END_PAGE_ADDR) {
|
||||||
|
return SSD1306_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
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (x); // start COLUMN
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (x); // end COLUMN
|
||||||
|
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
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (y); // start PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (y + height); // end PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexPage = y; // update column index
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
while (i++ <= height) {
|
||||||
|
status = TWI_MT_Send_Data (0xff); // send data col
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TWI STOP
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
TWI_Stop ();
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS; // success
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Draw rectangle
|
||||||
|
*
|
||||||
|
* @param uint8_t x {0 -> END_COLUMN_ADDRESS}
|
||||||
|
* @param uint8_t y {0 -> END_PAGE_ADDR}
|
||||||
|
* @param uint8_t width
|
||||||
|
* @param uint8_t height
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawRectangle (uint8_t x, uint8_t y, uint8_t width, uint8_t height)
|
||||||
|
{
|
||||||
|
uint16_t i = 0;
|
||||||
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
||||||
|
uint16_t loops;
|
||||||
|
|
||||||
|
if (((x + width) > END_COLUMN_ADDR) ||
|
||||||
|
((y + height) > END_PAGE_ADDR)) {
|
||||||
|
return SSD1306_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
loops = (x + width) * (y + height); // num of loops
|
||||||
|
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (x); // start COLUMN
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (x + width); // end COLUMN
|
||||||
|
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
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (y); // start PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (y + height); // end PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexPage = y; // update column index
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
while (i++ <= loops) {
|
||||||
|
status = TWI_MT_Send_Data (0xff); // send data col
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TWI STOP
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
TWI_Stop ();
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS; // success
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Draw line horizontal
|
||||||
|
*
|
||||||
|
* @param uint8_t x {0 -> END_COLUMN_ADDRESS}
|
||||||
|
* @param uint8_t y {0 -> END_PAGE_ADDR}
|
||||||
|
* @param uint8_t width {(x + width) <= END_COLUMN_ADDRESS}
|
||||||
|
* @param enum E_line {TOP, TOPDOUBLE, ... BOTTOM, BOTTOMDOUBLE} see enum E_Line
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawLineHorizontal (uint8_t x, uint8_t y, uint8_t width, enum E_Line line)
|
||||||
|
{
|
||||||
|
uint8_t status = INIT_STATUS; // TWI init status 0xFF
|
||||||
|
uint8_t i = 0; // counter
|
||||||
|
|
||||||
|
if ((x + width) > END_COLUMN_ADDR) {
|
||||||
|
return SSD1306_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
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (x); // start COLUMN
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (x + width); // end COLUMN
|
||||||
|
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
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (y); // start PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
status = SSD1306_Send_Command (y ); // end PAGE
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexPage = y; // update column index
|
||||||
|
// 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
|
||||||
|
}
|
||||||
|
|
||||||
|
while (i++ < width) {
|
||||||
|
status = TWI_MT_Send_Data (line); // send data col
|
||||||
|
if (SSD1306_SUCCESS != status) { // check status
|
||||||
|
return status; // error
|
||||||
|
}
|
||||||
|
_indexCol++; // update global col
|
||||||
|
}
|
||||||
|
|
||||||
|
// TWI STOP
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
TWI_Stop ();
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS; // success
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Horizontal Scroll
|
||||||
|
*
|
||||||
|
* @param uint8_t address
|
||||||
|
* @param uint8_t start page
|
||||||
|
* @param uint8_t end page
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_HorizontalScroll (uint8_t address, uint8_t start, uint8_t end)
|
||||||
|
{
|
||||||
|
uint8_t status = INIT_STATUS;
|
||||||
|
|
||||||
|
// TWI: start & SLAW
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_StartAndSLAW (address);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// send command
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_SCROLL_HOR_LEFT);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// dummy BYTE
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (0x00);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// Start PAGE
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (start);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// Speed
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (0x00);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// End PAGE
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (end);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// dummy BYTE
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (0x00);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// dummy BYTE
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (0xFF);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// Start Scroll
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_ACTIVE_SCROLL);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// TWI: Stop
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
TWI_Stop ();
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Horizontal Scroll Stop
|
||||||
|
*
|
||||||
|
* @param uint8_t address
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_HorizontalScrollStop (uint8_t address)
|
||||||
|
{
|
||||||
|
uint8_t status = INIT_STATUS;
|
||||||
|
|
||||||
|
// TWI: start & SLAW
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_StartAndSLAW (address);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// Stop Scroll
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
status = SSD1306_Send_Command (SSD1306_DEACT_SCROLL);
|
||||||
|
if (SSD1306_SUCCESS != status) {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
// TWI: Stop
|
||||||
|
// -------------------------------------------------------------------------------------
|
||||||
|
TWI_Stop ();
|
||||||
|
|
||||||
|
return SSD1306_SUCCESS;
|
||||||
|
}
|
198
lib/ssd1306.h
198
lib/ssd1306.h
@ -1,22 +1,22 @@
|
|||||||
/**
|
/**
|
||||||
* -------------------------------------------------------------------------------------+
|
* -------------------------------------------------------------------------------------+
|
||||||
* @desc SSD1306 OLED Driver
|
* @brief SSD1306 OLED Driver
|
||||||
* -------------------------------------------------------------------------------------+
|
* -------------------------------------------------------------------------------------+
|
||||||
* Copyright (C) 2020 Marian Hrinko.
|
* Copyright (C) 2020 Marian Hrinko.
|
||||||
* Written by Marian Hrinko (mato.hrinko@gmail.com)
|
* Written by Marian Hrinko (mato.hrinko@gmail.com)
|
||||||
*
|
*
|
||||||
* @author Marian Hrinko
|
* @author Marian Hrinko
|
||||||
* @date 06.10.2020
|
* @date 06.10.2020
|
||||||
* @update 15.12.2022
|
* @update 21.11.2022
|
||||||
* @file ssd1306.h
|
* @file ssd1306.h
|
||||||
* @version 3.0.0
|
* @version 3.0
|
||||||
* @tested AVR Atmega328p
|
* @tested AVR Atmega328p
|
||||||
*
|
*
|
||||||
* @depend font.h, twi.h
|
* @depend font.h, twi.h
|
||||||
* -------------------------------------------------------------------------------------+
|
* -------------------------------------------------------------------------------------+
|
||||||
* @descr Version 1.0.0 -> applicable for 1 display
|
* @descr Version 1.0 -> applicable for 1 display
|
||||||
* Version 2.0.0 -> rebuild to 'cacheMemLcd' array
|
* Version 2.0 -> rebuild to 'cacheMemLcd' array
|
||||||
* Version 3.0.0 -> simplified alphanumeric version for 1 display
|
* Version 3.0 -> simplified alphanumeric version
|
||||||
* -------------------------------------------------------------------------------------+
|
* -------------------------------------------------------------------------------------+
|
||||||
* @usage Basic Setup for OLED Display
|
* @usage Basic Setup for OLED Display
|
||||||
*/
|
*/
|
||||||
@ -25,6 +25,7 @@
|
|||||||
#define __SSD1306_H__
|
#define __SSD1306_H__
|
||||||
|
|
||||||
// includes
|
// includes
|
||||||
|
#include <util/delay.h>
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
#include "twi.h"
|
#include "twi.h"
|
||||||
|
|
||||||
@ -44,30 +45,45 @@
|
|||||||
#define SSD1306_DATA 0xC0 // Continuation bit=1, D/C=1; 1100 0000
|
#define SSD1306_DATA 0xC0 // Continuation bit=1, D/C=1; 1100 0000
|
||||||
#define SSD1306_DATA_STREAM 0x40 // Continuation bit=0, D/C=1; 0100 0000
|
#define SSD1306_DATA_STREAM 0x40 // Continuation bit=0, D/C=1; 0100 0000
|
||||||
|
|
||||||
#define SSD1306_SET_MUX_RATIO 0xA8
|
#define SSD1306_SET_MUX_RATIO 0xA8 // Set MUX ratio to N+1 MUX, N=A[5:0] : from 16MUX to 64MUX
|
||||||
#define SSD1306_DISPLAY_OFFSET 0xD3
|
#define SSD1306_DISPLAY_OFFSET 0xD3 // Set Display Offset
|
||||||
#define SSD1306_DISPLAY_ON 0xAF
|
#define SSD1306_DISPLAY_ON 0xAF // Display ON in normal mode
|
||||||
#define SSD1306_DISPLAY_OFF 0xAE
|
#define SSD1306_DISPLAY_OFF 0xAE // Display OFF (sleep mode)
|
||||||
#define SSD1306_DIS_ENT_DISP_ON 0xA4
|
#define SSD1306_DIS_ENT_DISP_ON 0xA4 // Entire Display ON, Output ignores RAM content
|
||||||
#define SSD1306_DIS_IGNORE_RAM 0xA5
|
#define SSD1306_DIS_IGNORE_RAM 0xA5 // Resume to RAM content display, Output follows RAM content
|
||||||
#define SSD1306_DIS_NORMAL 0xA6
|
#define SSD1306_DIS_NORMAL 0xA6 // Normal display, 0 in RAM: OFF in display panel, 1 in RAM: ON in display panel
|
||||||
#define SSD1306_DIS_INVERSE 0xA7
|
#define SSD1306_DIS_INVERSE 0xA7 // Inverse display, 0 in RAM: ON in display panel, 1 in RAM: OFF in display panel
|
||||||
#define SSD1306_DEACT_SCROLL 0x2E
|
#define SSD1306_DEACT_SCROLL 0x2E // Stop scrolling that is configured by command 26h/27h/29h/2Ah
|
||||||
#define SSD1306_ACTIVE_SCROLL 0x2F
|
#define SSD1306_ACTIVE_SCROLL 0x2F // Start scrolling that is configured by the scrolling setup commands:26h/27h/29h/2Ah
|
||||||
#define SSD1306_SET_START_LINE 0x40
|
#define SSD1306_SCROLL_HOR_RIGHT 0x26 // Horizontal Right Horizontal Scroll
|
||||||
#define SSD1306_MEMORY_ADDR_MODE 0x20
|
#define SSD1306_SCROLL_HOR_LEFT 0x27 // Horizontal Left Horizontal Scroll
|
||||||
#define SSD1306_SET_COLUMN_ADDR 0x21
|
#define SSD1306_SET_START_LINE 0x40 // Set Display Start Line
|
||||||
#define SSD1306_SET_PAGE_ADDR 0x22
|
#define SSD1306_MEMORY_ADDR_MODE 0x20 // Set Memory, Addressing Mode
|
||||||
#define SSD1306_SEG_REMAP 0xA0
|
#define SSD1306_SET_COLUMN_ADDR 0x21 // Set Column Address
|
||||||
#define SSD1306_SEG_REMAP_OP 0xA1
|
#define SSD1306_SET_PAGE_ADDR 0x22 // Set Page Address
|
||||||
#define SSD1306_COM_SCAN_DIR 0xC0
|
#define SSD1306_SEG_REMAP 0xA0 // Set Segment Re-map, X[0]=0b column address 0 is mapped to SEG0
|
||||||
#define SSD1306_COM_SCAN_DIR_OP 0xC8
|
#define SSD1306_SEG_REMAP_OP 0xA1 // Set Segment Re-map, X[0]=1b: column address 127 is mapped to SEG0
|
||||||
#define SSD1306_COM_PIN_CONF 0xDA
|
#define SSD1306_COM_SCAN_DIR 0xC0 // Set COM Output, X[3]=0b: normal mode (RESET) Scan from COM0 to COM[N –1], e N is the Multiplex ratio
|
||||||
#define SSD1306_SET_CONTRAST 0x81
|
#define SSD1306_COM_SCAN_DIR_OP 0xC8 // Set COM Output, X[3]=1b: remapped mode. Scan from COM[N-1] to COM0, e N is the Multiplex ratio
|
||||||
#define SSD1306_SET_OSC_FREQ 0xD5
|
#define SSD1306_COM_PIN_CONF 0xDA // Set COM Pins Hardware Configuration,
|
||||||
#define SSD1306_SET_CHAR_REG 0x8D
|
// A[4]=0b, Sequential COM pin configuration, A[4]=1b(RESET), Alternative COM pin configuration
|
||||||
#define SSD1306_SET_PRECHARGE 0xD9
|
// A[5]=0b(RESET), Disable COM Left/Right remap, A[5]=1b, Enable COM Left/Right remap
|
||||||
#define SSD1306_VCOM_DESELECT 0xDB
|
#define SSD1306_SET_CONTRAST 0x81 // Set Contrast Control, Double byte command to select 1 to 256 contrast steps, increases as the value increases
|
||||||
|
#define SSD1306_SET_OSC_FREQ 0xD5 // Set Display Clock Divide Ratio/Oscillator Frequency
|
||||||
|
// A[3:0] : Define the divide ratio (D) of the display clocks (DCLK): Divide ratio= A[3:0] + 1, RESET is 0000b (divide ratio = 1)
|
||||||
|
// A[7:4] : Set the Oscillator Frequency, FOSC. Oscillator Frequency increases with the value of A[7:4] and vice versa. RESET is 1000b
|
||||||
|
#define SSD1306_SET_CHAR_REG 0x8D // Charge Pump Setting, A[2] = 0b, Disable charge pump(RESET), A[2] = 1b, Enable charge pump during display on
|
||||||
|
// The Charge Pump must be enabled by the following command:
|
||||||
|
// 8Dh ; Charge Pump Setting
|
||||||
|
// 14h ; Enable Charge Pump
|
||||||
|
// AFh; Display ON
|
||||||
|
#define SSD1306_SET_PRECHARGE 0xD9 // Set Pre-charge Period
|
||||||
|
#define SSD1306_VCOM_DESELECT 0xDB // Set VCOMH Deselect Level
|
||||||
|
#define SSD1306_NOP 0xE3 // No operation
|
||||||
|
#define SSD1306_RESET 0xE4 // Maybe SW RESET, @source https://github.com/SmingHub/Sming/issues/501
|
||||||
|
|
||||||
|
#define SSD1306_VERTICAL_MODE 0x01
|
||||||
|
#define SSD1306_HORIZONTAL_MODE 0x00
|
||||||
|
|
||||||
// Clear Color
|
// Clear Color
|
||||||
// ------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------
|
||||||
@ -98,8 +114,18 @@
|
|||||||
UNDERLINE = 0x10
|
UNDERLINE = 0x10
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// @enum
|
||||||
|
enum E_Line {
|
||||||
|
TOP = 0x01,
|
||||||
|
TOPDOUBLE = 0x03,
|
||||||
|
MIDDLE = 0x01,
|
||||||
|
MIDDLEDOUBLE = 0x18,
|
||||||
|
BOTTOM = 0x80,
|
||||||
|
BOTTOMDOUBLE = 0xC0
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Send Start and SLAW request
|
* @brief SSD1306 Send Start and SLAW request
|
||||||
*
|
*
|
||||||
* @param uint8_t
|
* @param uint8_t
|
||||||
*
|
*
|
||||||
@ -108,7 +134,7 @@
|
|||||||
uint8_t SSD1306_Send_StartAndSLAW (uint8_t);
|
uint8_t SSD1306_Send_StartAndSLAW (uint8_t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Send command
|
* @brief SSD1306 Send command
|
||||||
*
|
*
|
||||||
* @param uint8_t
|
* @param uint8_t
|
||||||
*
|
*
|
||||||
@ -117,16 +143,16 @@
|
|||||||
uint8_t SSD1306_Send_Command (uint8_t);
|
uint8_t SSD1306_Send_Command (uint8_t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Init
|
* @brief SSD1306 Init
|
||||||
*
|
*
|
||||||
* @param void
|
* @param uint8_t address
|
||||||
*
|
*
|
||||||
* @return uint8_t
|
* @return uint8_t
|
||||||
*/
|
*/
|
||||||
uint8_t SSD1306_Init (void);
|
uint8_t SSD1306_Init (uint8_t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Clear screen
|
* @brief SSD1306 Clear screen
|
||||||
*
|
*
|
||||||
* @param void
|
* @param void
|
||||||
*
|
*
|
||||||
@ -135,7 +161,26 @@
|
|||||||
uint8_t SSD1306_ClearScreen (void);
|
uint8_t SSD1306_ClearScreen (void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Normal colors
|
* @desc SSD1306 Clear Page
|
||||||
|
*
|
||||||
|
* @param uint8_t page
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_ClearPage (uint8_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @desc SSD1306 Clear screen
|
||||||
|
*
|
||||||
|
* @param uint8_t page
|
||||||
|
* @param uint8_t margin
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_ClearPageFromToEnd (uint8_t, uint8_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Normal colors
|
||||||
*
|
*
|
||||||
* @param void
|
* @param void
|
||||||
*
|
*
|
||||||
@ -144,7 +189,7 @@
|
|||||||
uint8_t SSD1306_NormalScreen (void);
|
uint8_t SSD1306_NormalScreen (void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Inverse colors
|
* @brief SSD1306 Inverse colors
|
||||||
*
|
*
|
||||||
* @param void
|
* @param void
|
||||||
*
|
*
|
||||||
@ -153,7 +198,7 @@
|
|||||||
uint8_t SSD1306_InverseScreen (void);
|
uint8_t SSD1306_InverseScreen (void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Update text position
|
* @brief SSD1306 Update text position
|
||||||
*
|
*
|
||||||
* @param void
|
* @param void
|
||||||
*
|
*
|
||||||
@ -162,7 +207,7 @@
|
|||||||
uint8_t SSD1306_UpdatePosition (uint8_t, uint8_t);
|
uint8_t SSD1306_UpdatePosition (uint8_t, uint8_t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Set position
|
* @brief SSD1306 Set position
|
||||||
*
|
*
|
||||||
* @param uint8_t
|
* @param uint8_t
|
||||||
* @param uint8_t
|
* @param uint8_t
|
||||||
@ -172,7 +217,7 @@
|
|||||||
uint8_t SSD1306_SetPosition (uint8_t, uint8_t);
|
uint8_t SSD1306_SetPosition (uint8_t, uint8_t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Set window
|
* @brief SSD1306 Set window
|
||||||
*
|
*
|
||||||
* @param uint8_t column -> 0 ... 127
|
* @param uint8_t column -> 0 ... 127
|
||||||
* @param uint8_t column -> 0 ... 127
|
* @param uint8_t column -> 0 ... 127
|
||||||
@ -184,7 +229,7 @@
|
|||||||
uint8_t SSD1306_SetWindow (uint8_t, uint8_t, uint8_t, uint8_t);
|
uint8_t SSD1306_SetWindow (uint8_t, uint8_t, uint8_t, uint8_t);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Draw character
|
* @brief SSD1306 Draw character
|
||||||
*
|
*
|
||||||
* @param char
|
* @param char
|
||||||
* @param enum E_Font
|
* @param enum E_Font
|
||||||
@ -194,7 +239,7 @@
|
|||||||
uint8_t SSD1306_DrawChar (char, enum E_Font);
|
uint8_t SSD1306_DrawChar (char, enum E_Font);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @desc SSD1306 Draw string
|
* @brief SSD1306 Draw string
|
||||||
*
|
*
|
||||||
* @param char *
|
* @param char *
|
||||||
*
|
*
|
||||||
@ -202,4 +247,69 @@
|
|||||||
*/
|
*/
|
||||||
uint8_t SSD1306_DrawString (char *, enum E_Font);
|
uint8_t SSD1306_DrawString (char *, enum E_Font);
|
||||||
|
|
||||||
#endif
|
/**
|
||||||
|
* @desc SSD1306 Draw String
|
||||||
|
*
|
||||||
|
* @param char * string
|
||||||
|
* @param E_Font
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawSongName (char *, enum E_Font);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Draw line horizontal
|
||||||
|
*
|
||||||
|
* @param uint8_t x
|
||||||
|
* @param uint8_t y
|
||||||
|
* @param uint8_t width
|
||||||
|
* @param enum E_line {TOP, TOPDOUBLE, ... BOTTOM, BOTTOMDOUBLE} see enum E_Line
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawLineHorizontal (uint8_t, uint8_t, uint8_t, enum E_Line);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Draw line vertical
|
||||||
|
*
|
||||||
|
* @param uint8_t x {0 -> END_COLUMN_ADDRESS}
|
||||||
|
* @param uint8_t y {0 -> END_PAGE_ADDR}
|
||||||
|
* @param uint8_t height
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawLineVertical (uint8_t, uint8_t, uint8_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Draw rectangle
|
||||||
|
*
|
||||||
|
* @param uint8_t x {0 -> END_COLUMN_ADDRESS}
|
||||||
|
* @param uint8_t y {0 -> END_PAGE_ADDR}
|
||||||
|
* @param uint8_t width
|
||||||
|
* @param uint8_t height
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_DrawRectangle (uint8_t, uint8_t, uint8_t, uint8_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Horizontal Scroll Start
|
||||||
|
*
|
||||||
|
* @param uint8_t address
|
||||||
|
* @param uint8_t start page
|
||||||
|
* @param uint8_t end page
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_HorizontalScroll (uint8_t, uint8_t, uint8_t);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief SSD1306 Horizontal Scroll Stop
|
||||||
|
*
|
||||||
|
* @param uint8_t
|
||||||
|
*
|
||||||
|
* @return uint8_t
|
||||||
|
*/
|
||||||
|
uint8_t SSD1306_HorizontalScrollStop (uint8_t);
|
||||||
|
|
||||||
|
#endif
|
14
main.c
14
main.c
@ -32,16 +32,22 @@
|
|||||||
*/
|
*/
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
SSD1306_Init ();
|
SSD1306_Init (SSD1306_ADDR);
|
||||||
SSD1306_ClearScreen ();
|
SSD1306_ClearScreen ();
|
||||||
|
|
||||||
SSD1306_SetPosition (25, 0) ;
|
SSD1306_DrawLineHorizontal (0, 0, END_COLUMN_ADDR, 0x03);
|
||||||
|
SSD1306_DrawLineHorizontal (0, 2, END_COLUMN_ADDR, 0x18);
|
||||||
|
SSD1306_DrawLineHorizontal (0, END_PAGE_ADDR, END_COLUMN_ADDR, 0x80);
|
||||||
|
SSD1306_DrawLineVertical (0, 0, END_PAGE_ADDR);
|
||||||
|
SSD1306_DrawLineVertical (END_COLUMN_ADDR, 0, END_PAGE_ADDR);
|
||||||
|
|
||||||
|
SSD1306_SetPosition (25, 1) ;
|
||||||
SSD1306_DrawString ("SSD1306", BOLD);
|
SSD1306_DrawString ("SSD1306", BOLD);
|
||||||
|
|
||||||
SSD1306_SetPosition (4, 2) ;
|
SSD1306_SetPosition (4, 3) ;
|
||||||
SSD1306_DrawString ("by ", NORMAL);
|
SSD1306_DrawString ("by ", NORMAL);
|
||||||
SSD1306_DrawString ("MATIASUS", NORMAL | UNDERLINE);
|
SSD1306_DrawString ("MATIASUS", NORMAL | UNDERLINE);
|
||||||
SSD1306_DrawString (" (C) 2022", NORMAL);
|
SSD1306_DrawString (" (C) 2024", NORMAL);
|
||||||
|
|
||||||
// return value
|
// return value
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user