hi everyone need help, im trying to run lcd display ST7735 with my Stm32f103c8t6 but for some reason the screen is always white and does not display anything, please help, maybe someone will tell me what the error is
Build here
Nice black and white but an annotated schematic would be much easier to follow. I do not download binary files. Post the sketch using code tags.
i havent scetch...its build from github, ready to flash on f103 with lcd st7735
Sorry I cannot help without the needed information, Good Luck.
Are you using the Arduino IDE?
If so, which STM32 kernel are you running in the Arduino IDE?
For this type of MCU, it's best to use one SPI port for the TFT (usually SPI1) and another SPI port for the microSD card reader (SPI2).
Each SPI port has its own pinout.
Im using cube ide for Stm...
Havent ioc, im saying, I take already built bin from github
Here it is connection
ST7735 128x160 1.8" LCD pinout (header at the top, from left):
#1 LED -> 3.3V
#2 SCK -> SCL/D13/PA5
#3 SDA -> MOSI/D11/PA7
#4 A0/DC -> D8/PA1 or any digital
#5 RESET -> D9/PA0 or any digital
#6 CS -> D10/PA2 or any digital
#7 GND -> GND
#8 VCC -> 3.3V
SPI2/SPI1
SD_SCK - PB13/PA5
SD_MISO - PB14/PA6
SD_MOSI - PB15/PA7
SD_CS - PB12/PA4
*/
/*
STM32 SPI1/SPI2 pins:
SPI1 MOSI PA7
SPI1 MISO PA6
SPI1 SCK PA5
SPI1 CS PA4
SPI2 MOSI PB15
SPI2 MISO PB14
SPI2 SCK PB13
SPI2 CS PB12
*/
Here it is scetch
#include <SPI.h>
#include <Adafruit_GFX.h>
#if (__STM32F1__) // bluepill
#define TFT_CS PA2
#define TFT_DC PA1
#define TFT_RST PA0
#include <Arduino_ST7735_STM.h>
#else
#define TFT_CS 10
#define TFT_DC 8
#define TFT_RST 9
//#include <Arduino_ST7735_Fast.h>
#endif
#define SCR_WD 128
#define SCR_HT 160
Arduino_ST7735 lcd = Arduino_ST7735(TFT_DC, TFT_RST, TFT_CS);
#include "RREFont.h"
#include "rre_5x8.h"
RREFont font;
// -------------------------
// needed for RREFont library initialization, define your fillRect
void customRect(int x, int y, int w, int h, int c) { lcd.fillRect(x, y, w, h, c); }
// -------------------------
#include "SdFat.h"
#define USE_SDIO 0
const int8_t DISABLE_CHIP_SELECT = -1;
//const uint8_t SD_CS = PB12;
//SdFat sd(2);
const uint8_t SD_CS = PA4;
SdFat sd(1);
uint32_t cardSize;
uint32_t eraseSize;
#define GREY RGBto565(160,160,160)
#define LGREY RGBto565(200,200,200)
#define DGREY RGBto565(100,100,100)
#define ORANGE RGBto565(255,105,0)
#define DGREEN RGBto565(0,160,0)
#define PINK RGBto565(225,180,175)
#define MAGENTA RGBto565(255,100,255)
// use 10 and 5 for more optimal text density
#define LINE_HT 9
#define LINE_GAP 3
/*
uint16_t bgCol = BLACK;
uint16_t errCol = RED;
uint16_t okCol = GREEN;
uint16_t tabActCol = RGBto565(0,150,150);
uint16_t tabActTxtCol = WHITE;
uint16_t tabActLinCol = RGBto565(0,255,255);
uint16_t tabIdlCol = RGBto565(120,120,120);
uint16_t tabIdlTxtCol = RGBto565(90,90,90);
uint16_t tabIdlLinCol = RGBto565(200,200,200);
uint16_t cid1Col = GREEN;
uint16_t cid2Col = ORANGE;
uint16_t cid3Col = CYAN;
uint16_t cid4Col = MAGENTA;
uint16_t cid5Col = YELLOW;
uint16_t cid6Col = GREY;
uint16_t cid7Col = RED;
uint16_t vendCol = WHITE;
uint16_t hdCol = WHITE;
uint16_t part1Col = DGREEN;
uint16_t part2Col = GREEN;
uint16_t partLCol = GREY;
uint16_t fsCol = CYAN;
uint16_t statCol = LGREY;
uint16_t csdCol = RGBto565(125,255,175);
uint16_t cardCol = GREEN;
uint16_t ocrCol = CYAN;
*/
uint16_t bgCol = RGBto565(140,140,140);
uint16_t errCol = RGBto565(250,0,0);
uint16_t okCol = RGBto565(80,250,80);
uint16_t tabActCol = bgCol;
uint16_t tabActTxtCol = WHITE;
uint16_t tabActLinCol = RGBto565(220,220,220);
uint16_t tabIdlCol = RGBto565(100,100,100);
uint16_t tabIdlTxtCol = RGBto565(60,60,60);
uint16_t tabIdlLinCol = RGBto565(160,160,160);
uint16_t cid1Col = RGBto565(100,250,100); // MID
uint16_t cid2Col = RGBto565(255,200,120); // OID
uint16_t cid3Col = RGBto565(100,250,250); // PNM
uint16_t cid4Col = RGBto565(255,170,255); // rev
uint16_t cid5Col = YELLOW; // PSN
uint16_t cid6Col = RGBto565(220,220,220); // MDT
uint16_t cid7Col = RGBto565(255,40,40); // CRC
uint16_t vendCol = WHITE;
uint16_t hdCol = RGBto565(0,0,180);
uint16_t part1Col = RGBto565(160,80,0);
uint16_t part2Col = RGBto565(140,40,0);
uint16_t partLCol = RGBto565(210,210,90);
uint16_t fsCol = RGBto565(0,60,60);
uint16_t statCol = RGBto565(0,70,70);
uint16_t csdCol = RGBto565(20,90,20);
uint16_t cardCol = RGBto565(110,110,0);
uint16_t ocrCol = RGBto565(0,100,100);
void lcdSPI()
{
SPI.beginTransaction(SPISettings(36000000, MSBFIRST, SPI_MODE3, DATA_SIZE_16BIT));
}
#define SD_SPEED 18
void sdSPI()
{
SPI.beginTransaction(SD_SCK_MHZ(SD_SPEED));
}
int xp=0, yp=0;
char txt[40];
int xpSt = 1;
void incX(int wd)
{
xp+=wd;
if(xp>=SCR_WD) { xp = xpSt; incY(); }
}
void incY() { yp+=LINE_HT; }
int printString(const char *str)
{
lcdSPI();
while(*str) {
if(*str=='\n') {
xp=xpSt; incY();
} else {
int wd = font.drawChar(xp, yp, *str);
incX(wd);
}
str++;
}
sdSPI();
return xp;
}
int printStringCol(const char *str, uint16_t col)
{
font.setColor(col);
printString(str);
}
// ------------------------------------------------
char str[30];
const char *val2dec(int val, char *end=NULL)
{
sprintf(str,"%d%s",val,end?end:"");
return str;
}
const char *val2hex(int val, char *end=NULL)
{
sprintf(str,"0x%x%s",val,end?end:"");
return str;
}
// ------------------------------------------------
const char *toManuf(int val)
{
switch(val){
case 1: return "Panasonic";break;
case 2: return "Toshiba";break;
case 3: return "SanDisk";break;
case 6: return "Ritek";break;
case 9: return "ATP";break;
case 19: return "Kingmax";break;
case 25: return "Dynacard";break;
case 26: return "PQI";break;
case 27: return "Samsung";break;
case 29: return "ADATA";break;
case 39: return "Phison";break;
case 40: return "Barun";break;
case 81: return "STEC";break;
case 93: return "SwissBit";break;
case 97: return "Netlist";break;
case 99: return "Cactus";break;
case 116: return "Jiaelec";break;
case 130: return "JangTay";break;
case 131: return "Netcom";break;
case 132: return "Strontium";break;
default: return "unknown";break;
}
}
uint8_t showCID()
{
cid_t cid;
if(!sd.card()->readCID(&cid)) {
font.setBold(1);
printStringCol("\nReadCID failed!\n",errCol);
font.setBold(0);
return 0;
}
font.setColor(hdCol);
yp+=LINE_GAP;
font.setBold(1);
printString("CID Decoder\n");
font.setBold(0);
yp+=1;
const char *cid8 = (const char *)&cid;
font.setFont(&rre_5x8); font.setFontMinWd(5); font.setBold(1);
uint16_t cidCol;
xp=xpSt;
int yc = yp;
for(int i=0;i<16;i++) {
if(i==8) { xp=1; yp+=10; }
if(i==0) cidCol=cid1Col; else // MID
if(i>=1 && i<=2) cidCol=cid2Col; else // OID
if(i>=3 && i<=7) cidCol=cid3Col; else // PNM
if(i>=8 && i<=8) cidCol=cid4Col; else // PRV
if(i>=9 && i<=12) cidCol=cid5Col; else //PSN
if(i>=13 && i<=14) cidCol=cid6Col; else cidCol=cid7Col; // MDT/CRC
sprintf(txt,"%02X",cid8[i]); printStringCol(txt,cidCol);
}
font.setBold(0);
yp=yc+21;
xp=xpSt;
sprintf(txt,"MnfID: %02X %s\n",int(cid.mid),toManuf(cid.mid)); font.setColor(cid1Col); printString(txt);
sprintf(txt,"OEMID: %c%c\n",cid.oid[0],cid.oid[1]); font.setColor(cid2Col); printString(txt);
sprintf(txt,"PrdID: "); font.setColor(cid3Col); printString(txt);
for (uint8_t i = 0; i < 5; i++) { sprintf(txt,"%c",cid.pnm[i]); printString(txt); }
sprintf(txt,"\nRev: %d.%d\n", int(cid.prv_n), int(cid.prv_m)); font.setColor(cid4Col); printString(txt);
sprintf(txt,"Serial: %02X%02X%02X%02X\n",cid.psn&0xff,(cid.psn>>8)&0xff,(cid.psn>>16)&0xff,(cid.psn>>24)&0xff); font.setColor(cid5Col); printString(txt);
sprintf(txt,"MnfDat: %d/%d\n",int(cid.mdt_month),(2000 + cid.mdt_year_low + 10 * cid.mdt_year_high)); font.setColor(cid6Col); printString(txt);
return 1;
}
//------------------------------------------------------------------------------
const char *toTAAC3_6(int val)
{
switch(val>>3){
case 0: return "reserved" ;break;
case 1: return "1.0" ;break;
case 2: return "1.2" ;break;
case 3: return "1.3" ;break;
case 4: return "1.5" ;break;
case 5: return "2.0" ;break;
case 6: return "2.5" ;break;
case 7: return "3.0" ;break;
case 8: return "3.5" ;break;
case 9: return "4.0" ;break;
case 10: return "4.5" ;break;
case 11: return "5.0" ;break;
case 12: return "5.5" ;break;
case 13: return "6.0" ;break;
case 14: return "7.0" ;break;
case 15: return "8.0" ;break;
}
}
const char *toTAAC0_2(int val)
{
switch(val&0x07){
case 0: return "1ns" ; break;
case 1: return "10ns" ; break;
case 2: return "100ns" ; break;
case 3: return "1us" ; break;
case 4: return "10us" ; break;
case 5: return "100us" ; break;
case 6: return "1ms" ; break;
case 7: return "10ms" ; break;
}
}
const char *toMaxCurVDDMin(int val)
{
switch(val){
case 0: return "0.5" ;break;
case 1: return "1" ;break;
case 2: return "5" ;break;
case 3: return "10" ;break;
case 4: return "25" ;break;
case 5: return "35" ;break;
case 6: return "60" ;break;
case 7: return "100" ;break;
default: return "??" ;break;
}
}
const char *toMaxCurVDDMax(int val)
{
switch(val){
case 0: return "1" ;break;
case 1: return "5" ;break;
case 2: return "10" ;break;
case 3: return "25" ;break;
case 4: return "35" ;break;
case 5: return "45" ;break;
case 6: return "80" ;break;
case 7: return "200" ;break;
default: return "???" ;break;
}
}
const char *toCSDVer(int val)
{
switch(val){
case 0: return "V1.0" ;break;
case 1: return "V2.0" ;break;
default: return "????" ;break;
}
}
const char *toTransSpeedV1(int val)
{
switch(val&7){
case 0: return "100kbps" ; break;
case 1: return "1Mbps" ; break;
case 2: return "10Mbps" ; break;
case 3: return "100Mbps" ; break;
default: return "wrong" ; break;
}
}
const char *toTransSpeedV2(int val)
{
switch(val){
case 0x0b: return "100Mbps" ; break;
case 0x2b: return "200Mbps" ; break;
case 0x32: return "25MHz" ; break;
case 0x5a: return "50MHz" ; break;
default: return "wrong" ; break;
}
}
const char *toFileFormat(int val)
{
switch(val&3){
//case 0: return "HardDisk/part"; break;
case 0: return "HDD/part"; break;
//case 1: return "Floppy/boot"; break;
case 1: return "FDD/boot"; break;
case 2: return "UFS"; break;
default: return "Other" ; break;
}
}
uint8_t showCSD()
{
csd_t csd;
uint8_t eraseSingleBlock;
sdSPI();
if(!sd.card()->readCSD(&csd)) {
printStringCol("readCSD failed!\n",errCol);
return 0;
}
int ver = csd.v1.csd_ver;
font.setColor(hdCol);
yp+=LINE_GAP;
sprintf(txt,"CSD %s\n", toCSDVer(ver)); printString(txt);
font.setColor(csdCol);
if(ver==0) {
sprintf(txt,"TAAC: %s %s\n", toTAAC0_2(csd.v1.taac), toTAAC3_6(csd.v1.taac)); printString(txt);
sprintf(txt,"TransSpeed: %02x %s\n", csd.v1.tran_speed, toTransSpeedV1(csd.v1.tran_speed)); printString(txt);
sprintf(txt,"Read/Write: %d\n", 1<<csd.v1.r2w_factor); printString(txt);
sprintf(txt,"FileFormat: %s\n", toFileFormat(csd.v1.file_format)); printString(txt);
sprintf(txt,"VDDRdCur: %s-%smA\n", toMaxCurVDDMin(csd.v1.vdd_r_curr_min),toMaxCurVDDMax(csd.v1.vdd_r_curr_max)); printString(txt);
sprintf(txt,"VDDWrCurMn: %s-%smA\n", toMaxCurVDDMin(csd.v1.vdd_w_curr_min),toMaxCurVDDMax(csd.v1.vdd_w_cur_max)); printString(txt);
sprintf(txt,"Tmp/PermWP: %s/%s\n", csd.v1.tmp_write_protect?"YES":"NO", csd.v1.perm_write_protect?"YES":"NO"); printString(txt);
sprintf(txt,"Copy: %s\n", csd.v1.copy?"YES":"NO"); printString(txt);
eraseSingleBlock = csd.v1.erase_blk_en;
eraseSize = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low;
} else if(ver==1) {
sprintf(txt,"TAAC: %02d\n", csd.v2.taac); printString(txt);
sprintf(txt,"TransSpeed: %02x %s\n", csd.v2.tran_speed, toTransSpeedV2(csd.v2.tran_speed)); printString(txt);
sprintf(txt,"Read/Write: %d\n", 1<<csd.v2.r2w_factor); printString(txt);
sprintf(txt,"FileFormat: %s\n", toFileFormat(csd.v2.file_format)); printString(txt);
sprintf(txt,"Tmp/PermWP: %s/%s\n", csd.v1.tmp_write_protect?"YES":"NO", csd.v1.perm_write_protect?"YES":"NO"); printString(txt);
sprintf(txt,"Copy: %s\n", csd.v2.copy?"YES":"NO"); printString(txt);
eraseSingleBlock = csd.v2.erase_blk_en;
eraseSize = (csd.v2.sector_size_high << 1) | csd.v2.sector_size_low;
} else {
return false;
}
eraseSize++;
font.setColor(cardCol);
printString("Card Size: "); dtostrf(0.000512*cardSize,4,0,txt); printString(txt); printString("MB\n");
sprintf(txt,"EraseSize: %d blcks\n", int(eraseSize)); printString(txt);
sprintf(txt,"EraseSingl: %s\n", eraseSingleBlock ? "YES":"NO"); printString(txt);
return 1;
}
//------------------------------------------------------------------------------
uint8_t showPartTab()
{
sdSPI();
mbr_t mbr;
if(!sd.card()->readBlock(0, (uint8_t*)&mbr)) {
font.setBold(1);
printStringCol("\nRead MBR failed\n",errCol);
font.setBold(0);
return 0;
}
for(uint8_t ip = 1; ip < 5; ip++) {
part_t *pt = &mbr.part[ip - 1];
if((pt->boot & 0X7F) != 0 || pt->firstSector > cardSize) {
printStringCol("\nNo MBR.\nSuper Floppy format?\n",errCol);
return 1;
}
}
yp+=LINE_GAP;
font.setBold(1);
printStringCol("SD Partition Table\n",hdCol);
font.setBold(0);
yp+=LINE_GAP*2;
font.setColor(part1Col);
xp=1;
printString("# Bt Tp Start Length\n");
yp+=LINE_GAP;
font.setColor(part2Col);
for(uint8_t ip = 1; ip < 5; ip++) {
part_t *pt = &mbr.part[ip - 1];
if(!pt->type) continue;
sprintf(txt,"%d %02x %02x", int(ip),int(pt->boot),int(pt->type));
xp=1;
printString(txt);
sprintf(txt,"%dk", pt->firstSector/1024);
xp=1+6*8; printString(txt);
sprintf(txt,"%dk\n", pt->totalSectors/1024);
xp=1+6*15; printString(txt);
}
lcdSPI();
int yf = 17+LINE_GAP*3+5, hf=yp-yf+1;
uint16_t c = partLCol;
lcd.drawFastHLine(0,yf,SCR_WD,c);
lcd.drawFastHLine(0,yf+12,SCR_WD,c);
lcd.drawFastHLine(0,yp+1,SCR_WD,c);
lcd.drawFastVLine(6*0+0,yf,hf,c);
lcd.drawFastVLine(6*1+3,yf,hf,c);
lcd.drawFastVLine(6*4+3,yf,hf,c);
lcd.drawFastVLine(6*7+3,yf,hf,c);
lcd.drawFastVLine(SCR_WD-6*6-4,yf,hf,c);
lcd.drawFastVLine(SCR_WD-1,yf,hf,c);
sdSPI();
return 1;
}
//------------------------------------------------------------------------------
void showFileSystem()
{
if(!sd.fsBegin()) {
font.setBold(1);
printStringCol("\nFileSystem init\nfailed\n",errCol);
font.setBold(0);
return;
}
font.setColor(hdCol);
yp+=LINE_GAP;
sprintf(txt,"FileSystem: FAT%d\n", int(sd.vol()->fatType())); printString(txt);
yp+=LINE_GAP;
font.setColor(fsCol);
sprintf(txt,"Blocks/Clust: %d\n", int(sd.vol()->blocksPerCluster())); printString(txt);
sprintf(txt,"ClusterCount: %d\n", sd.vol()->clusterCount() ); printString(txt);
printStringCol("Reading...",hdCol); font.setColor(fsCol);
uint32_t volFree = sd.vol()->freeClusterCount();
xp=0;
lcdSPI(); lcd.fillRect(xp,yp,SCR_WD,8, bgCol);
sprintf(txt,"FreeClusters: %ld\n", volFree); printString(txt);
float fs = 0.000512*volFree*sd.vol()->blocksPerCluster();
printString("FreeSpace: "); dtostrf(fs,2,0,txt); printString(txt); printString("MB\n");
sprintf(txt,"FATStartBlk: %d\n", sd.vol()->fatStartBlock()); printString(txt);
sprintf(txt,"FATCount: %d\n", int(sd.vol()->fatCount())); printString(txt);
sprintf(txt,"BlocksPerFAT: %d\n", sd.vol()->blocksPerFat()); printString(txt);
sprintf(txt,"RootDirStart: %d\n", sd.vol()->rootDirStart()); printString(txt);
sprintf(txt,"DataStartBlk: %d\n", sd.vol()->dataStartBlock()); printString(txt);
sprintf(txt,"Align: "); printString(txt);
sdSPI();
if(sd.vol()->dataStartBlock() % eraseSize) printStringCol("BAD",errCol); else printStringCol("OK",okCol);
}
// ------------------------------------------------
int showOCR()
{
uint32_t ocr;
if(!sd.card()->readOCR(&ocr)) {
printStringCol("ReadOCR failed!\n",errCol);
return 0;
}
yp+=LINE_GAP;
sprintf(txt,"OCR: %08X\n",ocr); printStringCol(txt,ocrCol);
printString("VDD 2.7-3.6V:");
if((ocr&0xff8000)==0xff8000) printString(" ALL"); else {
int b = (1<<15);
for(int i=0;i<9;i++) {
printString((ocr & b)?(char*)"1":(char*)"0");
b<<=1;
}
}
printString("\n");
if(ocr & (1<<24)) printString("Switching to 1.8V: YES\n");
if(ocr & (1<<29)) printString("UHS-II Interface: YES\n");
return 1;
}
// ------------------------------------------------
const char *toClass(int val)
{
switch(val){
case 0: return "0"; break;
case 1: return "2"; break;
case 2: return "4"; break;
case 3: return "6"; break;
case 4: return "10"; break;
default: return val2hex(val) ; break;
}
}
const char *toPerf(int val)
{
switch(val){
case 0: return "SeqWrite"; break;
case 255: return "Infinity"; break;
default: return val2dec(val," MB/s") ; break;
}
}
const char *toUHS(int val)
{
switch(val){
case 0x00: return "<10 MB/s"; break;
case 0x10: return "10+ MB/s"; break;
case 0x30: return "30+ MB/s"; break;
default: return val2hex(val) ; break;
}
}
int showStatus()
{
uint8_t stat[64];
if(!sd.card()->readStatus(stat)) {
printStringCol("\nReadStatus failed!",errCol);
return 0;
}
font.setBold(1);
printStringCol("Card: ",hdCol);
switch (sd.card()->type()) {
case SD_CARD_TYPE_SD1: printString("SD1"); break;
case SD_CARD_TYPE_SD2: printString("SD2"); break;
case SD_CARD_TYPE_SDHC: printString(cardSize < 70000000 ? "SDHC":"SDXC"); break;
default: printStringCol("???",errCol);
}
sprintf(txt," Class%s\n",toClass(stat[8])); printString(txt);
font.setBold(0);
font.setColor(statCol);
sprintf(txt,"PerfMove: %s\n",toPerf(stat[9])); printString(txt);
//sprintf(txt,"Bus: %x\n",stat[0]&0xc0); printString(txt);
sprintf(txt,"UHS Spd: %s\n",toUHS(stat[13]&0xf0)); printString(txt);
//sprintf(txt,"VideoSpeed: %d\n",stat[15]); printString(txt);
return 1;
}
// ------------------------------------------------
#define PROGRAM_CID_OPCODE 26
#define SAMSUNG_VENDOR_OPCODE 62
#define ENTER_VENDOR 0xEFAC62EC
#define EXIT_VENDOR 0x00DECCEE
#define UNLOCK_CID_WRITE 0xEF50
int checkCIDhack()
{
int retEn = sd.card()->cardCommand(SAMSUNG_VENDOR_OPCODE, ENTER_VENDOR);
int retCW = sd.card()->cardCommand(SAMSUNG_VENDOR_OPCODE, UNLOCK_CID_WRITE);
int retEx = sd.card()->cardCommand(SAMSUNG_VENDOR_OPCODE, EXIT_VENDOR);
yp+=2;
sprintf(txt,"Enter Vendor: "); printStringCol(txt,vendCol);
sprintf(txt,"%s (%X)\n",retEn?"NO":"YES",retEn); printStringCol(txt,retEn?errCol:okCol);
if(retEn==0) {
sprintf(txt,"CID Write: "); printStringCol(txt,vendCol);
sprintf(txt,"%s (%X)\n",retCW?"NO":"YES",retCW); printStringCol(txt,retCW?errCol:okCol);
sprintf(txt,"Exit Vendor: "); printStringCol(txt,vendCol);
sprintf(txt,"%s (%X)\n",retEx?"NO":"YES",retEx); printStringCol(txt,retEx?errCol:okCol);
//if(ret==0 && ret2==0) printStringCol("CID UNLOCKED\n",okCol); else printStringCol("CID LOCKED\n",errCol);
} else printStringCol("CID CHANGE: LOCKED\n",errCol);
return 1;
}
// --------------------------------------------------------------------------
#define BUTTON PB9
int stateOld = HIGH;
long btDebounce = 30;
long btDoubleClick = 600;
long btLongClick = 500;
long btLongerClick = 2000;
long btTime = 0, btTime2 = 0;
int clickCnt = 1;
// 0=idle, 1,2,3=click, -1,-2=longclick
int checkButton()
{
int state = digitalRead(BUTTON);
if( state == LOW && stateOld == HIGH ) { btTime = millis(); stateOld = state; return 0; } // button just pressed
if( state == HIGH && stateOld == LOW ) { // button just released
stateOld = state;
if( millis()-btTime >= btDebounce && millis()-btTime < btLongClick ) {
if( millis()-btTime2<btDoubleClick ) clickCnt++; else clickCnt=1;
btTime2 = millis();
return clickCnt;
}
}
if( state == LOW && millis()-btTime >= btLongerClick ) { stateOld = state; return -2; }
if( state == LOW && millis()-btTime >= btLongClick ) { stateOld = state; return -1; }
return 0;
}
// --------------------------------------------------------------------------
void setColorSet(int set)
{
if(set==0) {
bgCol = BLACK;
errCol = RED;
okCol = GREEN;
tabActCol = RGBto565(0,150,150);
tabActTxtCol = WHITE;
tabActLinCol = RGBto565(0,255,255);
tabIdlCol = RGBto565(120,120,120);
tabIdlTxtCol = RGBto565(90,90,90);
tabIdlLinCol = RGBto565(200,200,200);
cid1Col = GREEN;
cid2Col = ORANGE;
cid3Col = CYAN;
cid4Col = MAGENTA;
cid5Col = YELLOW;
cid6Col = GREY;
cid7Col = RED;
vendCol = WHITE;
hdCol = WHITE;
part1Col = DGREEN;
part2Col = GREEN;
partLCol = GREY;
fsCol = CYAN;
statCol = LGREY;
csdCol = RGBto565(125,255,175);
cardCol = GREEN;
ocrCol = CYAN;
} else {
bgCol = RGBto565(140,140,140);
errCol = RGBto565(250,0,0);
okCol = RGBto565(80,250,80);
tabActCol = bgCol;
tabActTxtCol = WHITE;
tabActLinCol = RGBto565(220,220,220);
tabIdlCol = RGBto565(100,100,100);
tabIdlTxtCol = RGBto565(60,60,60);
tabIdlLinCol = RGBto565(160,160,160);
cid1Col = RGBto565(100,250,100); // MID
cid2Col = RGBto565(255,200,120); // OID
cid3Col = RGBto565(100,250,250); // PNM
cid4Col = RGBto565(255,170,255); // rev
cid5Col = YELLOW; // PSN
cid6Col = RGBto565(220,220,220); // MDT
cid7Col = RGBto565(255,40,40); // CRC
vendCol = WHITE;
hdCol = RGBto565(0,0,180);
part1Col = RGBto565(160,80,0);
part2Col = RGBto565(140,40,0);
partLCol = RGBto565(210,210,90);
fsCol = RGBto565(0,60,60);
statCol = RGBto565(0,70,70);
csdCol = RGBto565(20,90,20);
cardCol = RGBto565(110,110,0);
ocrCol = RGBto565(0,100,100);
}
}
// --------------------------------------------------------------------------
void drawTabs(int mode)
{
lcdSPI();
lcd.fillScreen(bgCol); xp=xpSt; yp=0;
uint16_t c,i;
lcd.fillRect(0,0,SCR_WD,2,BLACK);
for(i=0;i<4;i++) {
lcd.fillRect(1+32*i,1,i==3?30:31,i==mode?12:11,(mode==i) ? tabActCol : tabIdlCol);
c = tabIdlLinCol;
lcd.drawFastVLine(32*(i+0),2,12-2,c);
lcd.drawFastVLine(i==3 ? 32*(i+1)-1 : 32*(i+1),2,12-2,c);
lcd.drawFastHLine(32*i+2,0,i==3 ? 32-4 : 32-3,c);
lcd.drawPixel(32*i+1,1,c);
lcd.drawPixel(i==3 ? 32*(i+1)-2 : 32*(i+1)-1,1,c);
}
i = mode;
c = tabActLinCol;
lcd.drawFastVLine(32*(i+0),2,12-2,c);
lcd.drawFastVLine(i==3 ? 32*(i+1)-1 : 32*(i+1),2,12-2,c);
lcd.drawFastHLine(32*i+2,0,i==3 ? 32-4 : 32-3,c);
lcd.drawPixel(32*i+1,1,c);
lcd.drawPixel(i==3 ? 32*(i+1)-2 : 32*(i+1)-1,1,c);
lcd.drawFastHLine(0,12,32*i+1,c);
if(i<3) lcd.drawFastHLine(32*(i+1),12,32*(3-i),c); else lcd.drawFastHLine(32*(i+1)-1,12,1,c);
font.setColor(mode==0 ? tabActTxtCol : tabIdlTxtCol); font.printStr(7,3,"CID");
font.setColor(mode==1 ? tabActTxtCol : tabIdlTxtCol); font.printStr(40,3,"CSD");
font.setColor(mode==2 ? tabActTxtCol : tabIdlTxtCol); font.printStr(70,3,"Part");
font.setColor(mode==3 ? tabActTxtCol : tabIdlTxtCol); font.printStr(107,3,"FS");
yp=16;
}
// --------------------------------------------------------------------------
unsigned long ms;
void setup(void)
{
Serial.begin(115200);
pinMode(BUTTON, INPUT_PULLUP);
lcd.init();
font.init(customRect, SCR_WD, SCR_HT); // custom fillRect function and screen width and height values
font.setScale(1,1);
font.setFont(&rre_5x8); font.setFontMinWd(5);
xp=0; yp=0;
setColorSet(0);
ms=millis();
}
// --------------------------------------------------------------------------
int screen=0;
int colSet=0;
void loop(void)
{
lcdSPI();
font.setScale(1,1);
lcd.fillScreen(bgCol); xp=xpSt; yp=0;
//font.setBold(1); printStringCol("SD Card\ninitializing ...",okCol); font.setBold(0);
if(!sd.cardBegin(SD_CS, SD_SCK_MHZ(SD_SPEED))) {
lcdSPI(); lcd.fillScreen(bgCol); xp=yp=0;
font.setBold(1);
printStringCol("Cannot initialize\nSD Card!",errCol);
font.setBold(0);
screen=-1;
goto wait;
}
drawTabs(screen);
sdSPI();
cardSize = sd.card()->cardSize();
if(cardSize <= 0) {
font.setBold(1);
printStringCol("cardSize failed!\n",errCol);
font.setBold(0);
screen=-1;
goto wait;
}
switch(screen) {
case 0: showStatus(); showCID(); checkCIDhack(); break;
case 1: showCSD(); showOCR(); break;
case 2: showPartTab(); break;
case 3: showFileSystem(); break;
}
wait:
int bt;
if(screen>=0) while((bt = checkButton())==0 && millis()-ms<15000);
else while((bt = checkButton())==0);
ms = millis();
if(screen<0) { screen=0; return; }
if(bt<0) {
while((bt = checkButton())<0);
screen=0;
if(++colSet>1) colSet=0;
setColorSet(colSet);
}
if(++screen>=4) screen=0;
}
Scetch added
I have a display with ST7789 (it's from the 7735 family) and I've never managed to get it to work with the Bluepill.
Apparently the length of the cables is very critical, according to what I've read.
Try to use the shortest cables possible (I didn't do it....)
The recent version of the STM32 core for Arduino had some drastic adjustments to the way the pinouts of the different variants are accessed. This affects, among other things, the operation of the libraries that originally work for Arduino boards.
A few years ago, some STM32 board enthusiasts created their own cores, trying to achieve greater simplicity in the pinout. One of the cores, which in my opinion is the most impressive, is the one created by user Danieleff. Unfortunately, these days, the core is no longer supported. It is fully functional in the Arduino IDE 1.8.19.
Over time, I was able to get some SPI displays working, but not the regular ones, but some that include a real graphics chip, like the FT813. I acquired several STM32 boards, including an F411 and an F446RE. I enabled both variants in the Danieleff core. Due to work, I've abandoned the project; however, I can tell you that the ST7735 could work with the F103. You just have to be very careful about which SPI ports you want to use, as they are sensitive to the pinout order. Check that the pin definitions are compatible with the TFT library you want to use.
Good pills, the better F4 series more better than F1
Simple Test pin cable for develop 10-30 cm dupont for maket pcb... Thats working fine, you doing some wrong
Testing a touch ST7735, with the official Adafruit library for ST7735/ST7789 with the aforementioned F446RE, TFT on SPI-1
VCC 3v3
GND GND
CS PA4
Reset PB9
DC PB8
Mosi PA7
Sck PA5
Led/Bkl 3v3
Setup ST7735
#if defined(ARDUINO_FEATHER_ESP32) // Feather Huzzah32
#define TFT_CS 14
#define TFT_RST 15
#define TFT_DC 32
#elif defined(ESP8266)
#define TFT_CS 4
#define TFT_RST 16
#define TFT_DC 5
#else
// For the breakout board, you can use any 2 or 3 pins.
// These pins will also work for the 1.8" TFT shield.
#define TFT_CS PA4 //STM32 SPI-1
#define TFT_RST PB9
#define TFT_DC PB8
#endif
Example: graphicstest
Black F446RE
Arduino IDE 1.8.19
It could be, but I don't have any issues with other displays, and this one works fine with other boards (Arduino, ESP32/8266, RPi Pico).
I just shared what I read in case it was helpful.
Regards.
can you try test my scetch or bin?!
what about test >?
Why would I try something you say doesn't work?
I want to understand, maybe my hardware doesn't work
As I said, I never managed to get that screen to work with my Bluepill, although it works perfectly with other boards (in fact, right now it's working very well with a RPi Pico).