Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Opensmart_LCD_UC1701
Revision 5:7494bdca926b, committed 2016-12-19
- Comitter:
- Anaesthetix
- Date:
- Mon Dec 19 23:26:17 2016 +0000
- Parent:
- 4:8da4c691643a
- Commit message:
- Added basic drawing functions + buffered versions. More will come soon. Has a minor bug with postioning
Changed in this revision
| UC1701.cpp | Show annotated file Show diff for this revision Revisions of this file |
| UC1701.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/UC1701.cpp Mon Dec 19 14:36:19 2016 +0000
+++ b/UC1701.cpp Mon Dec 19 23:26:17 2016 +0000
@@ -4,7 +4,7 @@
* See http://www.dx.com/p/open-smart-1-8-128-64-lcd-display-breakout-module-w-blue-backlit-444694
*
* Written by: Erik van de Coevering
- * With special thanks to Tim Barr from whom I've reused some code
+ * With thanks to Tim Barr from whom I've reused some code
* Use this code in whatever way you like, as long as it stays free of charge!
*/
@@ -198,4 +198,131 @@
cnt++;
}
}
+}
+
+void UC1701::drawLineHor(char posx, char posy, char height, char width)
+{
+ char page, offset, offset2;
+ char buffer[2] = {0xFF, 0xFF};
+
+ _lcd_cs->write(0);
+ _lcd_cd->write(1);
+
+ if(width+posx > LCDWIDTH) width = (LCDWIDTH-posx); // keep inside display area
+
+ page = posy/8;
+ offset = posy - (page*8);
+ buffer[0] = buffer[0] >> (8-height);
+ buffer[0] = buffer[0] << offset;
+
+ if((offset + height) > 8) {
+ offset2 = ((offset+height)-8);
+ buffer[1] = buffer[1] - (0xFF << (offset2));
+ }
+
+ UC1701::setCursor(posx, page);
+
+ for(int i=0; i<width; i++) _lcd->write(buffer[0]);
+
+ if(buffer[1] != 0xFF && (page+1) < 8) { // only write if line takes up > 1 page & keep inside display area
+ UC1701::setCursor(posx, (page+1));
+ for(int i=0; i<width; i++) _lcd->write(buffer[1]);
+ }
+ _lcd_cs->write(1);
+}
+
+void UC1701::drawLineVert(char posx, char posy, char height, char width)
+{
+ char page, pagecount, offset, offset2;
+
+ _lcd_cs->write(0);
+ _lcd_cd->write(1);
+
+ page = posy/8;
+ pagecount = height/8;
+ offset2 = height - (pagecount*8);
+
+ UC1701::setCursor(posx, page);
+ for(int i=0; i<width; i++) _lcd->write((0xFF>>offset));
+
+ for(; pagecount > 1; pagecount--) {
+ page++;
+ UC1701::setCursor(posx, page);
+ for(int i=0; i<width; i++) _lcd->write(0xFF);
+ }
+
+ UC1701::setCursor(posx, (page+1));
+ for(int i=0; i<width; i++) _lcd->write((0xFF<<offset2));
+
+ _lcd_cs->write(1);
+}
+
+void UC1701::clearBuffer(void)
+{
+ for(int i=0; i<(LCDWIDTH*LCDPAGES); i++) buff[i] = 0;
+}
+
+void UC1701::update(void)
+{
+ int cnt = 0;
+ _lcd_cs->write(0);
+ _lcd_cd->write(1);
+ UC1701::setCursor(0,0);
+ for(int row=0; row<8; row++) {
+ UC1701::setCursor(0, row);
+ for(int column=0; column<128; column++) {
+ _lcd->write(buff[cnt]);
+ cnt++;
+ }
+ }
+ _lcd_cs->write(1);
+}
+
+void UC1701::drawbufferLineHor(char posx, char posy, char height, char width)
+{
+ char page, offset, offset2;
+ int cursor;
+ char buffer[2] = {0xFF, 0xFF};
+
+ if(width+posx > LCDWIDTH) width = (LCDWIDTH-posx); // keep inside display area
+
+ page = posy/8;
+ offset = posy - (page*8);
+ buffer[0] = buffer[0] >> (8-height);
+ buffer[0] = buffer[0] << offset;
+
+ if((offset + height) > 8) {
+ offset2 = ((offset+height)-8);
+ buffer[1] = buffer[1] - (0xFF << (offset2));
+ }
+
+ cursor = posx + (page*128);
+
+ for(int i=0; i<width; i++) UC1701::buff[cursor+i] |= buffer[0];
+
+ if(buffer[1] != 0xFF && (page+1) < 8) { // only write if line takes up > 1 page & keep inside display area
+ for(int i=0; i<width; i++) UC1701::buff[cursor+i+128] |= buffer[1];
+ }
+}
+
+void UC1701::drawbufferLineVert(char posx, char posy, char height, char width)
+{
+ char page, pagecount, offset, offset2;
+ int cursor;
+
+ page = posy/8;
+ pagecount = height/8;
+ offset2 = height - (pagecount*8);
+ cursor = posx + (page*128); // LCDWIDTH
+
+ for(int i=0; i<width; i++) UC1701::buff[cursor+i] |= (0xFF>>offset);
+
+ for(; pagecount > 1; pagecount--) {
+ page++;
+ cursor += 128;
+ for(int i=0; i<width; i++) UC1701::buff[cursor+i] |= 0xFF;
+ }
+
+ cursor += 128;
+ for(int i=0; i<width; i++) UC1701::buff[cursor+i] |= (0xFF >> offset2);
}
\ No newline at end of file
--- a/UC1701.h Mon Dec 19 14:36:19 2016 +0000
+++ b/UC1701.h Mon Dec 19 23:26:17 2016 +0000
@@ -4,7 +4,7 @@
* See http://www.dx.com/p/open-smart-1-8-128-64-lcd-display-breakout-module-w-blue-backlit-444694
*
* Written by: Erik van de Coevering
- * With special thanks to Tim Barr from whom I've reused some code
+ * With thanks to Tim Barr from whom I've reused some code
* Use this code in whatever way you like, as long as it stays free of charge!
*/
@@ -62,6 +62,32 @@
// Draw a 128x64 pixel bitmap
void drawBitmap(const char *data);
+
+ // Draw a horizontal line, start positions / height / width in pixels
+ void drawLineHor(char posx, char posy, char height, char width);
+
+ // Draw a vertical line, start positions / height / width in pixels
+ void drawLineVert(char posx, char posy, char height, char width);
+
+ //-----------------------------------------------------------------------------------------------------------------------------
+ // Functions below are buffered versions; possible to write things on top of each other without clearing pixels (ORs all data).
+ // Use update() to write buffer to LCD.
+ // Clear buffer before writing 1st time (initialize all values)
+ // writetext / drawbitmap will be added soon
+ //-----------------------------------------------------------------------------------------------------------------------------
+
+ // Clear buffer
+ void clearBuffer(void);
+
+ // Write buffer to LCD
+ void update(void);
+
+ // Draw a horizontal line, start positions / height / width in pixels. Buffered version; possible to write things on top of each other
+ // without clearing pixels (ORs all data). Use update() to write buffer to LCD
+ void drawbufferLineHor(char posx, char posy, char height, char width);
+
+ // Draw a vertical line, start positions / height / width in pixels. Buffered version.
+ void drawbufferLineVert(char posx, char posy, char height, char width);
private:
@@ -69,6 +95,7 @@
DigitalOut *_lcd_cs;
DigitalOut *_lcd_cd;
uint8_t _lcdbuffer[LCDWIDTH*LCDPAGES];
+ char buff[LCDWIDTH*LCDPAGES];
};