Странный 7 сегментный индикатор

Печатные платы, программируемая логика, разработка и изготовление аппаратуры

Moderator: Shaos

Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Странный 7 сегментный индикатор

Post by Mifody »

Привет всем. Помогите разобраться с 7 сегментным индикатором. На вид самый обычный маленький 7 сегментный + точка индикатор на 3 разряда без маркировки, НО, имеет всего 6 выводов, хотя должен иметь 11. Я прозвонил его на предмет внутренних соединений, и вот что получается. Китайцы, видимо для того, чтобы экономить ноги контроллера, к которому этот индикатор подключается, очень хитро соединили внутри светодиоды. Не могу понять, как заставить светиться отдельные сегменты. Ну и вообще выводить на него цифры/буквы. Видимо, есть какая то закономерность, по которой нужно управлять. Набросал по быстрому в протеус 8.1 схемку. Помогите разобраться. Прикрепил изображение под спойлером и файл проекта для протеус 8.1

 
изображение_2022-11-04_163916.png

You do not have the required permissions to view the files attached to this post.
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)
User avatar
FizikS
Maniac
Posts: 264
Joined: 11 Oct 2018 00:52
Location: г. Клинцы, Брянская обл.

Re: Странный 7 сегментный индикатор

Post by FizikS »

Эта схема известна как чарлиплексинг. Почитать можно здесь: https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 0%BD%D0%B3
Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Re: Странный 7 сегментный индикатор

Post by Mifody »

FizikS wrote:Эта схема известна как чарлиплексинг.
Спасибо! Как же я сам не догадался про третье состояние... :oops:
Теперь всё становится на свои места.
Получается, цифры надо выводить посегментно. Ну или комбинациями по несколько сегментов, которые возможны. Да уж, не знал, что это, оказывается, давно уже придумано и имеет название...
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)
Mondx
Doomed
Posts: 504
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Странный 7 сегментный индикатор

Post by Mondx »

imsushka
Maniac
Posts: 231
Joined: 01 Jan 2022 04:34
Location: USSR, Tashkent

Re: Странный 7 сегментный индикатор

Post by imsushka »

https://www.maximintegrated.com/en/desi ... /1880.html

а можно и микруху использовать для таких матриц
Mondx
Doomed
Posts: 504
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Странный 7 сегментный индикатор

Post by Mondx »

Во! Кто бы мог подумать).
Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Re: Странный 7 сегментный индикатор

Post by Mifody »

Mondx wrote:Похож?
Да, один в один!
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)
Mondx
Doomed
Posts: 504
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Странный 7 сегментный индикатор

Post by Mondx »

Можно ещё своих 6 светодиодов добавить к этим же выводам.)
Mifody
Novelist
Posts: 25
Joined: 13 Jun 2013 21:48
Location: г.Зерноград, Ростовская область

Re: Странный 7 сегментный индикатор

Post by Mifody »

Вроде да, можно. Я прямо не смотрел, но вроде там есть ещё свободные комбинации. Но я не буду этого делать. Это мне попалась зарядка для телефона с индикатором напряжения и тока зарядки. И там этот индикатор стоит. Так вот индикация тока в этой зарядке жутко врёт, да и ещё реализована через одно место. Просто подправить шунт для коррекции индикации тока не получается. Ну, китайцы, что тут сказать. А контроллер там стоит без маркировки на 14 ног, и по цоколёвке полностью совпадает с PIC контроллерами на 14 ног. У меня вот завалялся PIC16LF1503, вот хочу не спеша переделать зарядку, чтоб правильно всё показывала. Чисто ради спортивного интереса.
Уже думал, что и китайцы туда PIC поставили, только без маркировки. Но нет, китайский контроллер никак не определяется в программаторе...
ZX-Spectrum 128(краснодарский вариант)+YM+Covox+3,5" FDD+5,25" FDD+Nemo controller+HDD+CD-ROM+PS/2 Keyboard+PS/2 Mouse(остальное в проекте...) (Всё самодельное)
User avatar
Shaos
Admin
Posts: 23992
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Странный 7 сегментный индикатор

Post by Shaos »

FizikS wrote:Эта схема известна как чарлиплексинг. Почитать можно здесь: https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 0%BD%D0%B3
Про "charilieplexing" у нас уже было в 2014 году:

http://www.nedopc.org/forum/viewtopic.php?f=68&t=10827&p=116207&hilit=charlieplexing#p116207
Я тут за главного - если что шлите мыло на me собака shaos точка net
Mondx
Doomed
Posts: 504
Joined: 10 Aug 2022 07:27
Location: Crimea

Re: Странный 7 сегментный индикатор

Post by Mondx »

Mifody wrote:Чисто ради спортивного интереса.
Получилось?
Тренировался как то:

 

Code: Select all

//  Светодиодный чарлиплексинг: 3x8 LED DL3-2532RB-6

#define L1                2
#define L2                3
#define L3                4
#define L4                5
#define L5                6
#define L6                7

#define T_SYS_US          500           //24 * 500 = 12000

#define in(x)             DDRD &= ~(1<<(x))
#define out(x)            DDRD |= 1<<(x)
#define on(x)             PORTD |= 1<<(x)
#define off(x)            PORTD &= ~(1<<(x))


void setup() {
  display(0, false, false);
}


void loop() {
  every_us(T_SYS_US)
    led();

  static uint16_t cnt;                  //тест
  every(500) {
    if (++cnt >= 1000 * 4)
      cnt = 0;
    display(cnt % 1000, cnt >= 1000, cnt >= 2000);
  }
}


const uint8_t pins[] = {                //распиновка: анод, катод
  //a      b      c      d      e      f      g      h
  L3,L2, L4,L2, L2,L5, L6,L2, L5,L2, L2,L3, L2,L4, L1,L2,
  L4,L5, L5,L3, L5,L4, L4,L3, L3,L6, L3,L4, L3,L5, L1,L3,
  L6,L1, L6,L3, L6,L5, L4,L6, L6,L4, L5,L6, L5,L1
};

static uint8_t segment[] = { 0, 0, 0 }; //буфер индикатора


void led() {
  static uint8_t i;                     //индекс на текущий сегмент
  static uint8_t j;                     //индекс буфера (текущее знакоместо)
  static uint8_t mask = 1<<6;           //маска на текущий сегмент в буфере

  off(pins[i]);                         //выключим ранее включенный сегмент
  in(pins[i++]);                        //анод
  in(pins[i++]);                        //катод
  if (i >= sizeof(pins)) {              //на следующий с начала
    i = 0;
    j = 0;
    mask = 1<<7;
  }

  if (segment[j] & mask) {              //включим новый сегмент
    on(pins[i]);
    out(pins[i++]);                     //анод = 1
    out(pins[i--]);                     //катод = 0
  }
  mask >>= 1;                           //новая маска
  if (!mask) {
    mask = 1<<7;
    ++j;
  }
}


const uint8_t font[] = {
 //abcdefgh
  B11111100,                            //0
  B01100000,                            //1
  B11011010,                            //2
  B11110010,                            //3
  B01100110,                            //4
  B10110110,                            //5
  B10111110,                            //6
  B11100000,                            //7
  B11111110,                            //8
  B11110110                             //9
};

// преобразуем в шрифт
static uint8_t getFont(uint8_t bin) {
  return bin <= 9 ? font[bin] : 0;
}


void display(uint16_t bin, bool dot1, bool dot2) {
  segment[0] = getFont(bin / 100) | dot1;
  segment[1] = getFont(bin / 10 % 10) | dot2;
  segment[2] = getFont(bin % 10);
}