解决Arduino使用LCD屏幕制作电子时钟的问题

Arduino LCD屏幕电子时钟

前言

需要做一个公交车报站器,语音模块还没到,花了一天研究了一下ST7735芯片的屏幕,手上这块是1.44寸的TFT屏幕,翻了半天网络,使用ST7735做实物的比较少,且库不太全。

  • Adafruit_GFX.h ,核心库,ST7735.h是基于该库写的。
  • Adafruit_ST7735.h

安装库

在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

Adafruit_ST7735.h库函数语法

这个库是比较简单,没那么完善的,像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 <MsTimer2.h>  //中断定时库  
#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()这个函数是用来补零。

演示

tft

总结

年月日时间偷懒没写了,时间跳转的时候遇到了困难在这里用了比较长时间,得多看源函数。推荐使用的12864!

发布了31 篇原创文章 · 获赞 22 · 访问量 9500

猜你喜欢

转载自blog.csdn.net/richowe/article/details/103439274
今日推荐