Кнопки и светодиоды в одной матрице

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

По идее на 1й и 2й столбец подается лог 1 и ловим его на строках определяя где сработало напряжение проходит через разделительные диоды. Дальше когда переходим к управлению светодиодами нам нужно убрать лог 1 с кнопок а дальше мы подаем лог 1 на 3й или 4й столбец и на нужной строке выставляем по идее лог 0 а значит нам надо перенастроить строки с ввода на вывод прямо в процессе опроса?

а чем тут такого
12 13 14 15 поочередно выход в LOW и читай 17 и 18 (они должны быль PullUp).
12 13 14 15 поочередно выход в LOW и 8 и/или 9 выход в HIGH - зажигает нужный диод.

2 лайка

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

клавиатуру читать получается со светодиодами что то не получается подскажите пожалуйста как правильно

//===========================================================
//Кнопки
//stroki-0, stroki-1, stroki-2, stroki-3 поочередно выход в LOW 
//и читай stolbci_button-0 и stolbci_button-1 (они должны быль PullUp).
//
//Светодиоды
//stroki-0, stroki-1, stroki-2, stroki-3 поочередно выход в LOW 
//и stolbci_led-0 и/или stolbci_led-1 выход в HIGH - зажигает нужный диод.
//===========================================================
#define ALONE   //режим работы, если не закаменчено выводит кнопку 
                //однократно до ее отпускания, иначе выводит постоянно пока нажато
//===========================================================
const int stroki[] = {6, 7, 8, 9};  //пины строк
const int stolbci_button[] = {2, 3};//пины столбцов кнопок
const int stolbci_led[] = {4, 5};   //пины столбцов светодиодов

const char k4x2_button[4][2] = {   //символы на клавиатуре
  {'1', '2'},
  {'3', '4'},
  {'5', '6'},
  {'7', '8'}
};
//===========================================================
void setup() 
{
  for(int i = 0; i <= 3; i++) //выставляем пины строк на выход, столбцов на вход
  {
    pinMode(stroki[i], OUTPUT);    //настроим строки на выход
    digitalWrite(stroki[i], HIGH); //установим на всех строкахи HIGH
  }
  
  for(int s = 0; s <= 1; s++) //выставляем пины строк на выход, столбцов на вход
  {
    //установим столбцы кнопок на вход и включим подтяжку HIGH
    pinMode(stolbci_button[s], INPUT_PULLUP);

    //установим столбцы светодиодов на выход и установим на всех пинах LOW
    pinMode(stolbci_led[s], OUTPUT);
    digitalWrite(stolbci_led[s], LOW);
  }
  
  Serial.begin(9600);
  Serial.println("Raciya");
}
//===========================================================
void loop() 
{
  char a = GetKey4x2(); //опрашиваем клавиатуру
  digitalWrite(stolbci_led[0], HIGH); //тест светодиодов
  
  if(a != 0)           //если кнопка была нажата выводим ее в порт
  {                    
    Serial.print(a);
  }
}
//===========================================================
char GetKey4x2() 
{
  static unsigned long timer;
  static char old_a;
  char a = 0;
  
  //пауза для опроса передает 1, сам опрос возврвщает 0 если 
  //не нажато или символ, если нажато
  if((timer + 50) > millis()) return 0;  
  
  for(byte p = 0; p <= 3; p++)//последовательно выставляем по одной строке в LOW 
  {    
    digitalWrite(stroki[p], LOW);
    
    for(byte m = 0; m <= 1; m++) //и считываем столбцы вылавнивая где LOW происходит
    {
      if(!digitalRead(stolbci_button[m])) 
      {
        a = k4x2_button[p][m];//считываем соотвествующий символ для комбинации столбца и строки
      }
    }
    
    digitalWrite(stroki[p], HIGH);    //возвращем строку в HIGH и крутим дальше
  }
  
  timer = millis();
  
#ifdef ALONE                     //отсекаем удержание (если нужно)
  if (a == old_a) return 0;
  old_a = a;
#endif
  return a;
}
//===========================================================

а что именно не получается?

Чтобы зажечь светодиод, нужно установить его столбец в HIGH, а строку в LOW. Естественно OUTPUT

Ну какие лог уровни подать чтобы зажечь я сразу знал мне непонятень программный алгоритм получается мне надо написать вторую функцию управления светодиодами и вызывать ее после опроса клавиатуры? Если она будет идти под опросом Клавы то опрос Клавы намаремя останавливать не нужно? Чтобы две функции неборолись за пины строк :thinking: наверно можно взять за основу принцип динамической индикации семисегментных индикаторов я прав?

Это готовое устройство оно работало но подростки спален мк. Мк был заменен на новый но теперь надо написать свой аналог прошивки пользуясь известным алгоритмом работв . вся сложность что я раньше не пробовал использовать в одной матрице кнопки и светодиоды и мне немного непонятно как будут использоваться общие ножки строк.

Да. Опросили кнопки > 10ms > зажгли нужный диод > 10ms, и.т.д

нужно вв функцию опроса клавиатуры включить зажигание светодиодов,

А вот тут я немного не соображу как это реализовать я думал просто написать вторую функцию управления светодиодом и вызывать ее под функцией клавиатуры и так как у нас последовательное выполнение кода то оно должно работать

Спасибо надо попробовать

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

for(byte p = 0; p <= 3; p++)//последовательно выставляем по одной строке в LOW 
  {    
    digitalWrite(stroki[p], LOW);
    
    for(byte m = 0; m <= 1; m++) //и считываем столбцы вылавнивая где LOW происходит
    { digitalWrite( stolbci_led[m], natrix[p][m]);
      if(!digitalRead(stolbci_button[m])) 
      {
        a = k4x2_button[p][m];//считываем соотвествующий символ для комбинации столбца и строки
      }
    }
    
    digitalWrite(stroki[p], HIGH);    //возвращем строку в HIGH и крутим дальше
  }
1 лайк