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.
Diff: main.cpp
- Revision:
- 0:deb92489beec
- Child:
- 1:414748809a35
diff -r 000000000000 -r deb92489beec main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Fri Jun 19 06:04:06 2015 +0000
@@ -0,0 +1,463 @@
+#include "mbed.h"
+#include "ssd1306.h"
+#include "FontPack.h"
+#include "icons.h"
+#include "CourierNew5x7.h"
+#include "CourierNew_14x15.h" //whatever.
+
+DigitalOut dc(D9); //D/C
+DigitalOut rs(D8); //RES (keep high)
+DigitalOut cs(D7); //CS (active low)
+
+SPI spi(SPI_MOSI,SPI_MISO,SPI_SCK);
+
+int main() {
+
+ spi.frequency(8e6); //8MHz spi. This is fast enough for 88KHz 16 bit sampling.
+ spi.format(8,0); //16 bit. clock polarity 0, phase 0.
+ wait(.1);
+
+ rs.write(1);
+ wait(.1);
+
+ SSD1306Init();
+ clearScreen();
+
+ wait(.1);
+
+ circleDraw(20,40,10);
+ circleDraw(40,20,30);
+ stringDraw(2, 40, "D A N");
+ stringDraw(4, 40, "mad scientist");
+
+
+ while(1) {
+ }
+}
+
+
+
+
+
+
+//bunch of shit below..
+
+char SSD1306_init[] = {
+ SSD1306_DISPLAYOFF,
+ SSD1306_SETLOWCOLUMN,
+ SSD1306_SETHIGHCOLUMN,
+ SSD1306_SETSTARTLINE,
+ SSD1306_SETCONTRAST,
+ 0xcf,
+ SSD1306_SEGREMAP,
+ SSD1306_NORMALDISPLAY,
+ SSD1306_SETMULTIPLEX,
+ 0x3f,
+ SSD1306_SETDISPLAYOFFSET,
+ 0x00,
+ SSD1306_SETDISPLAYCLOCKDIV,
+ 0x80,
+ SSD1306_SETPRECHARGE,
+ 0xf1,
+ SSD1306_SETCOMPINS,
+ 0x12,
+ SSD1306_SETVCOMDETECT,
+ 0x40,
+ SSD1306_CHARGEPUMP,
+ 0x14,
+ SSD1306_DISPLAYON
+};
+
+void SSD1306Init(void){
+ cs.write(1);
+ dc.write(0);
+ rs.write(0);
+ rs.write(1);
+ SSD1306SendCommand(SSD1306_init, sizeof SSD1306_init);
+}
+
+void SSD1306SendCommand(char *data, int i){
+ cs.write(1);
+ dc.write(0); //data/command low for command.
+ cs.write(0);
+ while(i){
+ spi.write(*data);
+ data++;
+ i--;
+ }
+ cs.write(1);
+}
+
+void SSD1306SendData(char *data, int i){
+ cs.write(1);
+ dc.write(1); //data/command high for data.
+ cs.write(0);
+ while(i){
+ spi.write(*data);
+ data++;
+ i--;
+ }
+ cs.write(1);
+}
+
+void setAddress( char page, char column )
+{
+
+ char pageAddress[] = {SSD1306_PAGE_START_ADDRESS};
+ char columnAddress[] = { SSD1306_COLUMNADDRESS, SSD1306_COLUMNADDRESS_MSB, SSD1306_COLUMNADDRESS_LSB };
+
+ if (page > SSD1306_MAXROWS)
+ {
+ page = SSD1306_MAXROWS;
+ }
+
+ if (column > SSD1306_LCDWIDTH)
+ {
+ column = SSD1306_LCDWIDTH;
+ }
+
+ pageAddress[0] = SSD1306_PAGE_START_ADDRESS | (SSD1306_MAXROWS - page);
+
+ columnAddress[0] = SSD1306_COLUMNADDRESS;
+ columnAddress[1] = SSD1306_COLUMNADDRESS_MSB | column;
+ columnAddress[2] = SSD1306_COLUMNADDRESS_LSB;
+
+ //__no_operation();
+
+ SSD1306SendCommand(pageAddress, 1);
+ SSD1306SendCommand(columnAddress, 3);
+
+}
+
+void clearScreen(void)
+{
+ char ramData[] = {0x00};
+
+ char i,j;
+
+ for(i=0; i < 8 ;i++)
+ {
+ setAddress(i,0);
+
+ for(j=0; j < SSD1306_LCDWIDTH; j++)
+ {
+ SSD1306SendData(ramData, 1);
+ }
+ }
+}
+
+void charDraw(char row, char column, int data)
+{
+ int h;
+
+ if (row > SSD1306_MAXROWS)
+ {
+ row = SSD1306_MAXROWS;
+ }
+
+ if (column > SSD1306_LCDWIDTH)
+ {
+ column = SSD1306_LCDWIDTH;
+ }
+
+ if ( data < 32 || data > 129 )
+ {
+ data = '.';
+ }
+
+ h = (data - 32) * 6;
+
+ setAddress(row, column);
+ SSD1306SendData( (char *)FONT6x8 + h, 6 );
+
+}
+
+void stringDraw( char row, char column, char *word)
+{
+ char a = 0;
+
+ if (row > SSD1306_MAXROWS)
+ {
+ row = SSD1306_MAXROWS;
+ }
+
+ if (column > SSD1306_LCDWIDTH)
+ {
+ column = SSD1306_LCDWIDTH;
+ }
+
+ while (word[a] != 0)
+ {
+ if (word[a] != 0x0A)
+ {
+ if (word[a] != 0x0D)
+ {
+ charDraw(row, column, word[a]);
+
+ //__no_operation();
+
+ column += 6;
+
+ if (column >= (SSD1306_LCDWIDTH - 6 ))
+ {
+ column = 0;
+ if ( row < SSD1306_MAXROWS )
+ row++;
+ else
+ row = 0;
+ }
+
+ }
+ else
+ {
+ if ( row < SSD1306_MAXROWS )
+ row++;
+ else
+ row = 0;
+ column = 0;
+ }
+ a++;
+ }
+ }
+}
+
+void pixelDraw(char x, char y)
+{
+ char page, temp;
+ char coordinate[] = {0x00};
+
+ if (x > SSD1306_LCDWIDTH - 1)
+ {
+ x = SSD1306_LCDWIDTH - 1;
+ }
+
+ if (y > SSD1306_LCDHEIGHT - 1)
+ {
+ y = SSD1306_LCDHEIGHT - 1;
+ }
+
+ page = y / 8;
+ temp = 0x80 >> (y % 8);
+ coordinate[0] = temp;
+
+ setAddress(page,x);
+ SSD1306SendData(coordinate, 1);
+
+}
+
+
+void horizontalLine(char xStart, char xStop, char y)
+{
+ char temp = 0;
+ char page, a;
+ char ramData[] = { 0x00 };
+
+ if (xStart > SSD1306_LCDWIDTH - 1)
+ {
+ xStart = SSD1306_LCDWIDTH - 1;
+ }
+
+ if (xStop > SSD1306_LCDWIDTH - 1)
+ {
+ xStop = SSD1306_LCDWIDTH - 1;
+ }
+
+ if (y > SSD1306_LCDHEIGHT - 1)
+ {
+ y = SSD1306_LCDHEIGHT - 1;
+ }
+
+ if (xStart > xStop)
+ {
+ temp = xStart;
+ xStart = xStop;
+ xStop = temp;
+ }
+
+ page = y / 8;
+ temp = 0x80 >> (y %8);
+
+ a = xStart;
+ ramData[0] = temp;
+
+ setAddress(page, xStart);
+
+ while (a <= xStop)
+ {
+ SSD1306SendData(ramData, 1);
+ a++;
+ }
+}
+
+void verticalLine(char x, char yStart, char yStop)
+{
+ char temp1 = 0, temp2 = 0;
+ char page1, page2, pageStart;
+ char a;
+ char ramData1[] = {0x00};
+ char ramData2[] = {0x00};
+
+ if (x > SSD1306_LCDWIDTH - 1)
+ {
+ x = SSD1306_LCDWIDTH - 1;
+ }
+
+ if (yStart > SSD1306_LCDHEIGHT - 1)
+ {
+ yStart = SSD1306_LCDHEIGHT - 1;
+ }
+
+ if (yStop > SSD1306_LCDHEIGHT - 1)
+ {
+ yStop = SSD1306_LCDHEIGHT - 1;
+ }
+
+ if (yStart > yStop)
+ {
+ temp1 = yStart;
+ yStart = yStop;
+ yStop = temp1;
+ }
+
+ page1 = yStart / 8;
+ page2 = yStop / 8;
+ pageStart = yStart % 8;
+
+ if (page1 != page2)
+ {
+ if ( pageStart > 0)
+ {
+ temp1 = 0xFF00 >> pageStart;
+ temp1 = temp1 ^ 0xFF;
+ }
+ else
+ {
+ temp1 = 0xFF;
+ }
+ }
+ else
+ {
+ temp1 = 0;
+
+ a = yStart - (page1 * 8);
+ a = 0xFF00 >> a;
+ temp2 = temp2 ^ a;
+ }
+
+ ramData1[0] = temp1;
+
+ setAddress(page1,x);
+ SSD1306SendData(ramData1, 1);
+
+ a = page1 + 1;
+ ramData1[0] = 0xFF;
+
+ while (a < page2)
+ {
+ setAddress(a, x);
+ SSD1306SendData(ramData1, 1);
+ a++;
+ }
+
+ temp2 = 8 - (yStop % 8);
+ temp2--;
+ temp2 = 0xFF << temp2;
+
+ ramData2[0] = temp2;
+
+ setAddress(page2, x);
+ SSD1306SendData(ramData2, 1);
+}
+
+void imageDraw(const char IMAGE[], char row, char column)
+{
+ char a, height, width;
+
+ width = IMAGE[0];
+ height = IMAGE[1];
+
+ for ( a = 0; a < height; a++)
+ {
+ setAddress(row + a, column);
+ SSD1306SendData((char *)IMAGE + 2 + a * width, width);
+ }
+}
+
+void circleDraw(register int x, register int y, int r)
+{
+ register int xx = -r;
+ register int yy = 0;
+ register int e = 2 - (2 * r);
+ do {
+ pixelDraw(x - xx, y + yy);
+ pixelDraw(x - yy, y - xx);
+ pixelDraw(x + xx, y - yy);
+ pixelDraw(x + yy, y + xx);
+ if(e > xx) e += ((++xx << 1) + 1);
+ if(e <= yy) e += ((++yy << 1) + 1);
+ } while (xx < 0);
+}
+
+void Fill_RAM( char data )
+{
+ unsigned char i,j;
+
+ char ramData[] = { 0x00};
+
+ ramData[0] = data;
+
+ for(i=0; i < 8 ;i++)
+ {
+ setAddress(i,0);
+
+ for(j=0; j < SSD1306_LCDWIDTH; j++)
+ {
+ SSD1306SendData(ramData, 1);
+ }
+ }
+}
+
+void Fill_RAM_PAGE(unsigned char page, char data)
+{
+ unsigned char j;
+
+ char ramData[] = { 0x00 };
+
+ ramData[0] = data;
+
+ setAddress(page,0);
+
+ for(j=0; j < SSD1306_LCDWIDTH ;j++)
+ {
+ SSD1306SendData(ramData, 1);
+ }
+}
+
+void Set_Contrast_Control(unsigned char d)
+{
+ char ramData[] = {SSD1306_SETCONTRAST, 0x00};
+ ramData[1] = d;
+
+ SSD1306SendCommand(ramData, 2);
+}
+
+void Set_Inverse_Display(unsigned char d)
+{
+ // 0 = normal, 1 = inverted
+
+ char ramData[] = {SSD1306_NORMALDISPLAY};
+ ramData[0] = ramData[0] + d;
+
+ SSD1306SendCommand(ramData, 1);
+}
+
+void Set_Display_On_Off(unsigned char d)
+{
+ // 0 = off, 1 = on
+
+ char ramData[] = {SSD1306_DISPLAYOFF};
+ ramData[0] = ramData[0] + d;
+
+ SSD1306SendCommand(ramData, 1);
+}
+