EdgeAligned 70 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба [\смахнул скупую слезу] Эх, и я когда-то так же писал и думал, что "теперь понимаю, как оно работает"🙂 На самом деле это только вершина айсберга в плане вывода инфы на ЖКИ. По-хорошему, нужно иметь непрерывно работающий (на таймере) формирователь импульсов для ЖКИ, который получает информацию о включенных сегментах из массива, составленного знакогенератором, который, в свою очередь, получил информацию об отображаемых цифрах Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pjatruha 10 26 сентября, 2023 Опубликовано 26 сентября, 2023 · Жалоба EdgeAligned, я с вами соглашусь. Сейчас занимаюсь оптимизацией написанного кода и все больше понимаю, что как-то у меня все не так 🙂 Нет ли у вас ссылочки на подобные программы знакогенераторов. Я бы с удовольствием ознакомился с этой информацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 128 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба Ссылочек нет, могу показать кусочки своих. Правда у меня были индикаторы с одной подложкой, но знакогенератор от этого не меняется. Из совсем старого (чистый 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__ 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
izerg 9 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба 9 hours ago, Pjatruha said: Сейчас занимаюсь оптимизацией написанного кода и все больше понимаю, что как-то у меня все не так 🙂 С опытом будет понимание как должно быть. 9 hours ago, Pjatruha said: Нет ли у вас ссылочки на подобные программы знакогенераторов. Я бы с удовольствием ознакомился с этой информацией. Готовые программы генераторы сейчас больше вреда принесут, чем пользы. Сейчас лучшее - карандаш, бумага, excel 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pjatruha 10 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба 6 часов назад, Сергей Борщ сказал: могу показать кусочки своих. Большое спасибо. А я, честно говоря, подумал, что знакогенератор должен формировать символы на лету... Получается, что-то отдаленно похожее на ваш знакогенератор и я хотел написать, но немного по другому. У меня код должен быть гораздо длиннее 🙂 Хотел создать алфавит(если можно так назвать). Т.е написать подпрограмму, в которой будут описаны все цифры(или даже буквы) для каждого разряда. Для каждой цифры своя процедура. А в основной программе вызывать уже необходимую процедуру для отображения конкретной цифры. А т.к. код получается слишком длинный, то хотел вынести это в отдельный фаил(только я еще не знаю как это сделать). Спойлер Создал таблицу По этой таблице составлял цифры. Например, единица в первом разряде выглядит так: 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба таблица не полная какая-то или я что-то не понимаю если D5 - D12 сегмент "а" второго разряда, то где сегменты "а" остальных двух разрядов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pjatruha 10 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба 26 минут назад, mitya1698 сказал: таблица не полная какая-то Вполне возможно. Таблицу-то я рисовал для себя. 🙂 Читать ее нужно так: Для засветки сегмента "Вилка"(или может это рука, не знаю что это) на вывод D5 нужно подать противоположный сигнал относительно сигнала поданного на D9. все остальные сегментные линии должны иметь такой же сигнал как на D9. Смотрите код - думаю, там будет понятней. 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба с вилкой понятно, а как включить "a" первого и третьего разрядов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
destroit 9 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба 12 минут назад, Pjatruha сказал: Читать ее нужно так Это больше напоминает дипломную работу выпускника - отличника коррекционной школы ... все стебутся, а вы = ведётесь ... ну не ваше это всё . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pjatruha 10 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба 20 минут назад, mitya1698 сказал: с вилкой понятно, а как включить "a" Что значит "а" ? Не понимаю вопроса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 51 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба On 9/27/2023 at 7:51 PM, mitya1698 said: с вилкой понятно, а как включить "a" первого и третьего разрядов? 8-12 и 14-12 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 27 сентября, 2023 Опубликовано 27 сентября, 2023 · Жалоба о действительно 🙂 Ну похоже что полная 21 сегмент как раз, не считая вилок ложек 🙂 В 27.09.2023 в 20:13, Pjatruha сказал: Что значит "а" Сегменты индикаторов принято называть буквами Точку еще часто называют h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pjatruha 10 28 сентября, 2023 Опубликовано 28 сентября, 2023 · Жалоба 10 часов назад, mitya1698 сказал: Сегменты индикаторов принято называть буквами Ах вот вы о чем... Не знал этого. Спасибо за пояснение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 70 28 сентября, 2023 Опубликовано 28 сентября, 2023 · Жалоба Ну и для более продвинутого уровня программирования прочтите книжку "Язык программирования Си" авторов Ритчи и Кернигана. Это разработчики языка. Книжка есть в инете. Потому как для дальнейшего создания программы потребуется написание функций и передача в них параметров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pjatruha 10 29 сентября, 2023 Опубликовано 29 сентября, 2023 · Жалоба В 27.09.2023 в 20:04, destroit сказал: все стебутся, а вы = ведётесь Как бы там не было, эти люди помогли мне разобраться и я им благодарен. 15 часов назад, EdgeAligned сказал: прочтите книжку "Язык программирования Си" Спасибо за совет. Скачал ее практически сразу как пришел сюда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться