void ssd1306_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR c) { int16_t f = 1 - r; int16_t ddF_x = 1; int16_t ddF_y = -2 * r; int16_t x = 0; int16_t y = r; ssd1306_DrawPixel(x0, y0 + r, c); ssd1306_DrawPixel(x0, y0 - r, c); ssd1306_DrawPixel(x0 + r, y0, c); ssd1306_DrawPixel(x0 - r, y0, c); ssd1306_DrawLine(x0 - r, y0, x0 + r, y0, c); while (x < y) { if (f >= 0) { y--; ddF_y += 2; f += ddF_y; } x++; ddF_x += 2; f += ddF_x; ssd1306_DrawLine(x0 - x, y0 + y, x0 + x, y0 + y, c); ssd1306_DrawLine(x0 + x, y0 - y, x0 - x, y0 - y, c); ssd1306_DrawLine(x0 + y, y0 + x, x0 - y, y0 + x, c); ssd1306_DrawLine(x0 + y, y0 - x, x0 - y, y0 - x, c); } }
// // Draw 1 char to the screen buffer // ch => char om weg te schrijven // Font => Font waarmee we gaan schrijven // color => Black or White // char ssd1306_WriteChar(char ch, FontDef Font, SSD1306_COLOR color) { uint32_t i, b, j; // Check remaining space on current line if (SSD1306_WIDTH <= (SSD1306.CurrentX + Font.FontWidth) || SSD1306_HEIGHT <= (SSD1306.CurrentY + Font.FontHeight)) { // Not enough space on current line return 0; } // Use the font to write for (i = 0; i < Font.FontHeight; i++) { b = Font.data[(ch - 32) * Font.FontHeight + i]; for (j = 0; j < Font.FontWidth; j++) { if ((b << j) & 0x8000) { ssd1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR) color); } else { ssd1306_DrawPixel(SSD1306.CurrentX + j, (SSD1306.CurrentY + i), (SSD1306_COLOR)!color); } } } // The current space is now taken SSD1306.CurrentX += Font.FontWidth; // Return written char for validation return ch; }
void ssd1306_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, SSD1306_COLOR c) { int16_t dx, dy, sx, sy, err, e2, i, tmp; /* Check for overflow */ if (x0 >= SSD1306_WIDTH) { x0 = SSD1306_WIDTH - 1; } if (x1 >= SSD1306_WIDTH) { x1 = SSD1306_WIDTH - 1; } if (y0 >= SSD1306_HEIGHT) { y0 = SSD1306_HEIGHT - 1; } if (y1 >= SSD1306_HEIGHT) { y1 = SSD1306_HEIGHT - 1; } dx = (x0 < x1) ? (x1 - x0) : (x0 - x1); dy = (y0 < y1) ? (y1 - y0) : (y0 - y1); sx = (x0 < x1) ? 1 : -1; sy = (y0 < y1) ? 1 : -1; err = ((dx > dy) ? dx : -dy) / 2; if (dx == 0) { if (y1 < y0) { tmp = y1; y1 = y0; y0 = tmp; } if (x1 < x0) { tmp = x1; x1 = x0; x0 = tmp; } /* Vertical line */ for (i = y0; i <= y1; i++) { ssd1306_DrawPixel(x0, i, c); } /* Return from function */ return; } if (dy == 0) { if (y1 < y0) { tmp = y1; y1 = y0; y0 = tmp; } if (x1 < x0) { tmp = x1; x1 = x0; x0 = tmp; } /* Horizontal line */ for (i = x0; i <= x1; i++) { ssd1306_DrawPixel(i, y0, c); } /* Return from function */ return; } while (1) { ssd1306_DrawPixel(x0, y0, c); if (x0 == x1 && y0 == y1) { break; } e2 = err; if (e2 > -dx) { err -= dy; x0 += sx; } if (e2 < dy) { err += dx; y0 += sy; } } }