• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wyświetlacz 7-segmentowy z TM1637, wyświetlanie kropek
#1
W jaki sposób wyświetlić na wyświetlaczu led z kontrolerem TM1637 wyświetlić kropki? Czy w ogóle biblioteka obsługująca ten wyświetlacz ma taką możliwość? W przykładzie kodu nie są wyświetlane kropki, lecz mi się wydaje, że drugi argument tej funkcji: display.showNumberDec(0, true, 1, 0) jest za to odpowiedzialny, ale nie działa poprawnie. Poniżej wstawiam całą funkcję z przykładów.

#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3

// The amount of time (in milliseconds) between tests
#define TEST_DELAY   2000

const uint8_t SEG_DONE[] = {
    SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,           // d
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
    SEG_C | SEG_E | SEG_G,                           // n
    SEG_A | SEG_D | SEG_E | SEG_F | SEG_G            // E
    };

TM1637Display display(CLK, DIO);

void setup()
{
}

void loop()
{
  int k;
  uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
  display.setBrightness(0x0f);

  // All segments on
  display.setSegments(data);
  delay(TEST_DELAY);

  // Selectively set different digits
  data[0] = 0b01001001;
  data[1] = display.encodeDigit(1);
  data[2] = display.encodeDigit(2);
  data[3] = display.encodeDigit(3);

  for(k = 3; k >= 0; k--) {
    display.setSegments(data, 1, k);
    delay(TEST_DELAY);
    }

  display.setSegments(data+2, 2, 2);
  delay(TEST_DELAY);

  display.setSegments(data+2, 2, 1);
  delay(TEST_DELAY);

  display.setSegments(data+1, 3, 1);
  delay(TEST_DELAY);


  // Show decimal numbers with/without leading zeros
  bool lz = false;
  for (uint8_t z = 0; z < 2; z++) {
    for(k = 0; k < 10000; k += k*4 + 7) {
        display.showNumberDec(k, lz);
        delay(TEST_DELAY);
    }
    lz = true;
  }

  // Show decimal number whose length is smaller than 4
  for(k = 0; k < 4; k++)
    data[k] = 0;
  display.setSegments(data);

    // Run through all the dots
    for(k=0; k <= 4; k++) {
        display.showNumberDecEx(0, (0x80 >> k), true);
        delay(TEST_DELAY);
    }

  display.showNumberDec(153, false, 3, 1);
  delay(TEST_DELAY);
  display.showNumberDec(22, false, 2, 2);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 3);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 2);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 1);
  delay(TEST_DELAY);
  display.showNumberDec(0, true, 1, 0);
  delay(TEST_DELAY);

  // Brightness Test
  for(k = 0; k < 4; k++)
    data[k] = 0xff;
  for(k = 0; k < 7; k++) {
    display.setBrightness(k);
    display.setSegments(data);
    delay(TEST_DELAY);
  }
 
  // On/Off test
  for(k = 0; k < 4; k++) {
    display.setBrightness(7, false);  // Turn off
    display.setSegments(data);
    delay(TEST_DELAY);
    display.setBrightness(7, true); // Turn on
    display.setSegments(data);
    delay(TEST_DELAY);  
  }

  // Done!
  display.setSegments(SEG_DONE);

  while(1);
}
 
Odpowiedź
#2
Kropka to bit nr 7. Wystarczy więc wykonać OR 0x80 na danych segmentów do wyświetlenia gdzie bit0 segment A, bit1 segment B, itd.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0  , Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP, BASIC C-64

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#3
Jeśli korzystasz z biblioteki o której myślę, bo oczywiście mógłbym do Twojej zajrzeć, jeślibyś załączył, to:
Kod:
//! Displayes a decimal number, with dot control
 //!
 //! Dispalyes the given argument as a decimal number. The dots between the digits (or colon)
 //! can be individually controlled
 //!
 //! @param num The number to be shown
 //! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot
 //!        between the digits (or colon mark, as implemented by each module). i.e.
 //!        For displays with dots between each digit:
 //!        * 0.000 (0b10000000)
 //!        * 00.00 (0b01000000)
 //!        * 000.0 (0b00100000)
 //!        * 0.0.0.0 (0b11100000)
 //!        For displays with just a colon:
 //!        * 00:00 (0b01000000)
 //!        For displays with dots and colons colon:
 //!        * 0.0:0.0 (0b11100000)
 //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are
 //!        blank
 //! @param length The number of digits to set. The user must ensure that the number to be shown
 //!        fits to the number of digits requested (for example, if two digits are to be displayed,
 //!        the number must be between 0 to 99)
 //! @param pos The position least significant digit (0 - leftmost, 3 - rightmost)
 void showNumberDecEx(int num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);
 
Odpowiedź
#4
Załączam Big Grin

//! Displayes a decimal number, with dot control
//!
//! Dispalyes the given argument as a decimal number. The dots between the digits (or colon)
//! can be individually controlled
//!
//! @param num The number to be shown
//! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot
//! between the digits (or colon mark, as implemented by each module). i.e.
//! For displays with dots between each digit:
//! * 0.000 (0b10000000)
//! * 00.00 (0b01000000)
//! * 000.0 (0b00100000)
//! * 0.0.0.0 (0b11100000)
//! For displays with just a colon:
//! * 00:00 (0b01000000)
//! For displays with dots and colons colon:
//! * 0.0:0.0 (0b11100000)
//! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are
//! blank
//! @param length The number of digits to set. The user must ensure that the number to be shown
//! fits to the number of digits requested (for example, if two digits are to be displayed,
//! the number must be between 0 to 99)
//! @param pos The position least significant digit (0 - leftmost, 3 - rightmost)
void showNumberDecEx(int num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0);

Jestem tak zwanym samoukiem w arduino i najlepiej bym zrozumiał działanie kropek na jakimś przykładzie. Gdybyś mógł napisać najprostszy program wyświetlający kropkę samemu bym sobie to rozszyfrował Wink
 
Odpowiedź
#5
(28-06-2018, 12:50)Scislov napisał(a): Jestem tak zwanym samoukiem w arduino i najlepiej bym zrozumiał działanie kropek na jakimś przykładzie. Gdybyś mógł napisać najprostszy program wyświetlający kropkę samemu bym sobie to rozszyfrował Wink
Akurat miałem nieprzyjemność pisać soft sterujący tym beznadziejnym kontrolerem. Funkcje skopiowałem z jakieś beznadziejnej biblioteki Arduino i zmodyfikowałem. Niestety żenująca amatorska obsługa została ale co złego to nie na mnie.
Kod:
//----------------------------------------------------------------------//
//                    Jak wyzej ale wyswietla przeciki
//    miejsca przecinków:
//        128 - pierwszy od lewej
//         64 - drugi
//         32 - trzeci
//----------------------------------------------------------------------//
void TM1637Display_showNumberDecEx(int num, uint8_t dots, byte leading_zero, uint8_t length, uint8_t pos)
{
 uint8_t digits[4];
    const static int divisors[] = { 1, 10, 100, 1000 };
    byte leading = true;

    for(int8_t k = 0; k < 4; k++) {
        int divisor = divisors[4 - 1 - k];
        int d = num / divisor;
   uint8_t digit = 0;

        if (d == 0) {
          if (leading_zero || !leading || (k == 3))
              digit = TM1637Display_encodeDigit(d);
          else
              digit = 0;
        }
        else {
            digit = TM1637Display_encodeDigit(d);
            num -= d * divisor;
            leading = false;
        }
   
   // Add the decimal point/colon to the digit
   digit |= (dots & 0x80);
   dots <<= 1;
   
   digits[k] = digit;
    }

    TM1637Display_setSegments(digits + (4 - length), length, pos);
}

A tu jak tego użyć:
Kod:
        TM1637Display_showNumberDecEx(VER, 2<<4, false, 3, 1);

Reszta kodu:
Kod:
void TM1637Display_init()
{
    // Set the pin direction and default value.
    // Both pins are set as inputs, allowing the pull-up resistors to pull them up
 PORT_USI &= ~(1<<PIN_USI_SDA);            // SDA = 0
 PORT_USI &= ~(1<<PIN_USI_SCL);

 DDR_USI  &= ~(1<<PIN_USI_SCL);           // Enable SCL as input (pullup)
 DDR_USI  &= ~(1<<PIN_USI_SDA);           // Enable SDA as input
}


//----------------------------------------------------------------------//
void TM1637Display_bitDelay()
{
    _delay_us(50);
}


//----------------------------------------------------------------------//
void TM1637Display_start()
{
 DDR_USI |= (1<<PIN_USI_SDA);        // SDA = L
 TM1637Display_bitDelay();
}


//----------------------------------------------------------------------//
void TM1637Display_stop()
{
 DDR_USI |= (1<<PIN_USI_SDA);        // SDA = L
    TM1637Display_bitDelay();

 DDR_USI &= ~(1<<PIN_USI_SCL);        // SCK = H
    TM1637Display_bitDelay();

 DDR_USI &= ~(1<<PIN_USI_SDA);        // SDA = H
    TM1637Display_bitDelay();
}


//----------------------------------------------------------------------//
byte TM1637Display_writeByte(uint8_t b)
{
 uint8_t data = b;

 // 8 Data Bits
 for(uint8_t i = 0; i < 8; i++) {
   // CLK low
 DDR_USI |= (1<<PIN_USI_SCL);        // SCK = L
    TM1637Display_bitDelay();


    // Set data bit
   if (data & 0x01)
      DDR_USI &= ~(1<<PIN_USI_SDA);        // SDA = H
   else
      DDR_USI |= (1<<PIN_USI_SDA);        // SDA = L


    TM1637Display_bitDelay();


    // CLK high
 DDR_USI &= ~(1<<PIN_USI_SCL);        // SCK = H
    TM1637Display_bitDelay();

   data = data >> 1;
 }

 // Wait for acknowledge
 // CLK to zero
 DDR_USI |= (1<<PIN_USI_SCL);        // SCK = L
      DDR_USI &= ~(1<<PIN_USI_SDA);        // SDA = H
    TM1637Display_bitDelay();


 // CLK to high
DDR_USI &= ~(1<<PIN_USI_SCL);        // SCK = H
    TM1637Display_bitDelay();
 uint8_t ack = PORT_USI & (1<<PIN_USI_SDA);
 if (ack == 0) DDR_USI |= (1<<PIN_USI_SDA);        // SDA = L



    TM1637Display_bitDelay();
 DDR_USI |= (1<<PIN_USI_SCL);        // SCK = L
    TM1637Display_bitDelay();


 return ack;
}


//----------------------------------------------------------------------//
void TM1637Display_setSegments(const uint8_t segments[], uint8_t length, uint8_t pos)
{
   // Write COMM1
    TM1637Display_start();
    TM1637Display_writeByte(TM1637_I2C_COMM1);
    TM1637Display_stop();

    // Write COMM2 + first digit address
    TM1637Display_start();
    TM1637Display_writeByte(TM1637_I2C_COMM2 + (pos & 0x03));

    // Write the data bytes
    for (uint8_t k=0; k < length; k++)
      TM1637Display_writeByte(segments[k]);

    TM1637Display_stop();

    // Write COMM3 + brightness
    TM1637Display_start();
    TM1637Display_writeByte(TM1637_I2C_COMM3 + (TM1637brightness & 0x0f));
    TM1637Display_stop();
}


//----------------------------------------------------------------------//
void TM1637Display_setBrightness(uint8_t brightness, byte on)
{
    TM1637brightness = (brightness & 0x7) | (on? 0x08 : 0x00);
}


//----------------------------------------------------------------------//
//                    Wyświetla INT na LED
//     wartość
//    wygaszanie zera
//    liczba znaków na LCD
//    pozycja od lewej
//----------------------------------------------------------------------//
void TM1637Display_showNumberDec(int num, byte leading_zero, uint8_t length, uint8_t pos)
{
 TM1637Display_showNumberDecEx(num, 0, leading_zero, length, pos);
}
pewnie nie będzie potrzebna ale daję na wszelki wypadek.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0  , Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP, BASIC C-64

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#6
@Scislov, ... to ... sobie przeczytaj, a nie załączaj mi tego samego, o bosze. No masz ten sam opis, ta sama biblioteka, opis funkcji z dopiskiem Ex, zresztą Pan ES2 wyjaśnił łopatologicznie przykładem. Zrób sobie jakiś kurs, teraz jest wszystko za darmo, tylko brać: https://forbot.pl/blog/kurs-arduino-pods...rsu-id5290 , a na youtubie filmy dla nieumiejących czytać/niewidomych, wiele kanałów również w PL. Chyba że jak jest coś po angielsku to widzisz tylko plamę na kartce, ale przy programowaniu bez podstawowych słów ang. to szybka droga do zniechęcenia - nie da się tyle zakuć bez zrozumienia - Shakespeare.
 
Odpowiedź
#7
Myślę, że panu @Scislov przydałaby sie podstawowa wiedza:
- Co to wyświetlacz 7-segmentów.
- Jak się nim steruje.
- Jak działa dekoder BCD na 7-segmentów np 7447, 74LS247.
- Jak reprezentuje się liczby w mikroprocesorach.
- Konwersje bin-dec-hex.
- Jak skonwertować liczbę na kod 7-segmentów.
- Co to kod ASCII.
- Konwersja ASCII dec-bin-hex.
- Wyświetlanie multiplesowe.
- Magistrala I2C, bo TM1637 to magistrala podobna do I2C, tyle, że 10 razy wolniejsza od najwolniejszej I2C i nie ma adresowania przez co do jednej magistrali w zasadzie nie da się podłączyć kilku układów a  już na pewno nie (przynajmniej nie w prosty sposób) kilu takich samych aby np obsłużyć więcej wyświetlaczy.

Z tą wiedzą, bez problemu zaświeci kropkę a nawet napisze swoją obsługę TM1637 i to na przerwaniach, bo ze względu na powolność komunikacji, obsługa TM1637 bez przerwań nie jest dobrym pomysłem.


PS
Mnie np liczba siedem podoba się z zaświeconym segmentem F dlatego często modyfikuję biblioteki.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0  , Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP, BASIC C-64

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
#8
Chinol miał po prostu atrapy kropek...
 
Odpowiedź
#9
(08-07-2018, 23:26)Scislov napisał(a): Chinol miał po prostu atrapy kropek...

Czego to złodzieje nie wymyślą aby naciągnąć klienta.

Mnie to na razie nie grozi, nie kupuję badziewia (ale moi klienci czasem tak, tyle, ze to nie mój problem). Pewnie niedługo wzrosna cła, skarbówka też jusz się zaczyna czepiać. Dzięki temu chłam nie będzie tak łatwo dostępny.
- uC: ARM Angel , AVR, Z8, PIC, 8051 / CPU: MC680x0  , Z-80, 6502
- CPLD, FPGA, GAL
- GSM, ISDN, ETH, USB, RS232C/485/422
- C, ASM, CUPL, PHP, BASIC C-64

http://er-mik.prv.pl/projekty_avt.php * http://er-mik.prv.pl/ * http://kolejki.prv.pl/

KA-NUCLEO-F411CE Idea , ESP32, Mega2560, UNO PLUS
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości