Ver3 Draw horiz line - success

This commit is contained in:
matiasus 2022-12-05 22:46:24 +01:00
parent e0e3a7053e
commit cc293bb66e
4 changed files with 281 additions and 89 deletions

View File

@ -22,6 +22,7 @@
*/ */
#include "ssd1306.h" #include "ssd1306.h"
#include <util/delay.h>
// +---------------------------+ // +---------------------------+
// | Set MUX Ratio | // | Set MUX Ratio |
@ -102,7 +103,8 @@
const uint8_t INIT_SSD1306[] PROGMEM = { const uint8_t INIT_SSD1306[] PROGMEM = {
18, // number of initializers 18, // number of initializers
0, SSD1306_DISPLAY_OFF, // 0xAE = Set Display OFF 0, SSD1306_DISPLAY_OFF, // 0xAE = Set Display OFF
1, SSD1306_SET_MUX_RATIO, 0x3F, // 0xA8 - 64MUX 1, SSD1306_SET_MUX_RATIO, 31, // 0xA8 - 64MUX for 128 x 64 version
// - 32MUX for 128 x 32 version
1, SSD1306_MEMORY_ADDR_MODE, 0x00, // 0x20 = Set Memory Addressing Mode 1, SSD1306_MEMORY_ADDR_MODE, 0x00, // 0x20 = Set Memory Addressing Mode
// 0x00 - Horizontal Addressing Mode // 0x00 - Horizontal Addressing Mode
// 0x01 - Vertical Addressing Mode // 0x01 - Vertical Addressing Mode
@ -113,7 +115,9 @@ const uint8_t INIT_SSD1306[] PROGMEM = {
1, SSD1306_DISPLAY_OFFSET, 0x00, // 0xD3 1, SSD1306_DISPLAY_OFFSET, 0x00, // 0xD3
0, SSD1306_SEG_REMAP_OP, // 0xA0 / remap 0xA1 0, SSD1306_SEG_REMAP_OP, // 0xA0 / remap 0xA1
0, SSD1306_COM_SCAN_DIR_OP, // 0xC0 / remap 0xC8 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 1, SSD1306_COM_PIN_CONF, 0x02, // 0xDA, 0x12 - Disable COM Left/Right remap, Alternative COM pin configuration
// 0x12 - for 128 x 64 version
// 0x02 - for 128 x 32 version
1, SSD1306_SET_CONTRAST, 0x7F, // 0x81, 0x7F - reset value (max 0xFF) 1, SSD1306_SET_CONTRAST, 0x7F, // 0x81, 0x7F - reset value (max 0xFF)
0, SSD1306_DIS_ENT_DISP_ON, // 0xA4 0, SSD1306_DIS_ENT_DISP_ON, // 0xA4
0, SSD1306_DIS_NORMAL, // 0xA6 0, SSD1306_DIS_NORMAL, // 0xA6
@ -138,7 +142,7 @@ unsigned short int _indexPage = START_PAGE_ADDR; // @var global
uint8_t SSD1306_Init (void) uint8_t SSD1306_Init (void)
{ {
const uint8_t *commands = INIT_SSD1306; // variables const uint8_t *commands = INIT_SSD1306; // variables
unsigned short int no_of_commands = pgm_read_byte(commands++); // number of commands uint8_t no_of_commands = pgm_read_byte(commands++); // number of commands
uint8_t no_of_arguments; // number od arguments uint8_t no_of_arguments; // number od arguments
uint8_t command; // command uint8_t command; // command
uint8_t status = INIT_STATUS; // TWI init status 0xFF uint8_t status = INIT_STATUS; // TWI init status 0xFF
@ -514,41 +518,57 @@ uint8_t SSD1306_DrawString (char *str)
*/ */
uint8_t SSD1306_DrawPixel (uint8_t x, uint8_t y) uint8_t SSD1306_DrawPixel (uint8_t x, uint8_t y)
{ {
uint8_t page = 0; // page uint8_t page = y >> 3; // find page (y / 8)
uint8_t pixel = 0; // pixel uint8_t pixel = 1 << (y - (page << 3)); // which pixel (y % 8)
uint8_t status = INIT_STATUS; // TWI init status 0xFF uint8_t status = INIT_STATUS; // TWI init status 0xFF
if ((x > MAX_X) && (y > MAX_Y)) { // if out of range if ((x > MAX_X) || (y > MAX_Y)) { // if out of range
return SSD1306_ERROR; // error return SSD1306_ERROR; // error
} }
page = y >> 3; // find page (y / 8)
pixel = 1 << (y - (page << 3)); // which pixel (y % 8)
<<<<<<< HEAD
// set position
// -------------------------------------------------------------------------------------
status = SSD1306_SetPosition (x, page); // update position
if (SSD1306_SUCCESS != status) { // check status
return status; // error
=======
// set position
// -------------------------------------------------------------------------------------
status = SSD1306_SetPosition (x, page); // update position
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
// TWI start & SLAW // TWI start & SLAW
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
if (SSD1306_SUCCESS != status) { // check status if (SSD1306_SUCCESS != status) { // check status
return status; // error 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 (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
}
// 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
}
// 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); // send data 0xC0
if (SSD1306_SUCCESS != status) { // check status if (SSD1306_SUCCESS != status) { // check status
return status; // error return status; // error
} }
@ -566,6 +586,162 @@ uint8_t SSD1306_DrawPixel (uint8_t x, uint8_t y)
return SSD1306_SUCCESS; // success return SSD1306_SUCCESS; // success
} }
/**
* @desc Send Same Bytes
*
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_SendBytes (uint8_t byte, uint8_t length)
{
uint8_t status = INIT_STATUS; // TWI init status 0xFF
uint16_t i = 0; // counter
// TWI start & SLAW
// -------------------------------------------------------------------------------------
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
// 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 character byte to memory lcd
// -------------------------------------------------------------------------------------
while (i < length) {
status = TWI_MT_Send_Data (byte); // send data col
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
i++; // update counter
}
// TWI stop
// -------------------------------------------------------------------------------------
TWI_Stop ();
return SSD1306_SUCCESS; // success
}
/**
* @desc Draw line horizontal
*
* @param uint8_t
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_DrawLineHorz (uint8_t y, uint8_t x1, uint8_t x2)
{
uint8_t status = INIT_STATUS; // TWI init status 0xFF
uint16_t i = 0; // counter
uint8_t j = 0; // counter
uint8_t page = y >> 3; // page
uint8_t pixel = 1 << (y - (page << 3)); // pixel
uint8_t ram[RAM_Y_END][RAM_X_END];
while (i < RAM_Y_END) {
if (i == page) {
memset (ram[i], pixel, RAM_X_END);
} else {
memset (ram[i], 0x00, RAM_X_END);
}
i++;
}
// 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 (0);
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
// end COLUMN
status = SSD1306_Send_Command (127);
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
// 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 (0);
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
// end PAGE
status = SSD1306_Send_Command (3);
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
// 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
}
i = 0;
j = 0;
// send pixels
// -------------------------------------------------------------------------------------
while (i < RAM_Y_END) {
while (j < RAM_X_END) {
status = TWI_MT_Send_Data (ram[i][j]); // send data col
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
j++;
}
j = 0;
i++;
}
// TWI stop
// -------------------------------------------------------------------------------------
TWI_Stop ();
return SSD1306_SUCCESS; // success return
}
/**
* @desc Draw line vertical
*
* @param uint8_t
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_DrawLineVert (uint8_t x, uint8_t y1, uint8_t y2)
{
return SSD1306_SUCCESS; // success
}
/** /**
* @desc Draw line by Bresenham algoritm * @desc Draw line by Bresenham algoritm
* *
@ -578,22 +754,24 @@ uint8_t SSD1306_DrawPixel (uint8_t x, uint8_t y)
*/ */
uint8_t SSD1306_DrawLine (uint8_t x1, uint8_t x2, uint8_t y1, uint8_t y2) uint8_t SSD1306_DrawLine (uint8_t x1, uint8_t x2, uint8_t y1, uint8_t y2)
{ {
uint8_t status = INIT_STATUS; // TWI init status 0xFF
int16_t D; // determinant int16_t D; // determinant
int16_t delta_x, delta_y; // deltas int16_t delta_x, delta_y; // deltas
int16_t trace_x = 1, trace_y = 1; // steps int16_t trace_x = 1, trace_y = 1; // steps
if ((x1 > MAX_X) || (y1 > MAX_Y) ||
(x2 > MAX_X) || (y2 > MAX_Y) ) { // out of range?
return SSD1306_ERROR; // error
}
if ((x1 > x2) || (y1 > y2) ) { // start point first?
return SSD1306_ERROR; // error
}
delta_x = x2 - x1; // delta x delta_x = x2 - x1; // delta x
delta_y = y2 - y1; // delta y delta_y = y2 - y1; // delta y
// Vertical line
// -------------------------------------------------------------------------------------
if (delta_x == 0) {
status = SSD1306_DrawLineVert (x1, y1, y2); // draw vertical line
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
return SSD1306_SUCCESS; // success return
}
// Horizontal line // Horizontal line
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
if (delta_y == 0) { if (delta_y == 0) {
@ -604,38 +782,6 @@ uint8_t SSD1306_DrawLine (uint8_t x1, uint8_t x2, uint8_t y1, uint8_t y2)
return SSD1306_SUCCESS; // success return return SSD1306_SUCCESS; // success return
} }
if (delta_x < 0) { // check if x2 > x1
delta_x = -delta_x; // negate delta x
trace_x = -trace_x; // negate step x
>>>>>>> origin/develop
}
// TWI start & SLAW
// -------------------------------------------------------------------------------------
status = SSD1306_Send_StartAndSLAW (SSD1306_ADDR); // start & SLAW
if (SSD1306_SUCCESS != status) { // check status
return status; // error
}
<<<<<<< HEAD
// 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
// -------------------------------------------------------------------------------------
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
=======
// condition for m < 1 (dy < dx) // condition for m < 1 (dy < dx)
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
if (delta_y < delta_x) { // if (delta_y < delta_x) { //
@ -667,5 +813,4 @@ uint8_t SSD1306_DrawLine (uint8_t x1, uint8_t x2, uint8_t y1, uint8_t y2)
} }
return SSD1306_SUCCESS; // success return return SSD1306_SUCCESS; // success return
>>>>>>> origin/develop
} }

View File

@ -83,14 +83,17 @@
// AREA definition // AREA definition
// ----------------------------------- // -----------------------------------
#define START_PAGE_ADDR 0 #define START_PAGE_ADDR 0
#define END_PAGE_ADDR 7 #define END_PAGE_ADDR 3 // 3 for 128 x 32 version
//#define END_PAGE_ADDR 7 // 7 for 128 x 64 version
#define START_COLUMN_ADDR 0 #define START_COLUMN_ADDR 0
#define END_COLUMN_ADDR 127 #define END_COLUMN_ADDR 127
#define RAM_X_END END_COLUMN_ADDR + 1
#define RAM_Y_END END_PAGE_ADDR + 1
#define CACHE_SIZE_MEM (1 + END_PAGE_ADDR) * (1 + END_COLUMN_ADDR) #define CACHE_SIZE_MEM (1 + END_PAGE_ADDR) * (1 + END_COLUMN_ADDR)
#define MAX_X END_COLUMN_ADDR #define MAX_X END_COLUMN_ADDR
#define MAX_Y (END_PAGE_ADDR+1)*8 #define MAX_Y (END_PAGE_ADDR + 1) * 8
// @var set area // @var set area
unsigned int _counter; unsigned int _counter;
@ -196,6 +199,16 @@
*/ */
uint8_t SSD1306_DrawPixel (uint8_t, uint8_t); uint8_t SSD1306_DrawPixel (uint8_t, uint8_t);
/**
* @desc Send Same Bytes
*
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_SendBytes (uint8_t, uint8_t);
/** /**
* @desc Draw line * @desc Draw line
* *
@ -208,4 +221,26 @@
*/ */
uint8_t SSD1306_DrawLine (uint8_t, uint8_t, uint8_t, uint8_t); uint8_t SSD1306_DrawLine (uint8_t, uint8_t, uint8_t, uint8_t);
/**
* @desc Draw line horizontal
*
* @param uint8_t
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_DrawLineHorz (uint8_t, uint8_t, uint8_t);
/**
* @desc Draw line vertical
*
* @param uint8_t
* @param uint8_t
* @param uint8_t
*
* @return uint8_t
*/
uint8_t SSD1306_DrawLineVert (uint8_t, uint8_t, uint8_t);
#endif #endif

View File

@ -128,7 +128,7 @@
* *
* @return void * @return void
*/ */
void TWI_Init(void); void TWI_Init (void);
/** /**
* @desc TWI MT Start * @desc TWI MT Start
@ -137,7 +137,7 @@
* *
* @return char * @return char
*/ */
char TWI_MT_Start(void); char TWI_MT_Start (void);
/** /**
* @desc TWI Send SLAW * @desc TWI Send SLAW
@ -146,7 +146,7 @@
* *
* @return unsigned char * @return unsigned char
*/ */
char TWI_MT_Send_SLAW(char); char TWI_MT_Send_SLAW (char);
/** /**
* @desc TWI Send data * @desc TWI Send data
@ -155,7 +155,7 @@
* *
* @return char * @return char
*/ */
char TWI_MT_Send_Data(char); char TWI_MT_Send_Data (char);
/** /**
* @desc TWI Send SLAR * @desc TWI Send SLAR
@ -164,7 +164,7 @@
* *
* @return unsigned char * @return unsigned char
*/ */
char TWI_MR_Send_SLAR(char); char TWI_MR_Send_SLAR (char);
/** /**
* @desc TWI stop * @desc TWI stop
@ -173,6 +173,6 @@
* *
* @return void * @return void
*/ */
void TWI_Stop(void); void TWI_Stop (void);
#endif #endif

40
main.c
View File

@ -1,7 +1,7 @@
/** /**
* ---------------------------------------------------------------+ * --------------------------------------------------------------------------------------+
* @desc OLED SSD1306 example * @desc OLED SSD1306 example
* ---------------------------------------------------------------+ * --------------------------------------------------------------------------------------+
* 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)
* *
@ -13,17 +13,16 @@
* @tested AVR Atmega328p * @tested AVR Atmega328p
* *
* @depend ssd1306.h * @depend ssd1306.h
* ---------------------------------------------------------------+ * --------------------------------------------------------------------------------------+
* @descr Version 1.0 -> applicable for 1 display * @descr Version 1.0 -> applicable for 1 display
* Version 2.0 -> rebuild to 'cacheMemLcd' array * Version 2.0 -> rebuild to 'cacheMemLcd' array
* Version 3.0 -> remove 'cacheMemLcd' * Version 3.0 -> less RAM requirement but with few limitation
* ---------------------------------------------------------------+ * --------------------------------------------------------------------------------------+
*/ */
// include libraries // include libraries
#include "lib/ssd1306.h" #include "lib/ssd1306.h"
#include <util/delay.h> #include <util/delay.h>
#include <stdio.h>
/** /**
* @desc Main function * @desc Main function
@ -34,22 +33,35 @@
*/ */
int main(void) int main(void)
{ {
/* uint8_t i = 0;
uint8_t x = 0;
uint8_t y = 0;
*/
// init ssd1306 // init ssd1306
SSD1306_Init (); SSD1306_Init ();
// clear screen // clear screen
SSD1306_ClearScreen (); SSD1306_ClearScreen ();
// draw string // draw string
SSD1306_DrawString ("SSD1306 MATIASUS"); // SSD1306_DrawString ("SSD1306 MATIASUS Copyright (C) 2020 Marian Hrinko. Copyright (C) 2020 Marian Hrinko. Copyright (C) 2020 Marian Hrinko.");
/* /*
while (x < 10) { while (x < MAX_Y) {
SSD1306_DrawLine (x,x,0,y++);
SSD1306_DrawPixel (x++,y++); x++;
} }
*/ */
//SSD1306_DrawLine (0,MAX_X,1,1);
//SSD1306_DrawLine (5,5,0,7);
//SSD1306_DrawLine (7,7,2,7);
//SSD1306_DrawLine (0,MAX_X,20,20);
//SSD1306_DrawLine (9,9,0,9);
//SSD1306_DrawLine (0,MAX_X,20,20);
//SSD1306_DrawLineHorz (1,0,MAX_X);
//SSD1306_DrawLineHorz (10,0,MAX_X);
while (i < MAX_Y) {
SSD1306_DrawLine (0,MAX_X,i,i);
_delay_ms (100);
i++;
}
// return value // return value
return 0; return 0;
} }