Arduino STM32F103C8+ST7735 1.8’'3D矢量图形demo
- 开源项目地址:
https://github.com/cbm80amiga/ST7735_3d_filled_vector
- 所需库:
https://github.com/cbm80amiga/Arduino_ST7735_STM
- 本开源工程基于Arduino开发平台,stm32f103C8T6,跑3D矢量图形。
- ⚡例程和库是基于
rogerclarkmelbourne
固件平台使用的: https://github.com/rogerclarkmelbourne/arduino_stm32
- 显示效果:
- 个人所使用的ST7735 1.8’’ 128X160屏幕:
合宙1.8寸TFTLCD 分辨率128*160 驱动IC ST7735S SPI串口
⛳编译说明
- 再次强调说明一次:本例程是基于
rogerclarkmelbourne
固件平台: https://github.com/rogerclarkmelbourne/arduino_stm32
,如果使用https://github.com/stm32duino
固件平台是无法通过编译的,依赖库是基于前者固件平台编写的。
接线说明
LCD pin |
LCD pin name |
STM32 |
#01 |
LED/BL |
3.3V |
#02 |
SCK |
PA5/SCK |
#03 |
SCA |
PA7/MOSI |
#04 |
A0/DC |
PA1 or any digital |
#05 |
RESET |
PA0 or any digital |
#06 |
CS |
PA2 or any digital |
#07 |
GND |
GND |
#08 |
VCC |
3.3V |
demo说明
默认是十字3D图形,可以通过PB9按键改变显示图形。一共4个图形可循环切换显示。
主程序代码
#define SCR_WD 128
#define SCR_HT 160
#define WD_3D 128
#define HT_3D 128
#include
#include
#if (__STM32F1__)
#define TFT_CS PA2
#define TFT_DC PA1
#define TFT_RST PA0
#include
#else
#define TFT_CS 10
#define TFT_DC 8
#define TFT_RST 9
#endif
Arduino_ST7735 lcd = Arduino_ST7735(TFT_DC, TFT_RST, TFT_CS);
#define BUTTON PB9
int buttonState;
int prevState = HIGH;
long btDebounce = 30;
long btMultiClick = 600;
long btLongClick = 500;
long btLongerClick = 2000;
long btTime = 0, btTime2 = 0;
int clickCnt = 1;
int checkButton()
{
int state = digitalRead(BUTTON);
if( state == LOW && prevState == HIGH ) { btTime = millis(); prevState = state; return 0; }
if( state == HIGH && prevState == LOW ) {
prevState = state;
if( millis()-btTime >= btDebounce && millis()-btTime < btLongClick ) {
if( millis()-btTime2<btMultiClick ) clickCnt++; else clickCnt=1;
btTime2 = millis();
return clickCnt;
}
}
if( state == LOW && millis()-btTime >= btLongerClick ) { prevState = state; return -2; }
if( state == LOW && millis()-btTime >= btLongClick ) { prevState = state; return -1; }
return 0;
}
int prevButtonState=0;
int handleButton()
{
prevButtonState = buttonState;
buttonState = checkButton();
return buttonState;
}
int bgMode=3;
int object=1;
int bfCull=1;
#include "pat2.h"
#include "pat7.h"
#include "pat8.h"
#include "gfx3d.h"
void setup()
{
Serial.begin(115200);
pinMode(BUTTON, INPUT_PULLUP);
lcd.init();
lcd.fillScreen(BLACK);
lcd.setTextColor(YELLOW,BLACK);
initStars();
}
unsigned int ms,msMin=1000,msMax=0;
char txt[30];
void loop()
{
handleButton();
if(buttonState<0 && prevButtonState>=0 && ++bgMode>4) bgMode=0;
if(buttonState>0) {
if(++object>3) object=0;
msMin=1000;
msMax=0;
}
switch(object) {
case 0:
numVerts = numVerts1;
verts = (int16_t*)verts1;
numQuads = numQuads1;
quads = (int16_t*)quads1;
quadColor = (uint16_t*)quadColor1;
bfCull = 1;
break;
case 1:
numVerts = numVerts2;
verts = (int16_t*)verts2;
numQuads = numQuads2;
quads = (int16_t*)quads2;
quadColor = (uint16_t*)quadColor2;
bfCull = 1;
break;
case 2:
default:
numVerts = numVerts3;
verts = (int16_t*)verts3;
numQuads = numQuads3;
quads = (int16_t*)quads3;
quadColor = (uint16_t*)quadColor3;
bfCull = 1;
break;
case 3:
numVerts = numVerts4;
verts = (int16_t*)verts4;
numQuads = numQuads4;
quads = (int16_t*)quads4;
quadColor = (uint16_t*)quadColor4;
bfCull = 0;
break;
}
ms=millis();
render3D();
ms=millis()-ms;
if(ms<msMin) msMin=ms;
if(ms>msMax) msMax=ms;
snprintf(txt,30,"%d ms %d fps ",ms,1000/ms);
lcd.setTextColor(YELLOW,BLACK); lcd.setCursor(0,SCR_HT-28); lcd.print(txt);
snprintf(txt,30,"%d-%d ms %d-%d fps ",msMin,msMax,1000/msMax,1000/msMin);
lcd.setTextColor(GREEN,BLACK); lcd.setCursor(0,SCR_HT-18); lcd.print(txt);
snprintf(txt,30,"total/vis %d / %d ",numQuads,numVisible);
lcd.setTextColor(MAGENTA,BLACK); lcd.setCursor(0,SCR_HT-8); lcd.print(txt);
}
工程和所需库
- 需要自行安装rogerclarkmelbourne
固件平台:
https://github.com/rogerclarkmelbourne/arduino_stm32
链接:https:
提取码:0h0t