пятница, 15 сентября 2023 г.

Дисплей на tm1637 и его применение в Microchip Studio с микроконтроллерами AVR на примере Attiny13



            В данной статье я расскажу о дисплее на основе микросхемы TM1637 и библиотеки для его использования в среде Microchip Studio.

            Данный модуль включает в себя микросхему TM1637 к которой подключен четырехразрядный семисегментный индикатор с двоеточием без точек после каждого из разрядов:

            Принципиальная электрическая схема модуля представлена ниже. Для подключения к микроконтроллеру или Arduino используются 4 вывода: VCC, GND для подключения питания и CLK, DIO для управления микросхемой TM1637:



            Теперь перейдем к программной части. Для управления модулем на основе микросхемы TM1637 в среде Microchip Studio я рекомендую использовать библиотеку, разработанную Łukasz Marcin Podkalicki. Вот ссылка на его Github.


            На всякий случай сохранил библиотеку себе на google диск.


            ДАННАЯ БИБЛИОТЕКА ПОЗВОЛЯЕТ:

- отображать цифры и управлять двоеточием на семисегментном индикаторе

- управлять определенными сегментами в пределах одного знака на индикаторе

- включать/выключать свечение семисегментного индикатора 

- регулировать яркость семисегментного индикатора


            Библиотека отлично работает с микроконтроллерами семейства attiny (как заявляет автор библиотеки ATtiny13, ATtiny25, ATtiny45, ATtiny85) и как и предыдущая библиотека этого автора с atmega (при условии подключения TM1638 к порту B микроконтроллера)


            Как подключить библиотеку я подробно описал в статье «Как подключить к Microchip/Atmel Studio библиотеку», но перед этим в файле tm1637.h в строках, которые после «// Main Settings» необходимо задать выводы микроконтроллера к которым подключены пины, или же подключить их так, как прописано в программе: 

// Main Settings
#define	TM1637_DIO_PIN			PB0
#define	TM1637_CLK_PIN			PB1


         Перед тем как начать использовать устройство на TM1638 его нужно инициализировать. Инициализация выполняется командой TM1637_init(state, brightness_value)

где state – состояние дисплея после инициализации (1 или 0) 1 – включено, 0 – выключено

       brightness_value – яркость свечения дисплея (от 0 до 7) 0 – минимальная, 7 – максимальная

Пример использования:

TM1638_init(1/*enable*/, 6 /*brighness*/);
//или TM1638_init(1, 6);


            После инициализации TM1638 для управления модулем используются следующие команды:

TM1637_clear() - Очистка (выключение) всех сегментов дисплея, включая двоеточие.

Пример:

TM1637_clear(); //Очистить дисплей


TM1637_enable(state) – включение/отключение свечения дисплея, где state управляет свечением дисплея (1 или 0) 1 – включено, 0 – выключено, например:

TM1638_enable(0); //Выключить свечение семисегментных индикаторов
TM1638_enable(1); //Включить свечение семисегментных индикаторов


TM1637_set_brightness(brightness_value) – задание яркости свечения светодиодного семисегментного дисплея, где brightness_value значение яркости от 0(минимум) до 7(максимум)

Например:

TM1638_set_brightness(4); // установить яркость дисплея на 4 из 7


TM1637_display_digit(position, digit) – вывод цифры в определенный разряд на семисегментный дисплей, где

    position – разряд на дисплее (от 0 до 3), куда будет выведена цифра.

    digit – цифра, которая будет выведена в разряд(от 0 до 9)

например:

TM1637_display_digit(0,2); // Высести цифру "2" в разряд 0
TM1637_display_digit(1,0); // Высести цифру "0" в разряд 1
TM1637_display_digit(2,2); // Высести цифру "2" в разряд 2
TM1637_display_digit(3,3); // Высести цифру "3" в разряд 3



TM1637_display_colon() – управление свечением двоеточия на дисплее (1 или 0) 1 – включено, 0 – выключено

    Заметил, что данная команда более-менее корректно работает только совместно с TM1637_display_digit. При использовании ее без этой во втором разряде зажигается «8»:

 

Хотя в идеале должно быть так:

  


 Пример использования команды:

TM1637_display_colon(1); //включить двоеточие


TM1637_display_segments(position, segments) – включение определенных сегментов на определенном разряде семисегментного дисплея, где 

    position – разряд на дисплее (от 1 до 8), на котором будут включаться сегменты.

    segments – число, каждый бит которого в двоичном виде соответствует определенному сегменту дисплея. Если бит установлен в 1 – сегмент светится, в 0 – не светится: 


                Т.е. если нужно засветить символ «H», то segments=0b01110110, если нужен символ «-», то segments=0b01000000.


                Двоеточием управляет восьмой бит в разряде, после которого оно идет (т.е. во втором разряде из четырех или первом, если считать с нуля) – 0b10000000. Если он установлен в 1 – сегмент светится, в 0 – не светится. По причине описанной в предыдущем пункте не рекомендую совместно с TM1638_display_segments использовать команду включения двоеточия - TM1637_display_colon

Примеры использования данной команды:

TM1637_display_segments(0, 0b01110011); //Буква "Р"
TM1637_display_segments(1, 0b00111111); //Буква "О"
TM1637_display_segments(2, 0b00111001);  //Буква "С"
TM1637_display_segments(3, 0b01110111);  //Буква "А"


На этом пока все. До новых встреч!


2 комментария:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Здравствуйте! никак не могу подключить индикатор к atinny13/ Вроде бы, все делаю правильно, подключаю в соответствии с

    // Main Settings
    #define TM1637_DIO_PIN PB0
    #define TM1637_CLK_PIN PB1

    не забыв про + и GND. Но дисплей не работает. Библиотеку установил.
    Вот текст программы из папки
    "refactoring"


    /**
    * Copyright (c) 2018, Łukasz Marcin Podkalicki
    *
    * This is ATtiny13 "Running Digits, Dots and LEDs" example using attiny-tm1637-library,
    * https://github.com/lpodkalicki/attiny-tm1637-library .
    */

    #include
    #include
    #include
    #include "tm1638.h"

    static uint8_t scan_keys_demo(void);
    static void digits_and_dots_demo(uint8_t n);
    static void leds_demo(uint8_t n);

    int
    main(void)
    {
    uint8_t n = 0, k = 0, keys;

    /* setup */
    TM1638_init(1/*enable*/, 3/*brighness*/);

    /* loop */
    while (1) {
    keys = scan_keys_demo();
    if ((k % 10) == 0) {
    digits_and_dots_demo(n);
    if (!keys) {
    leds_demo(n);
    }
    n++;
    }
    k++;
    _delay_ms(30);
    }
    }

    uint8_t
    scan_keys_demo(void)
    {
    uint8_t i, keys;

    keys = TM1638_scan_keys();
    for (i = 0; i < 8; ++i) {
    TM1638_set_led((i + 1) % 8, !!(keys & (1 << i)));
    }

    return keys;
    }

    void
    digits_and_dots_demo(uint8_t n)
    {
    uint8_t i;

    for (i = 0; i < 8; ++i) {
    TM1638_display_digit(i, (n + i) % 0x10, !!(n % 0x02));
    }
    }

    void
    leds_demo(uint8_t n)
    {
    uint8_t i;

    for (i = 0; i < 8; ++i) {
    TM1638_set_led(i, !!((i + n) % 0x02));
    }
    }


    с этой программой не работает.

    если не трудно, приведите, пожалуйста, полный текст программы. Заранее спасибо.

    ОтветитьУдалить

Страниц (4)1234 Вперёд