SG12864A
Dependents: SG12864A_TestProgram
Revision 3:86e7fba29623, committed 2010-07-20
- Comitter:
- shintamainjp
- Date:
- Tue Jul 20 07:23:15 2010 +0000
- Parent:
- 2:91c03e41c927
- Child:
- 4:200d1ea4e76e
- Commit message:
Changed in this revision
--- a/SG12864A.cpp Tue Jul 20 05:30:47 2010 +0000 +++ b/SG12864A.cpp Tue Jul 20 07:23:15 2010 +0000 @@ -159,13 +159,17 @@ void SG12864A::bufferPull(void) { } -void SG12864A::bufferClear(void) { +void SG12864A::bufferClear(bool reverse) { for (int i = 0; i < sizeof(buffer); i++) { - buffer[i] = 0x00; + if (reverse) { + buffer[i] = 0xFF; + } else { + buffer[i] = 0x00; + } } } -void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { +void SG12864A::bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) { /* * Bresenham's line algorithm */ @@ -190,9 +194,17 @@ } for (int x = x1; x <= x2; x++) { if (steep) { - setPixel(y,x); + if (reverse) { + unsetPixel(y, x); + } else { + setPixel(y, x); + } } else { - setPixel(x,y); + if (reverse) { + unsetPixel(x, y); + } else { + setPixel(x, y); + } } error = error - deltay; if (error < 0) { @@ -202,45 +214,67 @@ } } -void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { +void SG12864A::bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) { for (int x = x1; x <= x2; x++) { - setPixel(x, y1); - setPixel(x, y2); + if (reverse) { + unsetPixel(x, y1); + unsetPixel(x, y2); + } else { + setPixel(x, y1); + setPixel(x, y2); + } } for (int y = y1; y <= y2; y++) { - setPixel(x1, y); - setPixel(x2, y); - } -} - -void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { - for (int x = x1; x <= x2; x++) { - for (int y = y1; y <= y2; y++) { - setPixel(x, y); + if (reverse) { + unsetPixel(x1, y); + unsetPixel(x2, y); + } else { + setPixel(x1, y); + setPixel(x2, y); } } } -void SG12864A::bufferDrawString(const uint8_t x, const uint8_t y, const char * str) { - char *p = (char *)str; +void SG12864A::bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse) { + for (int x = x1; x <= x2; x++) { + for (int y = y1; y <= y2; y++) { + if (reverse) { + unsetPixel(x, y); + } else { + setPixel(x, y); + } + } + } +} + +void SG12864A::bufferDrawString(uint8_t x, uint8_t y, char * str, bool reverse) { + char *p = str; int cnt = 0; while (*p) { - bufferDrawChar(x + (FONT_X * cnt), y, *p); + bufferDrawChar(x + (FONT_X * cnt), y, *p, reverse); p++; cnt++; } } -void SG12864A::bufferDrawChar(const uint8_t x, const uint8_t y, const char c) { +void SG12864A::bufferDrawChar(uint8_t x, uint8_t y, char c, bool reverse) { if ((FONT_MIN_CODE <= c) &&(c <= FONT_MAX_CODE)) { int aofs = (c - FONT_MIN_CODE) * FONT_X; for (int i = 0; i < FONT_X; i++) { uint8_t pat = font5x7_data[aofs + i]; for (int j = 0; j < FONT_Y; j++) { if (pat & (1 << j)) { - setPixel(x + i, y + j); + if (reverse) { + unsetPixel(x + i, y + j); + } else { + setPixel(x + i, y + j); + } } else { - unsetPixel(x + i, y + j); + if (reverse) { + setPixel(x + i, y + j); + } else { + unsetPixel(x + i, y + j); + } } } } @@ -249,15 +283,42 @@ uint8_t pat = (i % 2) ? 0x55 : 0xAA; for (int j = 0; j < FONT_Y; j++) { if (pat & (1 << j)) { - setPixel(x + i, y + j); + if (reverse) { + unsetPixel(x + i, y + j); + } else { + setPixel(x + i, y + j); + } } else { - unsetPixel(x + i, y + j); + if (reverse) { + setPixel(x + i, y + j); + } else { + unsetPixel(x + i, y + j); + } } } } } } +void SG12864A::bufferDrawCheckbox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool state, bool reverse) { + bufferDrawBox(x1, y1, x2, y2, reverse); + if (state) { + bufferDrawLine(x1, y1, x2, y2, reverse); + bufferDrawLine(x1, y2, x2, y1, reverse); + } +} + +void SG12864A::bufferDrawProgressbar(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, int min, int max, int value, bool horizontal, bool reverse) { + bufferDrawBox(x1, y1, x2, y2, reverse); + if ((value < min) || (max < value)) { + return; + } + int tmp_max = max - min; + int tmp_val = value - min; + int pix = ((x2 - x1) * tmp_val) / tmp_max; + bufferFillBox(x1 + 1, y1 + 1, x1 + pix - 1, y2 - 1, reverse); +} + /** * High Level Interface. *
--- a/SG12864A.h Tue Jul 20 05:30:47 2010 +0000 +++ b/SG12864A.h Tue Jul 20 07:23:15 2010 +0000 @@ -34,18 +34,30 @@ CS1, CS2 }; + + /* + * High Level Interfaces. (Abstracted) + */ void bufferPush(void); void bufferPull(void); - void bufferClear(void); - void bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); - void bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); - void bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); - void bufferDrawString(const uint8_t x, const uint8_t y, const char * str); - void bufferDrawChar(const uint8_t x, const uint8_t y, const char c); + void bufferClear(bool reverse = false); + void bufferDrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse = false); + void bufferDrawBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse = false); + void bufferFillBox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool reverse = false); + void bufferDrawString(uint8_t x, uint8_t y, char * str, bool reverse = false); + void bufferDrawChar(uint8_t x, uint8_t y, char c, bool reverse = false); + void bufferDrawCheckbox(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, bool state, bool reverse = false); + void bufferDrawProgressbar(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, int min, int max, int value, bool horizontal = true, bool reverse = false); + /* + * High Level Interfaces. + */ void reset(void); void clear(void); + /* + * Middle Level Interfaces. + */ void setDisplayOnOff(Target t, bool on); void setDisplayStartLine(Target t, uint8_t displayStartLine); void setPageAddress(Target t, uint8_t addr); @@ -75,6 +87,10 @@ Data, Instruction }; + + /* + * Low Level Interfaces. + */ void setDirectionToRead(); void setDirectionToWrite(); void write(Target t, Mode m, uint8_t c);
--- a/main.cpp Tue Jul 20 05:30:47 2010 +0000 +++ b/main.cpp Tue Jul 20 07:23:15 2010 +0000 @@ -41,28 +41,73 @@ #else lcd.clear(); lcd.reset(); + bool reverse = false; while (1) { // - lcd.bufferClear(); - lcd.bufferDrawLine(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1); - lcd.bufferDrawLine(0, SG12864A::PIXEL_Y - 1, SG12864A::PIXEL_X - 1, 0); - lcd.bufferDrawString(1, 1, "This is a test #1.\b"); + lcd.bufferClear(reverse); + lcd.bufferDrawLine(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1, reverse); + lcd.bufferDrawLine(0, SG12864A::PIXEL_Y - 1, SG12864A::PIXEL_X - 1, 0, reverse); + lcd.bufferDrawString(1, 1, "This is a test #1.\b", reverse); + lcd.bufferDrawCheckbox(50, 50, 60, 60, true, reverse); lcd.bufferPush(); wait_ms(1000); // - lcd.bufferClear(); - lcd.bufferDrawBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1); - lcd.bufferDrawString(1, 2, "This is a test #2.\b"); + lcd.bufferClear(reverse); + lcd.bufferDrawBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1, reverse); + lcd.bufferDrawString(1, 2, "This is a test #2.\b", reverse); + lcd.bufferDrawCheckbox(50, 50, 60, 60, false, reverse); lcd.bufferPush(); wait_ms(1000); +#if 0 // - lcd.bufferClear(); - lcd.bufferFillBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1); - lcd.bufferDrawString(1, 3, "This is a test #3.\b"); + lcd.bufferClear(reverse); + lcd.bufferFillBox(0, 0, SG12864A::PIXEL_X - 1, SG12864A::PIXEL_Y - 1, reverse); + lcd.bufferDrawString(1, 3, "This is a test #3.\b", reverse); + lcd.bufferDrawCheckbox(50, 50, 60, 60, true, reverse); lcd.bufferPush(); wait_ms(1000); +#endif + + // + { + lcd.bufferClear(reverse); + int min = 0; + int max = 100; + for (int i = min; i <= max; i++) { + lcd.bufferDrawProgressbar(10, 10, 118, 20, min, max, i, true, reverse); + lcd.bufferPush(); + wait_ms(2); + } + } + + // + { + lcd.bufferClear(reverse); + int min = -100; + int max = 100; + for (int i = min; i <= max; i++) { + lcd.bufferDrawProgressbar(10, 10, 118, 20, min, max, i, true, reverse); + lcd.bufferPush(); + wait_ms(2); + } + } + + // + { + lcd.bufferClear(reverse); + int min = 100; + int max = 600; + for (int i = min; i <= max; i++) { + lcd.bufferDrawProgressbar(10, 10, 118, 20, min, max, i, true, reverse); + lcd.bufferPush(); + wait_ms(2); + } + } + + // + reverse = !reverse; } #endif }