Привет geektimes. Мне из Китая пришла одна приблуда, схему которой нашёл в сети, и когда рассматривал, обнаружил для себя очень интересную часть, вот она:

image

Так как почти всё порты микроконтроллера заняты, то Китайцы для экономии портов поступили очень хитро, уровень хитрости можете оценить сами.

Пробовал ночью написать функцию для чтения в среде Arduino IDE:

image

Код
#define PIN1 10
#define PIN2 11

#define DOWN 1
#define OK 2
#define UP 3
#define SET 4

void setup()
{
  Serial.begin(9600);
}

char checkKeys()
{ // понеслась

  pinMode(PIN1, OUTPUT);
  digitalWrite(PIN1, LOW);
  pinMode(PIN2, OUTPUT);
  digitalWrite(PIN2, LOW);

  int keysRead = 0;
  for (keysRead = 1; keysRead <= 4; keysRead++) {
    switch (keysRead) {
      case DOWN:
        digitalWrite(PIN1, INPUT_PULLUP); 
        if (digitalRead(PIN1) == false) {

          return DOWN;
        }
      break;

      case OK:
        pinMode(PIN1, OUTPUT);
        digitalWrite(PIN1, LOW);
        digitalWrite(PIN2, INPUT_PULLUP);
        if (digitalRead(PIN2) == false) {

          return OK;
        }
      break;

      case UP:
        pinMode(PIN2, OUTPUT);
        digitalWrite(PIN2, LOW);
        digitalWrite(PIN1, INPUT_PULLUP);
        if (digitalRead(PIN1) == false) {

          return UP;
        }
      break;

      case SET:
        digitalWrite(PIN2, INPUT_PULLUP); 
        if (digitalRead(PIN2) == false) {

          return SET;
        }
      break;
      default:
        return 0;

    }
  }
}


void loop()
{
  int keyScan = checkKeys();
  Serial.print(keyScan);
  Serial.print(" ");
  switch (keyScan) {
    case DOWN:
      Serial.println("DOWN");
      break;
    case OK:
      Serial.println("OK");
      break;
    case UP:
      Serial.println("UP");
      break;
    case SET:
      Serial.println("SET");
      break;
  }

  delay(500);
}



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

Все мои публикации на geektimes.

Комментарии (0)