fixes, added SD subroutines

This commit is contained in:
sumotoy 2015-03-02 23:59:42 +01:00
parent 60a6513cdd
commit 1492548032
5 changed files with 241 additions and 34 deletions

View file

@ -287,7 +287,7 @@ void TFT_ILI9163C::chipInit() {
writedata16_cont(0x00); writedata16_cont(0x00);
writedata16_last(_GRAMHEIGH); writedata16_last(_GRAMHEIGH);
SPI.endTransaction(); endProc();
colorSpace(_colorspaceData); colorSpace(_colorspaceData);
setRotation(0); setRotation(0);
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
@ -361,7 +361,7 @@ void TFT_ILI9163C::chipInit() {
//writedata(0X00); //writedata(0X00);
//writedata(_GRAMHEIGH); //writedata(_GRAMHEIGH);
writedata16(0X00); writedata16(0X00);
writedata16(_GRAMHEIGH) writedata16(_GRAMHEIGH);
colorSpace(_colorspaceData); colorSpace(_colorspaceData);
setRotation(0); setRotation(0);
@ -468,10 +468,15 @@ void TFT_ILI9163C::defineScrollArea(uint16_t a,uint16_t c){
*/ */
void TFT_ILI9163C::scroll(uint16_t adrs) { void TFT_ILI9163C::scroll(uint16_t adrs) {
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); #if defined(__MK20DX128__) || defined(__MK20DX256__)
writecommand_cont(CMD_VSSTADRS); SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
writedata16_last(adrs); writecommand_cont(CMD_VSSTADRS);
endProc(); writedata16_last(adrs);
endProc();
#else
writecommand(CMD_VSSTADRS);
writedata16(adrs);
#endif
} }
@ -496,24 +501,55 @@ void TFT_ILI9163C::clearScreen(uint16_t color) {
#endif #endif
} }
void TFT_ILI9163C::writeScreen(const uint32_t *bitmap) { void TFT_ILI9163C::startPushData(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
setAddr(x0,y0,x1,y1);
}
void TFT_ILI9163C::pushData(uint16_t color) {
#if defined(__MK20DX128__) || defined(__MK20DX256__)
writedata16_cont(color);
#else
writedata16(color);
#endif
}
void TFT_ILI9163C::endPushData() {
#if defined(__MK20DX128__) || defined(__MK20DX256__)
writecommand_last(CMD_NOP);
endProc();
#endif
}
void TFT_ILI9163C::pushColor(uint16_t color) {
#if defined(__MK20DX128__) || defined(__MK20DX256__)
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
writedata16_last(color);
endProc();
#else
writedata16(color);
#endif
}
void TFT_ILI9163C::writeScreen24(const uint32_t *bitmap,uint16_t size) {
uint16_t color; uint16_t color;
int px; int px;
#if defined(__MK20DX128__) || defined(__MK20DX256__) #if defined(__MK20DX128__) || defined(__MK20DX256__)
writecommand_cont(CMD_RAMWR); writecommand_cont(CMD_RAMWR);
for (px = 0;px < 16384; px++){ for (px = 0;px < size; px++){//16384
color = Color24To565(bitmap[px]); color = Color24To565(bitmap[px]);
writedata16_cont(color); writedata16_cont(color);
} }
_setAddrWindow(0x00,0x00,_GRAMWIDTH,_GRAMHEIGH); _setAddrWindow(0x00,0x00,_GRAMWIDTH,_GRAMHEIGH);//home
endProc(); endProc();
#else #else
writecommand(CMD_RAMWR); writecommand(CMD_RAMWR);
for (px = 0;px < 16384; px++){ for (px = 0;px < size; px++){
color = Color24To565(bitmap[px]); color = Color24To565(bitmap[px]);
writedata16(color); writedata16(color);
} }
setAddr(0x00,0x00,_GRAMWIDTH,_GRAMHEIGH); homeAddress();
#endif #endif
} }
@ -533,15 +569,7 @@ void TFT_ILI9163C::setCursor(int16_t x, int16_t y) {
void TFT_ILI9163C::pushColor(uint16_t color) {
#if defined(__MK20DX128__) || defined(__MK20DX256__)
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
writedata16_last(color);
SPI.endTransaction();
#else
writedata16(color);
#endif
}
void TFT_ILI9163C::drawPixel(int16_t x, int16_t y, uint16_t color) { void TFT_ILI9163C::drawPixel(int16_t x, int16_t y, uint16_t color) {
if (boundaryCheck(x,y)) return; if (boundaryCheck(x,y)) return;
@ -740,11 +768,6 @@ void TFT_ILI9163C::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t
#endif #endif
// Pass 8-bit (each) R,G,B, get back 16-bit packed color
uint16_t TFT_ILI9163C::Color565(uint8_t r, uint8_t g, uint8_t b) {
return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);
}
void TFT_ILI9163C::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { void TFT_ILI9163C::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) {
@ -784,7 +807,6 @@ void TFT_ILI9163C::_setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_
writedata16_cont(x0 + __OFFSET); writedata16_cont(x0 + __OFFSET);
writedata16_cont(x1 + __OFFSET); writedata16_cont(x1 + __OFFSET);
} }
writecommand_cont(CMD_PGEADRS); // Page writecommand_cont(CMD_PGEADRS); // Page
if (rotation == 0){ if (rotation == 0){
writedata16_cont(y0 + __OFFSET); writedata16_cont(y0 + __OFFSET);
@ -826,7 +848,7 @@ void TFT_ILI9163C::setRotation(uint8_t m) {
SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0)); SPI.beginTransaction(SPISettings(SPICLOCK, MSBFIRST, SPI_MODE0));
writecommand_cont(CMD_MADCTL); writecommand_cont(CMD_MADCTL);
writedata8_last(_Mactrl_Data); writedata8_last(_Mactrl_Data);
SPI.endTransaction(); endProc();
#else #else
writecommand(CMD_MADCTL); writecommand(CMD_MADCTL);
writedata(_Mactrl_Data); writedata(_Mactrl_Data);

View file

@ -74,6 +74,7 @@
0.4: some improvement, new ballistic gauge example! 0.4: some improvement, new ballistic gauge example!
0.5: Added scroll and more commands, optimizations 0.5: Added scroll and more commands, optimizations
Fixed a nasty bug in fill screen! Fixed a nasty bug in fill screen!
0.6: Small fix, added SD example and subroutines
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BugList of the current version: BugList of the current version:
@ -266,8 +267,11 @@ class TFT_ILI9163C : public Adafruit_GFX {
void sleepMode(boolean mode); void sleepMode(boolean mode);
//void defineScrollArea(uint16_t a,uint16_t c); //void defineScrollArea(uint16_t a,uint16_t c);
void scroll(uint16_t adrs); void scroll(uint16_t adrs);
void writeScreen(const uint32_t *bitmap); void startPushData(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
uint16_t Color565(uint8_t r, uint8_t g, uint8_t b); void pushData(uint16_t color);
void endPushData();
void writeScreen24(const uint32_t *bitmap,uint16_t size=_TFTWIDTH*_TFTHEIGHT);
inline uint16_t Color565(uint8_t r, uint8_t g, uint8_t b) {return ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3);};
//convert 24bit color into packet 16 bit one (credits for this are all mine) //convert 24bit color into packet 16 bit one (credits for this are all mine)
inline uint16_t Color24To565(int32_t color_) { return ((((color_ >> 16) & 0xFF) / 8) << 11) | ((((color_ >> 8) & 0xFF) / 4) << 5) | (((color_) & 0xFF) / 8);} inline uint16_t Color24To565(int32_t color_) { return ((((color_ >> 16) & 0xFF) / 8) << 11) | ((((color_ >> 8) & 0xFF) / 4) << 5) | (((color_) & 0xFF) / 8);}
void setBitrate(uint32_t n); void setBitrate(uint32_t n);

View file

@ -0,0 +1,158 @@
/*
An SD bmp image load example. (extracted and modded by Adafruit old library http://www.adafruit.com )
This use NOT the adafruit SD library (or the standard arduino SD!)
but SdFat created by bill greiman https://github.com/greiman/SdFat much better to me!!!
Note about SPI Transactions <-------------------------------------------
To enable compatibility for SPI Transactions please open
SfFatCinfig.h in SdFat libary and set
#define ENABLE_SPI_TRANSACTION 0
to
#define ENABLE_SPI_TRANSACTION 1
*/
#include <SPI.h>
#include <SdFat.h>
#include <Adafruit_GFX.h>
#include <TFT_ILI9163C.h>
#define __CS 10
#define __DC 9
#define __SDCS 2
TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC);
SdFat SD;
SdFile myFile;
void setup(void) {
Serial.begin(9600);
tft.begin();
//tft.setRotation(2);
//I have a crappy chinese SD card holder that it's not compatible
//with hi speeds SPI (SPI_FULL_SPEED). If you have better luck set it to
//SPI_FULL_SPEED
if (!SD.begin(__SDCS,SPI_HALF_SPEED)) {
tft.setCursor(0,0);
tft.print("sd failed!");
}
Serial.println("OK!");
//your image here!
bmpDraw("star.bmp", 0, 0);
}
void loop() {
}
// This function opens a Windows Bitmap (BMP) file and
// displays it at the given coordinates. It's sped up
// by reading many pixels worth of data at a time
// (rather than pixel by pixel). Increasing the buffer
// size takes more of the Arduino's precious RAM but
// makes loading a little faster. 20 pixels seems a
// good balance.
#define BUFFPIXEL 20
void bmpDraw(char *filename, uint8_t x, uint16_t y) {
File bmpFile;
uint16_t bmpWidth, bmpHeight; // W+H in pixels
uint8_t bmpDepth; // Bit depth (currently must be 24)
uint32_t bmpImageoffset; // Start of image data in file
uint32_t rowSize; // Not always = bmpWidth; may have padding
uint8_t sdbufferLen = BUFFPIXEL * 3;
uint8_t sdbuffer[sdbufferLen]; // pixel buffer (R+G+B per pixel)
uint8_t buffidx = sdbufferLen; // Current position in sdbuffer
boolean goodBmp = false; // Set to true on valid header parse
boolean flip = true; // BMP is stored bottom-to-top
uint16_t w, h, row, col;
uint8_t r, g, b;
uint32_t pos = 0;
if((x >= tft.width()) || (y >= tft.height())) return;
// Open requested file on SD card
if ((bmpFile = SD.open(filename)) == NULL) {
tft.setCursor(0,0);
tft.print("file not found!");
return;
}
// Parse BMP header
if(read16(bmpFile) == 0x4D42) { // BMP signature
read32(bmpFile);
(void)read32(bmpFile); // Read & ignore creator bytes
bmpImageoffset = read32(bmpFile); // Start of image data
// Read DIB header
read32(bmpFile);
bmpWidth = read32(bmpFile);
bmpHeight = read32(bmpFile);
if(read16(bmpFile) == 1) { // # planes -- must be '1'
bmpDepth = read16(bmpFile); // bits per pixel
if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed
goodBmp = true; // Supported BMP format -- proceed!
rowSize = (bmpWidth * 3 + 3) & ~3;// BMP rows are padded (if needed) to 4-byte boundary
if (bmpHeight < 0) {
bmpHeight = -bmpHeight;
flip = false;
}
// Crop area to be loaded
w = bmpWidth;
h = bmpHeight;
if((x+w-1) >= tft.width()) w = tft.width() - x;
if((y+h-1) >= tft.height()) h = tft.height() - y;
tft.startPushData(x, y, x+w-1, y+h-1);
for (row=0; row<h; row++) { // For each scanline...
if (flip){ // Bitmap is stored bottom-to-top order (normal BMP)
pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize;
}
else { // Bitmap is stored top-to-bottom
pos = bmpImageoffset + row * rowSize;
}
if (bmpFile.position() != pos) { // Need seek?
bmpFile.seek(pos);
buffidx = sdbufferLen; // Force buffer reload
}
for (col=0; col<w; col++) { // For each pixel...
// Time to read more pixel data?
if (buffidx >= sdbufferLen) { // Indeed
bmpFile.read(sdbuffer, sdbufferLen);
buffidx = 0; // Set index to beginning
}
// Convert pixel from BMP to TFT format, push to display
b = sdbuffer[buffidx++];
g = sdbuffer[buffidx++];
r = sdbuffer[buffidx++];
tft.pushData(tft.Color565(r,g,b));
} // end pixel
} // end scanline
tft.endPushData();
} // end goodBmp
}
}
bmpFile.close();
if(!goodBmp) {
tft.setCursor(0,0);
tft.print("file unrecognized!");
}
}
uint16_t read16(File &f) {
uint16_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read(); // MSB
return result;
}
uint32_t read32(File &f) {
uint32_t result;
((uint8_t *)&result)[0] = f.read(); // LSB
((uint8_t *)&result)[1] = f.read();
((uint8_t *)&result)[2] = f.read();
((uint8_t *)&result)[3] = f.read(); // MSB
return result;
}

View file

@ -2,9 +2,29 @@
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <TFT_ILI9163C.h> #include <TFT_ILI9163C.h>
//be careful, big image! Only Teensy or DUE probably work /*
Want to load 24 bit iamges directly? This demo it's cool to understand how it works.
The 24bit data can also be stored in a flash if you like!
be careful, big ram requirements!! Only Teensy or DUE probably work
You need the utility lcd-image-converter in the utility folder.
Open an image with lcd-image-converter, go to menu->Options->Conversion...
'Prepare' sub-menu tag should be set as follow:
Type: color
Main Scan Direction: Top to Bottom
Line Scan Direction: Forwaed
All the rest should be unchecked.
Go to sub-menu tag 'Image'
Prefix:0x
Block size: 24bit
Delimeter:,
Byte Order: Little-Endian
Done. Now save preset if you like!
Now go to menu File->Convert and save .c file
Open with any text editor, you need to copy in your sketch only the data so the array
that start with static const uint24_t yourimage[16384] = { ....};
Change uint24_t to uint32_t.
*/
/* /*
Teensy3.x and Arduino's Teensy3.x and Arduino's
You are using 4 wire SPI here, so: You are using 4 wire SPI here, so:
@ -32,7 +52,7 @@ static const uint32_t image_data_batman_ume[16384] = {
void setup() { void setup() {
tft.begin(); tft.begin();
tft.writeScreen(image_data_batman_ume); tft.writeScreen24bit(image_data_batman_ume);
} }

View file

@ -1,5 +1,6 @@
TFT_ILI9163C KEYWORD1 TFT_ILI9163C KEYWORD1
begin KEYWORD2 begin KEYWORD2
setAddrWindow KEYWORD2
pushColor KEYWORD2 pushColor KEYWORD2
setBrightness KEYWORD2 setBrightness KEYWORD2
writeData KEYWORD2 writeData KEYWORD2
@ -7,10 +8,12 @@ setBitrate KEYWORD2
Color565 KEYWORD2 Color565 KEYWORD2
setBitrate KEYWORD2 setBitrate KEYWORD2
clearScreen KEYWORD2 clearScreen KEYWORD2
writeScreen KEYWORD2
Color24To565 KEYWORD2 Color24To565 KEYWORD2
sleepMode KEYWORD2 sleepMode KEYWORD2
display KEYWORD2 display KEYWORD2
writeScreen KEYWORD2 startPushData KEYWORD2
pushData KEYWORD2
endPushData KEYWORD2
writeScreen24 KEYWORD2