Test for STM32F4
Fork of ssd1331 by
Revision 3:a4caac512e13, committed 2016-05-12
- Comitter:
- star297
- Date:
- Thu May 12 21:36:11 2016 +0000
- Parent:
- 2:1204274fad8f
- Child:
- 4:062b4708eb35
- Commit message:
- Added slower load from SD card support + some clean up.
Changed in this revision
| ssd1331.cpp | Show annotated file Show diff for this revision Revisions of this file |
| ssd1331.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/ssd1331.cpp Fri May 06 21:40:50 2016 +0000
+++ b/ssd1331.cpp Thu May 12 21:36:11 2016 +0000
@@ -165,8 +165,6 @@
RegWrite(0x80);
RegWrite(0xAF); //display ON
- char_x = 0;
- char_y = 0;
chr_size = NORMAL;
cls();
}
@@ -183,7 +181,7 @@
void ssd1331::cls()
{
- unsigned char cmd[5]= {GAC_CLEAR_WINDOW,0,0,width,height};
+ unsigned char cmd[6]= {GAC_CLEAR_WINDOW,0,0,width,height};
RegWriteM(cmd,5);
wait_us(500);
Maxwindow();
@@ -300,7 +298,7 @@
RegWriteM(cmd, 6);
}
-int ssd1331::toRGB(int R,int G,int B)
+int ssd1331::toRGB(int16_t R,int16_t G,int16_t B)
{
uint16_t c;
c = R >> 3;
@@ -311,7 +309,7 @@
return c;
}
-void ssd1331::rect(int x1,int y1,int x2,int y2,unsigned int colorline)
+void ssd1331::rect(int16_t x1,int16_t y1,int16_t x2,int16_t y2,unsigned int colorline)
{
if ( x1 < 0 ) x1 = 0;
else if ( x1 > width ) x1 = width;
@@ -454,19 +452,21 @@
RegWriteM(cmd,6);
}
-void ssd1331::Bitmap(const uint8_t *bitmap, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) {
+void ssd1331::Bitmap(const uint8_t *bitmap, int16_t x, int16_t y, int16_t w, int16_t h, unsigned char color) {
- int16_t i, j, byteWidth = (w + 7) / 8;
- for(j=0; j<h; j++) {
- for(i=0; i<w; i++ ) {
- if(bitmap[ j * byteWidth + i / 8] & (128 >> (i & 7))) {
- pixel(x+i, y+j, color);
+ window(x, y, w, h);
+ int16_t i, j, byteWidth = (w + 7) / 8;
+ for(j=0; j<h; j++) {
+ for(i=0; i<w; i++ ) {
+ if(bitmap[ j * byteWidth + i / 8] & (128 >> (i & 7))) {
+ pixel(x+i, y+j, color);
+ }
}
}
- }
+ Maxwindow();
}
-void ssd1331::Bitmap16( unsigned int x, unsigned int y, unsigned int w, unsigned int h, unsigned char *bitmap)
+void ssd1331::Bitmap16( int16_t x, int16_t y, int16_t w, int16_t h, unsigned char *bitmap)
{
unsigned int i,j;
int padd;
@@ -489,9 +489,10 @@
bitmap_ptr -= 2*w;
bitmap_ptr -= padd;
}
+ Maxwindow();
}
-int ssd1331::Bitmap16SD( unsigned int x, unsigned int y, unsigned char *Name_BMP)
+int ssd1331::Bitmap16SD( int16_t x, int16_t y, unsigned char *Name_BMP)
{
#define OffsetPixelWidth 18
#define OffsetPixelHeigh 22
@@ -535,8 +536,8 @@
fclose(Image);
return(-3); // to big
}
+
start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
-
// obtain file size:
fseek (Image , 0 , SEEK_END);
@@ -544,25 +545,26 @@
rewind (Image);
// allocate memory to contain the whole file:
- buffer = (char*) malloc (sizeof(char)*fileSize);
- if (buffer == NULL) {return (-4);}
+ buffer = (char*) malloc (sizeof(char)*fileSize/2);
+ if (buffer == NULL) {return (fileSize/2);}
// copy the file into the buffer:
fseek (Image, start_data , SEEK_SET ); // set SD file data start position
result = fread (buffer,1,fileSize,Image);
fclose (Image);
- if (result != fileSize) {return (-5);}
+ if (result != fileSize) {return (-5);}
- unsigned short *bitmap_ptr = (unsigned short *)buffer;
-
- window(x, y, PixelWidth, PixelHeigh);
+ unsigned short *bitmap_ptr = (unsigned short *)buffer;
+
// the lines are padded to multiple of 4 bytes in a bitmap
padd = -1;
do {
padd ++;
} while (2*(PixelWidth + padd)%4 != 0);
-
+
bitmap_ptr += ((PixelHeigh - 1)* (PixelWidth + padd));
+
+ window(x, y, PixelWidth, PixelHeigh);
for (j = 0; j < PixelHeigh; j++) { //Lines
for (i = 0; i < PixelWidth; i++) { // one line
@@ -574,9 +576,80 @@
}
// terminate
free (buffer);
+ Maxwindow();
return (fileSize);
}
+int ssd1331::Bitmap16SD2(int16_t x, int16_t y, unsigned char *Name_BMP) {
+#define OffsetPixelWidth 18
+#define OffsetPixelHeigh 22
+#define OffsetFileSize 34
+#define OffsetPixData 10
+#define OffsetBPP 28
+ char filename[50];
+ unsigned char BMP_Header[54];
+ unsigned short BPP_t;
+ unsigned int PixelWidth,PixelHeigh,start_data;
+ unsigned int i,off;
+ int padd,j;
+ unsigned short *line;
+
+ i=0;
+ while (*Name_BMP!='\0') {
+ filename[i++]=*Name_BMP++;
+ }
+
+ filename[i] = 0;
+ FILE *Image = fopen((const char *)&filename[0], "rb"); // open the bmp file
+ if (!Image) {
+ return(0); // error file not found !
+ }
+
+ fread(&BMP_Header[0],1,54,Image); // get the BMP Header
+
+ if (BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
+ fclose(Image);
+ return(-1); // error no BMP file
+ }
+ BPP_t = BMP_Header[OffsetBPP] + (BMP_Header[OffsetBPP + 1] << 8);
+ if (BPP_t != 0x0010) {
+ fclose(Image);
+ return(-2); // error no 16 bit BMP
+ }
+ PixelHeigh = BMP_Header[OffsetPixelHeigh] + (BMP_Header[OffsetPixelHeigh + 1] << 8) + (BMP_Header[OffsetPixelHeigh + 2] << 16) + (BMP_Header[OffsetPixelHeigh + 3] << 24);
+ PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
+ if (PixelHeigh > height+1 + y || PixelWidth > width+1 + x) {
+ fclose(Image);
+ return(-3); // to big
+ }
+ start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
+
+ line = (unsigned short *) malloc (PixelWidth); // we need a buffer for a line
+ if (line == NULL) {
+ return(-4); // error no memory
+ }
+ // the lines are padded to multiple of 4 bytes
+ padd = -1;
+ do {
+ padd ++;
+ } while ((PixelWidth * 2 + padd)%4 != 0);
+
+ window(x, y,PixelWidth,PixelHeigh);
+
+ for (j = PixelHeigh - 1; j >= 0; j--) { //Lines bottom up
+ off = j * (PixelWidth * 2 + padd) + start_data; // start of line
+ fseek(Image, off ,SEEK_SET);
+ fread(line,1,PixelWidth * 2,Image); // read a line - slow !
+ for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
+ DataWrite_to(line[i]);
+ }
+ }
+ free (line);
+ fclose(Image);
+ Maxwindow();
+ return(PixelWidth);
+}
+
void ssd1331::Copy(int src_x1,int src_y1,int src_x2,int src_y2, int dst_x,int dst_y)
{
unsigned char cmd[8]= { 0 };
@@ -598,7 +671,7 @@
fillrect(0,0,width,height,color,color);
}
-void ssd1331::locate(int column, int row)
+void ssd1331::locate(int16_t column, int16_t row)
{
char_x = column;
char_y = row;
@@ -638,7 +711,7 @@
return c;
}
-void ssd1331::pixel(int x,int y,unsigned int Color)
+void ssd1331::pixel(int16_t x,int16_t y,unsigned int Color)
{
unsigned char cmd[7]= {Set_Column_Address,0x00,0x00,Set_Row_Address,0x00,0x00};
if ((x<0)||(y<0)||(x>width)||(y>height)) return ;
@@ -652,31 +725,34 @@
void ssd1331::Maxwindow()
{
- RegWrite(0x75); /* Set Row Address */
- RegWrite(0); /* Start = 0 */
- RegWrite(0x3F); /* End = 63 */
- RegWrite(0x15); /* Set Column Address */
- RegWrite(0); /* Start = 0 */
- RegWrite(0x5F); /* End = 95 */
+
+ unsigned char cmd[7]= {Set_Column_Address,0x00,0x5F,Set_Row_Address,0x00,0x3F};
+ RegWriteM(cmd, 6);
+ /*
+ RegWrite(0x75); // Set Row Address
+ RegWrite(0); // Start = 0
+ RegWrite(0x3F); // End = 63
+ RegWrite(0x15); // Set Column Address
+ RegWrite(0); // Start = 0
+ RegWrite(0x5F); // End = 95
char_x = 0;
char_y = 0;
+ */
}
-void ssd1331::window(int x, int y, int w, int h)
+void ssd1331::window(int16_t x, int16_t y, int16_t w, int16_t h)
{
_x = x;
_y = y;
// window settings
- _x1 = x;
- _x2 = x + w - 1;
- _y1 = y;
- _y2 = y + h - 1;
- RegWrite(0x75); // Set Row Address
- RegWrite(_y); // Start y
- RegWrite(_y2); // End y
- RegWrite(0x15); // Set Column Address
- RegWrite(_x); // Start = x
- RegWrite(_x2); // End = x
+ _x1 = x; // start y
+ _x2 = x + w - 1; // end x
+ _y1 = y; // start y
+ _y2 = y + h - 1; // end y
+ unsigned char cmd[7]= {Set_Column_Address,0x00,0x00,Set_Row_Address,0x00,0x00};
+ RegWriteM(cmd, 6);
+ unsigned char cmd2[7]= {Set_Column_Address,_x1,_x2,Set_Row_Address,_y1,_y2};
+ RegWriteM(cmd2, 6);
}
void ssd1331::Scrollstart()
@@ -765,3 +841,4 @@
spi.write((unsigned char)(Dat));
CS = 1; // CS dissable
}
+
--- a/ssd1331.h Fri May 06 21:40:50 2016 +0000
+++ b/ssd1331.h Thu May 12 21:36:11 2016 +0000
@@ -87,8 +87,8 @@
oled.circle (20, 60, 40 ,oled.toRGB(255,0,0) , 0); //circle
oled.line( 0, 0, width, height, oled.toRGB(0,255,255)); //line
oled.line( width, 0, 0, height, oled.toRGB(255,0,255)); //line
- oled.rectangle(10,10,90,60,oled.toRGB(255,255,0)); //rectangle
- oled.fillrectangle(20,20,40,40,oled.toRGB(255,255,255),oled.toRGB(0,255,0)); //fillrectangle
+ oled.rect(10,10,90,60,oled.toRGB(255,255,0)); //rectangle
+ oled.fillrect(20,20,40,40,oled.toRGB(255,255,255),oled.toRGB(0,255,0)); //fillrectangle
for(int y = 9; y >= 0; y--) {
oled.contrast(y); // set contrast level
@@ -158,8 +158,8 @@
// constructor
ssd1331(PinName cs_pin, PinName rst_pin, PinName a0_pin, PinName mosi_pin, PinName miso_pin, PinName sclk_pin);
- void pixel(int x,int y,unsigned int color);
- void rect(int x1,int y1,int x2,int y2,unsigned int colorline);
+ void pixel(int16_t x,int16_t y,unsigned int color);
+ void rect(int16_t x1,int16_t y1,int16_t x2,int16_t y2,unsigned int colorline);
void fillrect(int x1,int y1,int x2,int y2,unsigned int colorline,unsigned int colorfill);
void line( int x1,int y1,int x2,int y2,unsigned int color);
void circle (int radius, int x, int y,unsigned int color,int fill);
@@ -172,21 +172,21 @@
void cls(); // clear screen to black
void dim(); // flip dim/normal
void contrast(char value); //0~9 low~high
- void locate(int column, int row); // text start position
- int toRGB(int R,int G,int B); // get color from RGB values 00~FF(0~255)
+ void locate(int16_t column, int16_t row); // text start position
+ int toRGB(int16_t R,int16_t G,int16_t B); // get color from RGB values 00~FF(0~255)
int row();
int column();
void ScrollSet(int horizontal, int startline, int linecount, int vertical , int frame_interval);
void Scrollstart();
void Scrollstop();
void Copy(int src_x1,int src_y1,int src_x2,int src_y2, int dst_x,int dst_y);
- void character(int x, int y, int c);
- void set_font(unsigned char* f);
- void Bitmap(const uint8_t *bitmap, int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
- void Bitmap16(unsigned int x, unsigned int y, unsigned int w, unsigned int h,unsigned char *bitmap);
- int Bitmap16SD( unsigned int x, unsigned int y, unsigned char *Name_BMP); // 12.288k
-
-
+ void character(int x, int y, int c); // Print single character, x & y pixel co-ords.
+ void set_font(unsigned char* f); // set external font. Use oled.set_font(NULL) to restore default font
+ void Bitmap(const uint8_t *bitmap, int16_t x, int16_t y, int16_t w, int16_t h, unsigned char color); // load mono bitmap from flash
+ void Bitmap16(int16_t x, int16_t y, int16_t w, int16_t h,unsigned char *bitmap); // load bitmap from flash
+ int Bitmap16SD( int16_t x, int16_t y, unsigned char *Name_BMP); // uses up to 12.288k RAM, Fast
+ int Bitmap16SD2(int16_t x, int16_t y, unsigned char *Name_BMP); // uses 96b RAM, slower
+
protected:
// Stream implementation functions
virtual int _putc(int c);
@@ -204,7 +204,7 @@
unsigned char* font;
unsigned int Char_Color; // text color
unsigned int BGround_Color; // background color
- void window(int x, int y, int w, int h);
+ void window(int16_t x, int16_t y, int16_t w, int16_t h);
void Maxwindow(); // reset display window to full size
// pixel location
short _x;
Kevin Kadooka
