Шрифт больших цифр для дисплея 1602

Искал шрифт больших цифр, всё не нравилось. Сделал свой, может кому-то пригодится. Код прилагается.

ну и код для тестирования прилагается, только подключение поменяй, у меня был не по I2C промышленный дисплей. Кстати, есть ещё 2 ячейки памяти свободных, можно напридумывать.

#include <LiquidCrystal.h>

// Подключение: RS-12, E-11, D4-5, D5-4, D6-3, D7-2
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// сегменты 
byte BL[8] = {B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111}; // блок закрашенный целиком (не используется)
byte VB[8] = {B11111, B11111, B11111, B00000, B00000, B00000, B00000, B00000}; // верхний большой
byte NB[8] = {B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111}; // Нижний большой
byte VNM[8] = {B11111, B11111, B00000, B00000, B00000, B00000, B11111, B11111}; // верхний и нижний малый
byte VM[8] = {B11111, B11111, B00000, B00000, B00000, B00000, B00000, B00000}; // верхний малый 
byte NM[8] = {B00000, B00000, B00000, B00000, B00000, B00000, B11111, B11111}; // нижний малый
byte BLK[8] = {B01110, B11111, B11111, B11111, B11111, B11111, B11111, B01110}; // блок целиком скруглённые углы
byte MB[8] = {B11111, B00000, B11011, B00000, B11011, B00000, B11011, B11111}; // может быть что угодно (не используется)

int hours = 12; // выставить часы
int minutes = 34; // выставить минуты
bool colonVisible = true; // переменная двоичная для смены точек

void setup() {
  lcd.begin(16, 2); // инициализируем дисплей

  // Регистрируем 8 символов 
  lcd.createChar(0, BL);
  lcd.createChar(1, VB);
  lcd.createChar(2, NB);
  lcd.createChar(3, VNM);
  lcd.createChar(4, VM);
  lcd.createChar(5, NM);
  lcd.createChar(6, BLK);
  lcd.createChar(7, MB);

  lcd.clear();
}

void showDigit(int digit, int pos) { // функция показывает цифру
  switch (digit) {
    case 0:
      lcd.setCursor(pos, 0); lcd.write((byte)6); lcd.write((byte)1); lcd.write((byte)6); // 6-1-6 первоя строка заполнится 
      lcd.setCursor(pos, 1); lcd.write((byte)6); lcd.write((byte)2); lcd.write((byte)6);
      break;
    case 1:
      lcd.setCursor(pos, 0); lcd.print(" "); lcd.write((byte)6); lcd.print(" ");
      lcd.setCursor(pos, 1); lcd.print(" "); lcd.write((byte)6); lcd.print(" ");
      break;
    case 2:
      lcd.setCursor(pos, 0); lcd.write((byte)1); lcd.write((byte)3); lcd.write((byte)6);
      lcd.setCursor(pos, 1); lcd.write((byte)6); lcd.write((byte)5); lcd.write((byte)2);
      break;
    case 3:
      lcd.setCursor(pos, 0); lcd.write((byte)1); lcd.write((byte)3); lcd.write((byte)6);
      lcd.setCursor(pos, 1); lcd.write((byte)2); lcd.write((byte)5); lcd.write((byte)6);
      break;
    case 4:
      lcd.setCursor(pos, 0); lcd.write((byte)6); lcd.write((byte)2); lcd.write((byte)6);
      lcd.setCursor(pos, 1); lcd.print(" "); lcd.print(" "); lcd.write((byte)6);
      break;
    case 5:
      lcd.setCursor(pos, 0); lcd.write((byte)6); lcd.write((byte)3); lcd.write((byte)1);
      lcd.setCursor(pos, 1); lcd.write((byte)2); lcd.write((byte)5); lcd.write((byte)6);
      break;
    case 6:
      lcd.setCursor(pos, 0); lcd.write((byte)6); lcd.write((byte)3); lcd.write((byte)1);
      lcd.setCursor(pos, 1); lcd.write((byte)6); lcd.write((byte)2); lcd.write((byte)6);
      break;
    case 7:
      lcd.setCursor(pos, 0); lcd.write((byte)1); lcd.write((byte)4); lcd.write((byte)6);
      lcd.setCursor(pos, 1); lcd.print(" "); lcd.print(" "); lcd.write((byte)6);
      break;
    case 8:
      lcd.setCursor(pos, 0); lcd.write((byte)6); lcd.write((byte)3); lcd.write((byte)6);
      lcd.setCursor(pos, 1); lcd.write((byte)6); lcd.write((byte)2); lcd.write((byte)6);
      break;
    case 9:
      lcd.setCursor(pos, 0); lcd.write((byte)6); lcd.write((byte)3); lcd.write((byte)6);
      lcd.setCursor(pos, 1); lcd.write((byte)2); lcd.write((byte)5); lcd.write((byte)6);
      break;
  }
}

void loop() {
  // Часы
  
  // showDigit(1, 1);
  // showDigit(6, 4);
  showDigit(hours / 10, 0);
  showDigit(hours % 10, 4); // Немного плотнее к краю

  // Анимированные плюсики
  if (colonVisible) {
    lcd.setCursor(7, 0); lcd.print("* ");
    lcd.setCursor(7, 1); lcd.print(" *");
  } else {
    lcd.setCursor(7, 0); lcd.print(" *");
    lcd.setCursor(7, 1); lcd.print("* ");
  }

  // // Минуты
  // showDigit(7, 9);
  // showDigit(8, 12);
  showDigit(minutes / 10, 9);
  showDigit(minutes % 10, 13);

  delay(1000);
  colonVisible = !colonVisible;
  
  minutes++;
  if (minutes >= 60) { minutes = 0; hours++; }
  if (hours >= 24) { hours = 0; }
}

У тебя получится!

Добавить комментарий