Перейти к содержанию
    

[\смахнул скупую слезу] Эх, и я когда-то так же писал и думал, что "теперь понимаю, как оно работает"🙂 На самом деле это только вершина айсберга в плане вывода инфы на ЖКИ.
По-хорошему, нужно иметь непрерывно работающий (на таймере) формирователь импульсов для ЖКИ, который получает информацию о включенных сегментах из массива, составленного знакогенератором, который, в свою очередь, получил информацию об отображаемых цифрах

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

EdgeAligned, я с вами соглашусь.

Сейчас занимаюсь оптимизацией написанного кода и все больше понимаю, что как-то у меня все не так 🙂

Нет ли у вас ссылочки на подобные программы знакогенераторов. Я бы с удовольствием ознакомился с этой информацией.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ссылочек нет, могу показать кусочки своих. Правда у меня были индикаторы с одной подложкой, но знакогенератор от этого не меняется.

Из совсем старого (чистый C) :

Спойлер

 

#define	SEG_A	(1<<1)
#define	SEG_B	(1<<0)
#define	SEG_C	(1<<6)
#define	SEG_D	(1<<5)
#define	SEG_E	(1<<4)
#define	SEG_F	(1<<2)
#define	SEG_G	(1<<3)
#define	SEG_H	(1<<7)

#define	DIGIT_0	\
	((1 * SEG_A) | (1 * SEG_B) | (1 * SEG_C) | (1 * SEG_D) | (1 * SEG_E) | (1 * SEG_F) | (0 * SEG_G))	//0
#define	DIGIT_1	\
	((0 * SEG_A) | (1 * SEG_B) | (1 * SEG_C) | (0 * SEG_D) | (0 * SEG_E) | (0 * SEG_F) | (0 * SEG_G))	//1
#define	DIGIT_2	\
	((1 * SEG_A) | (1 * SEG_B) | (0 * SEG_C) | (1 * SEG_D) | (1 * SEG_E) | (0 * SEG_F) | (1 * SEG_G))	//2
#define	DIGIT_3	\
	((1 * SEG_A) | (1 * SEG_B) | (1 * SEG_C) | (1 * SEG_D) | (0 * SEG_E) | (0 * SEG_F) | (1 * SEG_G))	//3
#define	DIGIT_4	\
	((0 * SEG_A) | (1 * SEG_B) | (1 * SEG_C) | (0 * SEG_D) | (0 * SEG_E) | (1 * SEG_F) | (1 * SEG_G))	//4
#define	DIGIT_5	\
	((1 * SEG_A) | (0 * SEG_B) | (1 * SEG_C) | (1 * SEG_D) | (0 * SEG_E) | (1 * SEG_F) | (1 * SEG_G))	//5
#define	DIGIT_6	\
	((1 * SEG_A) | (0 * SEG_B) | (1 * SEG_C) | (1 * SEG_D) | (1 * SEG_E) | (1 * SEG_F) | (1 * SEG_G))	//6
#define	DIGIT_7	\
	((1 * SEG_A) | (1 * SEG_B) | (1 * SEG_C) | (0 * SEG_D) | (0 * SEG_E) | (0 * SEG_F) | (0 * SEG_G))	//7
#define	DIGIT_8	\
	((1 * SEG_A) | (1 * SEG_B) | (1 * SEG_C) | (1 * SEG_D) | (1 * SEG_E) | (1 * SEG_F) | (1 * SEG_G))	//8
#define	DIGIT_9	\
	((1 * SEG_A) | (1 * SEG_B) | (1 * SEG_C) | (1 * SEG_D) | (0 * SEG_E) | (1 * SEG_F) | (1 * SEG_G))	//9

uint8_t const PROGMEM num[] = // Numbers for LCD
{
    DIGIT_0, DIGIT_1, DIGIT_2, DIGIT_3, DIGIT_4,
    DIGIT_5, DIGIT_6, DIGIT_7, DIGIT_8, DIGIT_9,
};

uint16_t LCD_number (uint8_t x) //send number 01..99 to LCD
{
    if(x == NO_CONNECTION)
        return (SEG_G << 8) | (SEG_G);
    if(x >= 100)
        return 0;

    if(x < 10)
        return pgm_read_byte(&num[x])<<8;

    uint8_t tmp = 0;
    while (x >= 10)
    {
        x = x - 10;
        tmp++;
    }
    return pgm_read_byte(&num[tmp]) | (pgm_read_byte(&num[x])<<8);
}

более свежее (плюсы):

Спойлер
#ifndef DISPLAY_H__
#define DISPLAY_H__
#include    <stdint.h>

class display
{
public:
    using raw_data = uint16_t;
    display()
    : Bitmap(0)
    , Refresh_counter(0)
    {}

    void show(uint8_t value);
    void show_dashes()                  { Bitmap = Encode_digit1[10] | Encode_digit2[10]; }
    void blank()                        { Bitmap = 0; }

    raw_data refresh()                  { return ++Refresh_counter & 0x01 ? Bitmap : (~Bitmap); }
private:
    enum
    {
        //     aaa
        //    f   b
        //    f   b
        //     ggg
        //    e   c
        //    e   c
        //     ddd
        NC,
        C1,
        D1,
        E1,
        C2,
        D2,
        E2,
        G2,
        CMN,
        F2,
        A2,
        B2,
        G1,
        F1,
        A1,
        B1,
    };

    uint16_t        Bitmap;
    uint_fast8_t    Refresh_counter;

    static constexpr uint16_t Encode_digit1[] =
    {
        (1 << A1) | (1 << B1) | (1 << C1) | (1 << D1) | (1 << E1) | (1 << F1) | (0 << G1),      // 0
        (0 << A1) | (1 << B1) | (1 << C1) | (0 << D1) | (0 << E1) | (0 << F1) | (0 << G1),      // 1
        (1 << A1) | (1 << B1) | (0 << C1) | (1 << D1) | (1 << E1) | (0 << F1) | (1 << G1),      // 2
        (1 << A1) | (1 << B1) | (1 << C1) | (1 << D1) | (0 << E1) | (0 << F1) | (1 << G1),      // 3
        (0 << A1) | (1 << B1) | (1 << C1) | (0 << D1) | (0 << E1) | (1 << F1) | (1 << G1),      // 4
        (1 << A1) | (0 << B1) | (1 << C1) | (1 << D1) | (0 << E1) | (1 << F1) | (1 << G1),      // 5
        (1 << A1) | (0 << B1) | (1 << C1) | (1 << D1) | (1 << E1) | (1 << F1) | (1 << G1),      // 6
        (1 << A1) | (1 << B1) | (1 << C1) | (0 << D1) | (0 << E1) | (0 << F1) | (0 << G1),      // 7
        (1 << A1) | (1 << B1) | (1 << C1) | (1 << D1) | (1 << E1) | (1 << F1) | (1 << G1),      // 8
        (1 << A1) | (1 << B1) | (1 << C1) | (1 << D1) | (0 << E1) | (1 << F1) | (1 << G1),      // 9
        (0 << A1) | (0 << B1) | (0 << C1) | (0 << D1) | (0 << E1) | (0 << F1) | (1 << G1),      // -
    };

    static constexpr uint16_t Encode_digit2[] =
    {
        (1 << A2) | (1 << B2) | (1 << C2) | (1 << D2) | (1 << E2) | (1 << F2) | (0 << G2),      // 0
        (0 << A2) | (1 << B2) | (1 << C2) | (0 << D2) | (0 << E2) | (0 << F2) | (0 << G2),      // 1
        (1 << A2) | (1 << B2) | (0 << C2) | (1 << D2) | (1 << E2) | (0 << F2) | (1 << G2),      // 2
        (1 << A2) | (1 << B2) | (1 << C2) | (1 << D2) | (0 << E2) | (0 << F2) | (1 << G2),      // 3
        (0 << A2) | (1 << B2) | (1 << C2) | (0 << D2) | (0 << E2) | (1 << F2) | (1 << G2),      // 4
        (1 << A2) | (0 << B2) | (1 << C2) | (1 << D2) | (0 << E2) | (1 << F2) | (1 << G2),      // 5
        (1 << A2) | (0 << B2) | (1 << C2) | (1 << D2) | (1 << E2) | (1 << F2) | (1 << G2),      // 6
        (1 << A2) | (1 << B2) | (1 << C2) | (0 << D2) | (0 << E2) | (0 << F2) | (0 << G2),      // 7
        (1 << A2) | (1 << B2) | (1 << C2) | (1 << D2) | (1 << E2) | (1 << F2) | (1 << G2),      // 8
        (1 << A2) | (1 << B2) | (1 << C2) | (1 << D2) | (0 << E2) | (1 << F2) | (1 << G2),      // 9
        (0 << A2) | (0 << B2) | (0 << C2) | (0 << D2) | (0 << E2) | (0 << F2) | (1 << G2),      // -
    };
};

inline void display::show(uint8_t value)
{
    if(value < 100)
        Bitmap = Encode_digit1[value % 10] | Encode_digit2[value / 10];
    else
        show_dashes();
}

extern display Display;
#endif  // DISPLAY_H__

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Pjatruha said:

Сейчас занимаюсь оптимизацией написанного кода и все больше понимаю, что как-то у меня все не так 🙂

С опытом будет понимание как должно быть.

9 hours ago, Pjatruha said:

Нет ли у вас ссылочки на подобные программы знакогенераторов. Я бы с удовольствием ознакомился с этой информацией.

Готовые программы генераторы  сейчас больше вреда принесут, чем пользы. Сейчас лучшее - карандаш, бумага, excel  🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, Сергей Борщ сказал:

могу показать кусочки своих.

Большое спасибо. А я, честно говоря, подумал, что знакогенератор должен формировать символы на лету...  Получается, что-то отдаленно похожее на ваш знакогенератор и я хотел написать, но немного по другому. У меня код должен быть гораздо длиннее 🙂 Хотел создать алфавит(если можно так назвать). Т.е написать подпрограмму, в которой будут описаны все цифры(или даже буквы) для каждого разряда. Для каждой цифры своя процедура. А в основной программе вызывать уже необходимую процедуру для отображения конкретной цифры. А т.к. код получается слишком длинный, то хотел вынести это в отдельный фаил(только я еще не знаю как это сделать).

Спойлер

Создал таблицу

.thumb.jpg.550361efe9efbc8b7e920cebe1462a2c.jpg

По этой таблице составлял цифры. Например, единица в первом разряде выглядит так: SEG_D14xCOM_D11+SEG_D14xCOM_D10

А в коде это будет выглядеть так:

switch(k)
  {
    case 1:
   
   if (PC_DDR_bit.DDR3 == 1)
     {
        PC_DDR_bit.DDR3 = 0; // Вход com D9
        PC_CR1_bit.C13 = 0; // Подтягивающий резистор отключен
     }
      
   PC_DDR_bit.DDR6 = 1; // Выход com D12
   PC_ODR_bit.ODR6 = 1; // Высокий уровень на выходе
   PC_CR1_bit.C16 = 1; // push-pull
      
     PA_ODR_bit.ODR1 = 1; // seg D6
     PA_ODR_bit.ODR2 = 1; // seg D7
     PA_ODR_bit.ODR3 = 1; // seg D8
     PC_ODR_bit.ODR7 = 1; // seg D13
     PD_ODR_bit.ODR2 = 1; // seg D14
     PD_ODR_bit.ODR6 = 1; // seg D5
     break;
     
     case 2:
       
   PC_DDR_bit.DDR6 = 1; // Выход com D12
   PC_ODR_bit.ODR6 = 0; // Низкий уровень на выходе
   PC_CR1_bit.C16 = 1; // push-pull
      
     PA_ODR_bit.ODR1 = 0; // seg D6
     PA_ODR_bit.ODR2 = 0; // seg D7
     PA_ODR_bit.ODR3 = 0; // seg D8
     PC_ODR_bit.ODR7 = 0; // seg D13
     PD_ODR_bit.ODR2 = 0; // seg D14
     PD_ODR_bit.ODR6 = 0; // seg D5
     break;

     case 3:
       
   PC_DDR_bit.DDR5 = 1; // Выход com D11
   PC_ODR_bit.ODR5 = 1; // Высокий уровень на выходе
   PC_CR1_bit.C15 = 1; // push-pull
   
   PC_DDR_bit.DDR6 = 0; // Вход com D12
   PC_CR1_bit.C16 = 0; // Подтягивающий резистор отключен
      
     PA_ODR_bit.ODR1 = 1; // seg D6
     PA_ODR_bit.ODR2 = 1; // seg D7
     PA_ODR_bit.ODR3 = 1; // seg D8
     PC_ODR_bit.ODR7 = 1; // seg D13
     PD_ODR_bit.ODR2 = 0; // seg D14
     PD_ODR_bit.ODR6 = 1; // seg D5
     break;
     
     case 4:
       
   PC_DDR_bit.DDR5 = 1; // Выход com D11
   PC_ODR_bit.ODR5 = 0; // Низкий уровень на выходе
   PC_CR1_bit.C15 = 1; // push-pull
      
     PA_ODR_bit.ODR1 = 0; // seg D6
     PA_ODR_bit.ODR2 = 0; // seg D7
     PA_ODR_bit.ODR3 = 0; // seg D8
     PC_ODR_bit.ODR7 = 0; // seg D13
     PD_ODR_bit.ODR2 = 1; // seg D14
     PD_ODR_bit.ODR6 = 0; // seg D5
     break;   
     
     case 5:
       
   PC_DDR_bit.DDR4 = 1; // Выход com D10
   PC_ODR_bit.ODR4 = 1; // Высокий уровень на выходе
   PC_CR1_bit.C14 = 0; // push-pull
   
   PC_DDR_bit.DDR5 = 0; // Вход com D11
   PC_CR1_bit.C15 = 0; // Подтягивающий резистор отключен
      
     PA_ODR_bit.ODR1 = 1; // seg D6
     PA_ODR_bit.ODR2 = 1; // seg D7
     PA_ODR_bit.ODR3 = 1; // seg D8
     PC_ODR_bit.ODR7 = 1; // seg D13
     PD_ODR_bit.ODR2 = 0; // seg D14
     PD_ODR_bit.ODR6 = 1; // seg D5
     break;
     
     case 6:
       
   PC_DDR_bit.DDR4 = 1; // Выход com D10
   PC_ODR_bit.ODR4 = 0; // Низкий уровень на выходе
   PC_CR1_bit.C14 = 0; // push-pull
      
     PA_ODR_bit.ODR1 = 0; // seg D6
     PA_ODR_bit.ODR2 = 0; // seg D7
     PA_ODR_bit.ODR3 = 0; // seg D8
     PC_ODR_bit.ODR7 = 0; // seg D13
     PD_ODR_bit.ODR2 = 1; // seg D14
     PD_ODR_bit.ODR6 = 0; // seg D5
     break;
     
     case 7:
       
   PC_DDR_bit.DDR3 = 1; // Выход com D9
   PC_ODR_bit.ODR3 = 1; // Высокий уровень на выходе
   PC_CR1_bit.C13 = 1; // push-pull
      
   PC_DDR_bit.DDR4 = 0; // Вход com D10
   PC_CR1_bit.C14 = 0; // Подтягивающий резистор отключен
      
     PA_ODR_bit.ODR1 = 1; // seg D8
     PA_ODR_bit.ODR2 = 1; // seg D7
     PA_ODR_bit.ODR3 = 1; // seg D8
     PC_ODR_bit.ODR7 = 1; // seg D13
     PD_ODR_bit.ODR2 = 1; // seg D14
     PD_ODR_bit.ODR6 = 1; // seg D5
     break;
     
     case 8:
       
   PC_DDR_bit.DDR3 = 1; // Выход com D9
   PC_ODR_bit.ODR3 = 0; // Низкий уровень на выходе
   PC_CR1_bit.C13 = 1; // push-pull

     PA_ODR_bit.ODR1 = 0; // seg D6
     PA_ODR_bit.ODR2 = 0; // seg D7
     PA_ODR_bit.ODR3 = 0; // seg D8
     PC_ODR_bit.ODR7 = 0; // seg D13
     PD_ODR_bit.ODR2 = 0; // seg D14
     PD_ODR_bit.ODR6 = 0; // seg D5
     break;
  }

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

таблица не полная какая-то или я что-то не понимаю

если D5 - D12  сегмент "а" второго разряда, то где сегменты "а" остальных двух разрядов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 минут назад, mitya1698 сказал:

таблица не полная какая-то

Вполне возможно. Таблицу-то я рисовал для себя. 🙂

Читать ее нужно так:

Для засветки сегмента "Вилка"(или может это рука, не знаю что это) на вывод D5 нужно подать противоположный сигнал относительно сигнала поданного на D9. все остальные сегментные линии должны иметь такой же сигнал как на D9. Смотрите код - думаю, там будет понятней. 🙂

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 минут назад, Pjatruha сказал:

Читать ее нужно так

Это больше напоминает дипломную работу выпускника - отличника коррекционной школы ... все стебутся, а вы  = ведётесь ... ну не ваше это всё .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, mitya1698 сказал:

с вилкой понятно, а как включить  "a"

Что значит "а" ? Не понимаю вопроса.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 9/27/2023 at 7:51 PM, mitya1698 said:

с вилкой понятно, а как включить  "a" первого и третьего разрядов?

8-12 и 14-12

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

о действительно 🙂  Ну похоже что полная 21 сегмент как раз, не считая вилок ложек 🙂

В 27.09.2023 в 20:13, Pjatruha сказал:

Что значит "а"

Сегменты индикаторов принято называть буквами

i?id=51cf3d882adc27faccc3b7061bb50889ce253abb-9149535-images-thumbs&n=13

Точку еще часто называют h

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, mitya1698 сказал:

Сегменты индикаторов принято называть буквами

Ах вот вы о чем... Не знал этого. Спасибо за пояснение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и для более продвинутого уровня программирования прочтите книжку "Язык программирования Си" авторов Ритчи и Кернигана. Это разработчики языка. Книжка есть в инете.
Потому как для дальнейшего создания программы потребуется написание функций и передача в них параметров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 27.09.2023 в 20:04, destroit сказал:

все стебутся, а вы  = ведётесь

Как бы там не было, эти люди помогли мне разобраться и я им благодарен.

15 часов назад, EdgeAligned сказал:

прочтите книжку "Язык программирования Си"

Спасибо за совет. Скачал ее практически сразу как пришел сюда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...