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

Матричная Клавиатура


Azerhud

Рекомендуемые сообщения

Здравствуйте. В просторах интернета нашёл схемку с прошивкой для матричной клавиатуры с отображением на семисегментный индикатор. (рисунок)

А это код к нему:

#include <avr/io.h>
#include <util/delay.h>
// Массив значений для порта вывода
unsigned char key_tab[4] = {0xFE,0xFD,0xFB,0xF7};

// Функция опроса клавиатуры
unsigned char scan_key(void)
{
unsigned char key_value = 0;
unsigned char i;
for(i = 0;i < 4;i++)
{
PORTB = key_tab[i]; // выводим лог. 0 в порт вывода
_delay_us(10);
 switch (PINB & 0xF0)
 {
 case 0b11100000:key_value = 1 + i * 3; return (key_value);
 case 0b11010000:key_value = 2 + i * 3; return (key_value);
 case 0b10110000:key_value = 3 + i * 3; return (key_value);
 default:
 break;
 }
}
return (key_value);
}



int main(void)
{
// массив цифр для индикатора
unsigned char num[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

DDRB = 0x0F;
PORTB = 0xF0; // Устанавливаем лог. 1 в порт ввода
DDRD = 0xFF; // Выход на индикатор
PORTD = 0x00;

_delay_ms(10);

while(1)
{
if(scan_key()==1) // Выводим значение нажатой кнопки на индикатор
PORTD = num[1];
if(scan_key()==2)
PORTD = num[2];
if(scan_key()==3)
PORTD = num[3];
if(scan_key()==4)
PORTD = num[4];
if(scan_key()==5)
PORTD = num[5];
if(scan_key()==6)
PORTD = num[6];
if(scan_key()==7)
PORTD = num[7];
if(scan_key()==8)
PORTD = num[8];
if(scan_key()==9)
PORTD = num[9];
if(scan_key()==11)
PORTD = num[0];
}
}

Так вот, перерыл весь интернет но никак не могу найти такой код, что б можно было выводить на семисегментный четырёх разрядный индикатор. То есть в данном случаи код выводит только 1,2,3 и тд. А мне нужно 22,333,5555 и тд. и тп. А так же передать эти числа в переменную $temp. например $temp=7512; Помогите пожалуйста...

post-95730-0-33084200-1460196778_thumb.png

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Вызывать опрос клавиатуры с такой частотой - плохая идея, лучше вызывать по таймеру или в бесконечном цикле и сохранять в переменную.

Возможно, этот результат стоит преобразовать в число или символ с клавиатуры, например, 0-9, '*', '#'.

Для сохранения нескольких нажатий можно хранить в массиве либо многобайтном числе, зависит от способа ввода и дальнейшего использования. Рекомендую задуматься как определять что ввод числа закончен, как удалить неправильно введенную цифру и т.д.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ежели на просторах тырнету нету такого кода, надо его написать. Заводите переменную, в которой будет ваше число и счетчик нажатий до 4. Каждый раз при нажатии на клавишу умножаете старое значение вашего числа на 10 и добавляеете новое. Выводите на индикатор опосля каждого нажатия. Одновременно инкрементируете счотчик нажатий.

Вы будете первым!

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

....Для сохранения нескольких нажатий можно хранить в массиве либо многобайтном числе...

Вот об этом и я не могу найти как это сделать... остальное пока не важно.

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вариант с массивом: заводите массив нужного размера, например, 4 элемента для 4-разрядного числа. При нажатии на кнопку записываете в ячейку с заданным номером цифру с кнопки и увеличиваете номер. Отслеживать нажатие на кнопку можно сравнивая ее состояние с сохраненным предыдущим либо просто по таймеру, но этот вариант годится только для редкого опроса, пол-герца или около того.

Вариант с многобайтным числом: при нажатии на кнопку увеличиваете число в 10 раз и прибавляете цифру с кнопки.

Пример кода писать не буду, лучше если сами напишите, полезнее будет.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Попробую. Суть ясна. Осталось воплотить... :) Проблема в том что с момента как начал учить Си ещё и месяца не прошло :( Пытаюсь учится на конкретных задачах, которые сам себе ставлю...

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

"...А мне нужно 22,333,5555 и тд. и тп. А так же передать эти числа в переменную $temp. например $temp=7512; Помогите пожалуйста... ..." - тут все просто - судя по вопросу - НУЖНО - в раздел работа, не нужно - УЧИСЬ ... у меня ребенок сидит и сам "си с плючами" грызет ... без "пАмАхИте" ... и это потому, что он хочет научиться ... а готовое - в разделе РАБОТА ...

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

"...А мне нужно 22,333,5555 и тд. и тп. А так же передать эти числа в переменную $temp. например $temp=7512; Помогите пожалуйста... ..." - тут все просто - судя по вопросу - НУЖНО - в раздел работа, не нужно - УЧИСЬ ... у меня ребенок сидит и сам "си с плючами" грызет ... без "пАмАхИте" ... и это потому, что он хочет научиться ... а готовое - в разделе РАБОТА ...

Я не прошу что то сделать вместо меня! А хочу увидеть рабочие примеры... Мой ребёнок просто с друзьями в футбол играет..

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

Это радует. Я там забыл упомянуть, что проще будет опрашивать по столбцам, а не по строкам, так будет всего 3 итерации вместо 4, да и умножение на 4 занимает 2 такта вместо 3 умножения на 3. Если делать по-человечески, разумеется, или если компилятор не затупит.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Эту статью я первым делом увидел, вот как раз его и пытаюсь в более упрощённом виде повторить....

ЗЫ: Кстати она для LCD дисплея, а я хочу под семисегментный.....

И он отображает только один знак, 1,2,3, А,В и тд..

Изменено пользователем Azerhud
Ссылка на комментарий
Поделиться на другие сайты

Что клавиатура, что дисплей слишком простые устройства, чтобы обязательно копировать чужое. Попробуйте написать свою библиотеку. Можете описать алгоритм опроса клавиатуры? А работы с семисегментным дисплеем? Попробуйте написать свою версию, если будете что-то делать самостоятельно вам помогут. Ну а адаптировать чужое иногда сложнее.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

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

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

Цель задачи такова: Собрать счётчик витков с предустановкой количества витков. Дисплей должен быть семисегментный четырёхразрядный. Клавиатура матричная 4х3. Работает таким образом. Через клавиатуру задаём количество витков, к примеру 7852. Как я понимаю, Этот параметр должен записаться в ОЗУ МК. И отобразится на индекаторе. После чего нажимаем кнопку старт и команда идёт на пуск двигателя. Через герконовый датчик (или датчик холла) Получаем импульсы. -1. То есть счёт идёт на уменьшение, после достижения 0000 идёт команда на стоп. Как я понял, вводимые с клавиатуры цифры должны занестись в некий массив с которого попадут в ОЗУ а от туда будут считаны на дисплей, вот по этому мне и нужна переменная $temp. Уже второй день копаюсь в интернете ноне могу найти примеров как в массив передать значение клавиатуры. И ещё, допустим я создал массив key[4] и как то передал в неё значения key[0]=7, key[1]=8. key[2]=5. key[3]=2 то смогу ли создать переменную temp = key. И передать её дальше в виде temp=7852?

PS: Грубо говоря это всем известный счётчик витков на калькуляторе :)

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

Неужели десятичная или любая другая позиционная запись числа является откровением? 123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0. Та же и с вашей переменной: temp = key[0]*1000 + key[1]*100 + key[2]*10 + key[3]*1; Альтернативный вариант - реализовать "длинную арифметику" вручную. То есть по событию от геркона уменьшаете key[3], если он оказался меньше нуля, записываем туда 9 и уменьшаем key[2]. Если key[2] оказался меньше нуля... и так далее.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

  • 3 недели спустя...

И снова здравствуйте. Что то больно трудно мне даётся этот Си :)

Суть такова. Исходя из того что вычерпал из интернета изменил код. На конец более менее понял как подключить клавиатуру к моему коду, но опять грабли :(

Проблема в том что при нажатии на кнопки у меня вводятся значения только с 0 по 9 а выше не идут. Хотя если я указываю в массиве вместо 0х07 - 0х16 то на дисплее выводится цифра 22. то есть у меня всё ещё проблема с переменными, посоветуйте пожалуйста..... :umnik2:

//#define F_CPU 7372800UL // Частота кварца
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>

// Массив значений для порта вывода
unsigned char key_tab[4] = {0b11111110,
				 0b11111101,
				 0b11111011,
				 0b11110111};
// Функция опроса клавиатуры
unsigned char scan_key(void)
{
unsigned char key_value = 0;
unsigned char i;
for(i = 0;i < 4;i++)
{
PORTD = key_tab[i]; // выводим лог. 0 в порт вывода
_delay_us(10);
switch (PIND & 0xF0)
{
case 0xE0:key_value = 1 + i * 3;
return (key_value);
case 0xD0:key_value = 2 + i * 3;
return (key_value);
case 0xB0:key_value = 3 + i * 3;
return (key_value);
default:
break;
}
}
return (key_value);
}
volatile unsigned int test =0;
void dig_out(int num); // Объявление функции вывода на индикатор
int main(void)
{
// Настройка портов
DDRB=0xFF; //Порт В сигменты индикатора
DDRC = 0x0F; //Порт С разряды
// массив цифр для индикатора
unsigned char num[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x16, 0x08, 0x09};
DDRD |= (1 << PD3)|(1 << PD2)|(1 << PD1)|(1 << PD0); // Порт вывода
DDRD &= ~(1 << PD7)|(1 << PD6)|(1 << PD5)|(1 << PD4); // Порт ввода
PORTD = 0xF0; // Устанавливаем лог. 1 в порт ввода
_delay_ms(10);


while(1)
{
if(scan_key()==1) // Выводим значение нажатой кнопки на индикатор
test = num[1];
if(scan_key()==2)
test = num[2];
if(scan_key()==3)
test = num[3];
if(scan_key()==4)
test = num[4];
if(scan_key()==5)
test = num[5];
if(scan_key()==6)
test = num[6];
if(scan_key()==7)
test = num[7];
if(scan_key()==8)
test = num[8];
if(scan_key()==9)
test = num[9];
if(scan_key()==11)
test = num[0];

/Здесь пробую увеличить значение с клавиатуры
if(scan_key()>10){
test=10+num[];}
if(scan_key()>100){
test=100+num[];}
if(scan_key()>1000){
test=1000+num[];}

//****************************************************
dig_out(test); //Постоянно вызываем функцию вывода текущего числа
}
}
void dig_out(int num) // Функция для вывода на индикатор 4-х разрядов
{
unsigned char i = 0; // Переменная счетчика
unsigned char raz = 1; // Номер разряда
unsigned char dig_num[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02,
0x78, 0x00, 0x10}; // Коды цифр для индикатора с общим анодом
unsigned char dig[] = {0, 0, 0, 0}; // Массив для значения разряда

if(num < 10) // Для заполнения нулями левых разрядов
{
dig[0] =0;
dig[1] =0;
dig[2] =0;
}

if(num < 100) // Для заполнения нулями левых разрядов
{
dig[0] =0;
dig[1] =0;
}

if(num < 1000) // Для заполнения нулями левых разрядов
{
dig[0] =0;
}

while(num > 999) // Получение количества тысяч
{
dig[0]++;
num -= 1000;
}

while(num > 99) // Получение количества сотен
{
dig[1]++;
num -= 100;
}

while(num > 9) // Получение числа десятков
{
dig[2]++;
num -= 10;
}

dig[3] = num; // Получения количества единиц

while(raz <= 0x10) // Крутимся пока не заполним все 4 разряда
{
PORTC = raz; // Выбираем разряд
PORTB = dig_num[dig[i]]; // Выводим цифру
raz = raz<<1; // Сдвигаемся на следующий разряд
i++; // Увеличиваем индекс следующей цифры
_delay_ms(1); // Задержка 1 мс
}
}

post-95730-0-14292300-1461932661.jpg

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

Форматирования как не было, так и нет. Для определения нажатой кнопки все также сотню раз вызывается процедура опроса. Весь "код" перемешан, нет разделения на блоки.

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

#define SEG_A 1
#define SEG_B 2
...
PROGMEM const char numbers[]={
 (1<<SEG_A | 1<<SEG_B | 1<<SEG_C | 1<<SEG_D | 1<<SEG_E | 1<<SEG_F),
 (1<<SEG_A | 1<<SEG_,
...
};
volatile char video_buffer[3];

Опрос клавиатуры тоже стоит проводить по таймеру, одна строка (или столбец, неважно) за один вызов.

Отдельно стоит вынести перевод числа в последовательность символов (аналог функции itoa(), printf() и подобных).

Ограничительные резисторы на сегментах в модели не нужны, они только замедляют симуляцию. Не забудьте поставить в реальной схеме.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Форматирования как не было, так и нет. Для определения нажатой кнопки все также сотню раз вызывается процедура опроса. Весь "код" перемешан, нет разделения на блоки.

Попробуйте все-таки начать с начала.......

Большое спасибо что откликнулись. Похоже мне не стоило начинать изучение программирование микроконтроллеров. У меня такое ощущение что я учусь в первом классе и вместо арифметики пытаюсь решить задачи тригонометрия.... К примеру форматирование- что я с ним должен сделать, если программа AVR Studio 5 сама его так форматирует? А для определение нажатой кнопки использую то что вычитал и нашёл в интернете. На счёт перемешивания кода, согласен. Но почему то некоторые переменные вывожу за пределы main или while и они перестают работать.. :( Наверно не за своё дело взялся. Спасибо Всем что помогли...

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

Код счётчика на семисегментном индикаторе от 0000 до 9999. В переменную volatile unsigned int test =0; можно задать любое начальное значение отсчёта. test+=1; прямой отсчёт. test-=1; обратный. Если смогу найти сайт где я этот код взял обязательно выложу ссылку. Может кому пригодится...

//#define F_CPU 7372800UL // Частота кварца
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <string.h>
volatile unsigned int test =0;
ISR(INT0_vect) // Обработчик прерывания по совпадению таймера 1
{
test++;
// Увеличить выводимое число
if(test > 9999) test = 0; // Если вышел за пределы четырех разрядов, обнулить
TCNT1H=0x00; // Сброс регистра
TCNT1L=0x00; // счета
}
void dig_out(int num); // Объявление функции вывода на индикатор
int main(void)
{
// Настройка портов
DDRB=0xFF; //Порт В сигменты индикатора
DDRC = 0x0F; //Порт С разряды
DDRD = 0x04; // Порт D PD2 вход
PORTD=0x04; // // Порт D PD2 подключаем подтягивающий резистор
//инициализация прерывания
GICR |= 0x40;//0x40 = 0b01000000 разрешить прерывания на int0
MCUCR |= 0x3;//0x3 = 0b00000011 прерывания по фронту int0
sei();//разрешить все прерывания, cli()- запретить


while(1)
{
dig_out(test); //Постоянно вызываем функцию вывода текущего числа
}
}
void dig_out(int num) // Функция для вывода на индикатор 4-х разрядов
{
unsigned char i = 0; // Переменная счетчика
unsigned char raz = 1; // Номер разряда
unsigned char dig_num[] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02,
0x78, 0x00, 0x10}; // Коды цифр для индикатора с общим анодом
unsigned char dig[] = {0, 0, 0, 0}; // Массив для значения разряда

if(num < 10) // Для заполнения нулями левых разрядов
{
dig[0] =0;
dig[1] =0;
dig[2] =0;
}

if(num < 100) // Для заполнения нулями левых разрядов
{
dig[0] =0;
dig[1] =0;
}

if(num < 1000) // Для заполнения нулями левых разрядов
{
dig[0] =0;
}

while(num > 999) // Получение количества тысяч
{
dig[0]++;
num -= 1000;
}

while(num > 99) // Получение количества сотен
{
dig[1]++;
num -= 100;
}

while(num > 9) // Получение числа десятков
{
dig[2]++;
num -= 10;
}

dig[3] = num; // Получения количества единиц

while(raz <= 0x10) // Крутимся пока не заполним все 4 разряда
{
PORTC = raz; // Выбираем разряд
PORTB = dig_num[dig[i]]; // Выводим цифру
raz = raz<<1; // Сдвигаемся на следующий разряд
i++; // Увеличиваем индекс следующей цифры
_delay_ms(1); // Задержка 1 мс
}
}

PS: Нашёл http://www.avrki.ru/articles/content/led_display/index.php.. Я просто немного переделал его, что б считал импульсы.

Изменено пользователем Azerhud
Ссылка на комментарий
Поделиться на другие сайты

Студия самостоятельно убирает отступы? С трудом верится, хотя я только с 4.18 дело имел. Встречал какой-то бейсик, навязывающий свои представления о форматировании, но тут даже такого нет. Все-таки попробуйте хотя бы ставить отступы в каждом блоке кода, чем больше вложенность, тем больше отступов. Некоторые используют 1-4 пробела или табуляцию, строгого стандарта нет.

На счет "тригонометрии" не совсем так. Вроде прерыванием вы пользуетесь, портов не пугаетесь. Нормальное оформление семисегментного индикатора и клавиатуры были бы логичным следующим шагом. Но их стоит оформить как несколько функций, чтобы можно было менять одну, не трогая остальные.

Как улучшить читаемость массива сегментов я уже показал, но еще важнее как для вас, так и для окружающих, научиться настраивать переферию сдвигами и логическими операциями, а не магическими шестнадцатеричными числами. Это понятно, они выглядят круто, по-компьютерному, но вот понять что они означают трудно. Вот, например

GICR |= 0x40;//0x40 = 0b01000000 разрешить прерывания на int0

MCUCR |= 0x3;//0x3 = 0b00000011 прерывания по фронту int0

GICR = (1<<INT0); //вроде, GICR и MCUCR больше нигде не используются. Тогда проще присвоить им константу, чем менять отдельные биты.
MCUCR = (1<<ISC01 | 1<<ISC00); //прерывание Int0 по нарастающему фронту

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

писал из головы, сразу сюда, не проверял, могут быть ошибки

#include <avr/io.h>
#include <avr/pgmspace.h>

#define SEG_A 1 //кстати, вот эти макросы для упрощения разводки платы: можно поменять любые сегменты местами, заменив их только тут, не меняя коды цифр
#define SEG_B 2
...
PROGMEM const char numbers[]={
 ~(1<<SEG_A | 1<<SEG_B | 1<<SEG_C | 1<<SEG_D | 1<<SEG_E | 1<<SEG_F),
 ~(1<<SEG_A | 1<<SEG_,
...
};
PROGMEM const digits[]={(1<<0), (1<<1), (1<<2), (1<<3)};

volatile char video_buffer[4];

//обновление одного разряда на семисегментном индикаторе
ISR(TIMER0_OVF_vect){
 static char dig_num = 0; //модификатор static означает, что переменная не будет уничтожена при выходе из функции (или, в данном случае, из прерывания), а сохранит свое предыдущее значение
 PORTC &=~(1<<0 | 1<<1 | 1<<2 | 1<<3); //важный момент - гасим все сегменты (или разряды) перед их изменением. Иначе на разрядах будут появляться "отсветы" предыдущих
 PORTB = video_buffer[ dig_num ];
 PORTC |= pgm_read_byte( &digits[ dig_num ] );
 dig_num++;
 if( dig_num > 3 )dig_num=0;
}
//инициализация семисегментного индикатора
//поскольку PORTC занят индикатором лишь частично, не будем менять значение неиспользуемых выводов
void Init_7seg(){
 DDRC |= (1<<0 | 1<<1 | 1<<2 | 1<<3);
 DDRB = 0xFF;
}
//вывод числа на семисегментный индикатор. Если оно больше 9999, в старшем разряде может появиться непойми что
void out_int(unsigned int val){
 video_buffer[3] = pgm_read_byte( &numbers[ val % 10 ] );
 val = val / 10; //поскольку val передано по значению, а не по ссылке, его можно спокойно менять, внешний код этого не заметит
 video_buffer[2] = pgm_read_byte( &numbers[ val % 10 ] );
 val = val / 10;
 video_buffer[1] = pgm_read_byte( &numbers[ val % 10 ] );
 video_buffer[0] = pgm_read_byte( &numbers[ val / 10 ] );
}

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

post-151375-0-76919800-1462011620_thumb.jpg

Проверьте, всё ли так как надо.

* - пуск мотора

# - стоп мотора

Изменено пользователем солар

Я не раздаю удочки. Я продаю рыбу.

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

Проверьте, всё ли так как надо.

:) Спасибо большое. Если честно, это почти то к чему я стремлюсь. Но проблема в том что я сам хочу дойти до этого.

1. Научится отображать динамическую индикацию...

2, Научиться как выводить значения из клавиатуры формате 1, 11, 111, 1111

3, Заставить из введенного значения отнимать 0,5, 1 или 2 по внешнему прерыванию

и тд и тп. А у Вас уже готовый код. ...

Но всё равно большое спасибо за пример.

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

...Заставить...

Не, надо просто на ушко прошептать: -Пожалуйста. :) Оно само начнёт работать как нужно. А заставлять - толку мало.

Я не раздаю удочки. Я продаю рыбу.

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • @musa56 Вы думаете катайцы будут изгалятся и ставить что-то круче попуоярных NEC или RC-5? Маловероятно
    • Это у вас на пульте кнопочки. На усилитель приходит кодовая посылка внутри которой зашиты эти нажатия и выделить их еще та проблема и готового решения вы не найдете. Ну кро-ж знает какой протокол обмена между устройствами. А он не такой уж и простой и вряд ли вам кто его скажет
    • Как вариант сыграть в лотерею и найти любой регулятор громкости с таким-же ДУ как у вашего усилителя. И просто поставить рядом не подключая ничего кроме питания.
    • если уж делать приблуду то с шахматами и поэтессами - прикрутить к VU-метру IR диод и часы, и чтоб в назначенное время при пробитии заданного уровня давал команды на открутку уровня громкости вниз :-) еще проще - по часам включается релюшка и добавляет второй резистор на входе - и максимальная громкость будет настроена на ночные часы. тогда нужен обычный таймер коих тьма
    • Piotr__1, вы  меня правильно поняли. А идея приблуды считающей команды с пульта, пусть и плохая, но легче решаемая, кмк. С враньём разберусь. Нажал на пульте кнопку Х цифра на 1 увеличилась, на Y нажал-уменьшилась. И отрицательные значения не нужны. Может есть что готовое на Али или у Мастер-Кит?
    • Во время установки Widows создаёт скрытые разделы, в которые прописывает некую служебную информацию. Если во время установки эти разделы не удалить, (раз доступный объём не изменился),наводит на мысль, что возможно 10-ка берёт объём оттуда . И, да желательно всё-же модель материнки поточнее, AIDA пишет серию плат, которые могут различаться даже в пределах разных ревизий.
    • @Доктор Вовху А, то есть вы хотите ДОБАВИТЬ к усилителю индикатор ТЕКУЩЕГО состояниия его встроенного регулятора? Тогда имеет смысл посмотреть что у вас внутри усилителя накручено, можно будет сделать все по уму. А идея приблуды считающей команды с пульта - ниже среднего, постоянно будет врать и сбиваться.
×
×
  • Создать...