需要做一个公交车报站器,语音模块还没到,花了一天研究了一下ST7735芯片的屏幕,手上这块是1.44寸的TFT屏幕,翻了半天网络,使用ST7735做实物的比较少,且库不太全。
在Arduino IDE工具→管理库直接搜索并下载,不多赘述。
手上这块是1.44寸的tft屏幕芯片是ST7735,接线方式是SPI,优点就是色彩丰富。
ST7735 | UNO |
---|---|
CS | 10 |
RST | 9 |
DC | 8 |
SLCK | 13 |
MOSI | 11 |
LED | 5V |
VCC | 5V |
GND | GND |
这个库是比较简单,没那么完善的,像clear()
清屏函数也没有,因此使用起来没有12864和LCD1602方便,但对付显示数据,做个电子时钟已经够了。
itR(uint8_t options = INITR_GREENTAB), // 初始化ST7735
setAddrWindow(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1),//设置矩形窗口
pushColor(uint16_t color),//弹出颜色
fillScreen(uint16_t color),//全屏颜色
drawPixel(int16_t x, int16_t y, uint16_t color),//绘制像素点
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color),//绘制直线
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color),//绘制横线
fillRect(int16_t x, int16_t y, int16_t w, int16_t h,uint16_t color),//
fillCircle(int16_t x, int16_t y, int16_t r, uint16_t color),//实心圆
setRotation(uint8_t r),//旋转屏幕
invertDisplay(boolean i);//颜色反转
uint16_t Color565(uint8_t r, uint8_t g, uint8_t b);//color565
/*
* richowe
* uno ST7735 1.44inch clock
*/
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7735.h> // 导入库函数
//#include //中断定时库
#define TFT_CS 10 //定义开发板引脚
#define TFT_RST 9
#define TFT_DC 8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);
#define TFT_SCLK 13
#define TFT_MOSI 11
unsigned long seconds;
int m = 0, h = 0; //时间进位
int second = 0, minute = 0, hour = 0; //时间
int SECOND = 0, MINUTE = 27, HOUR = 20, WEEK = 6;//设置当前时间
int minute1 = MINUTE; //调整时间
void time(){
//时间计算
//tft.invertDisplay(0);//颜色翻转
second = (SECOND + seconds) % 60; //计算秒
m = (SECOND + seconds) / 60; //分钟进位
minute = (MINUTE + m) % 60; //计算分钟
h = (MINUTE + m) / 60; //小时进位
hour = (HOUR + h) % 24; //计算小时
//显示时间
tft.setTextColor(ST7735_YELLOW);//设置字体颜色为黄色
tft.setTextSize(3);//设置字体大小
tft.setCursor(20,10);
hour_greater(); //显示小时
tft.print(":");
minute_greater();
tft.drawFastHLine(0, 40, 128, ST7735_WHITE);//横线
tft.setTextColor(ST7735_YELLOW);
tft.setTextSize(3);//设置字体大小
tft.setCursor(12,50);
week();//显示星期
tft.drawFastHLine(0, 80, 128, ST7735_WHITE);//横线
tft.setCursor(10,90);
tft.setTextSize(2);//设置字体大小
tft.println("2019/12/7");//偷懒了
}
void minute_greater()
{
if(minute<10)
{
tft.print("0");
tft.print(minute);
}
else
{
tft.print(minute);
}
}
void hour_greater()
{
if(hour<10)
{
tft.print("0");
tft.print(hour);
}
else
{
tft.print(hour);
}
}
void week()
{
int w = WEEK;
switch(w)
{
case 1:
tft.println("MONDAY");
break;
case 2:
tft.println("TUESDAY");
break;
case 3:
tft.println("WEDDAY");
break;
case 4:
tft.println("THUDAY");
break;
case 5:
tft.println("FRIDAY");
break;
case 6:
tft.println("SATDAY");
break;
case 7:
tft.println("SUNDAY");
break;
default:
break;
}
}
void setup(){
tft.initR(INITR_144GREENTAB); //初始化
Serial.begin(9600);//设置波特率
tft.fillScreen(ST7735_BLACK);//设置黑屏
tft.setRotation(0);//旋转屏幕0°
}
void modulation()
{
//刷屏调整时间
if(minute1<minute || (minute1==59&&minute==0))
{
tft.fillScreen(ST7735_BLACK);
minute1+=1;
if(minute1 == 60)
{
tft.fillScreen(ST7735_BLACK);
minute1=0;
}
}
if(hour==0)
{
tft.fillScreen(ST7735_BLACK);
WEEK+=1;
if(WEEK==8)
{
tft.fillScreen(ST7735_BLACK);
WEEK=1;
}
}
}
void loop()
{
time();
seconds = millis()/1000; //millis()方法获得uno时间
// MsTimer2::set(1000, time); // 中断设置函数,每 一分钟 进入一次中断
// MsTimer2::start();
modulation();
}
解释一下void modulation()
,这个函数是用于调整59到0的之间的转换;另外,由于没有clear()清除屏幕的这个函数,于是就用tft.fillScreen(ST7735_BLACK);
来重新设置屏幕颜色,实现刷新的功能,这样就可以解决屏幕无法清屏导致显示重叠的现象了。void minute_greater()和void hour_greater()
这个函数是用来补零。
年月日时间偷懒没写了,时间跳转的时候遇到了困难在这里用了比较长时间,得多看源函数。推荐使用的12864!