Страница 1 из 1

Обработка кнопки

Добавлено: 13 апр 2018, 06:52
Шариков
Всем добрый день.

Имеется код:

Код: Выделить всё

// include the library code:
#include <LiquidCrystal.h>
 
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
int colls=0;
volatile byte UDDelay=0;
volatile byte DDelay=0;
volatile byte BUpStatus=0, BUpPstatus=0, k=0;
volatile byte BDownStatus=0, BDownPStasus=0;
volatile bool BUpProc = false, BDnProc = true;
byte PowerLevel=0;
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
 
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("POWER MANAGMENT:");
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  BUpProc=false;
}
 
void loop() {
 
 BUpStatus = digitalRead(6);
 lcd.setCursor(colls, 1);
 lcd.print('               ');   
 lcd.setCursor(colls, 1);
 lcd.print(BUpStatus);   

 lcd.print("  1   ");   

 if (not BUpProc) {
  lcd.print(BUpPstatus);
  }   
 
  if (BUpStatus=0) {
     lcd.setCursor(11, 1);
     lcd.print("E"); 
     lcd.print(BUpStatus); 
   
     if (BUpPstatus=0) {
     lcd.setCursor(13, 1);
     lcd.print("Y"); 
     if (not BUpProc) {
     UDDelay=millis(); 
     BUpProc=true;
     lcd.setCursor(6, 1);
     lcd.print("        УУУУУУУ "); 
     } 
   }
  }
 
  if (BUpStatus=1) {
     lcd.setCursor(11, 1);
     lcd.print("o"); 
     lcd.print(BUpStatus); 
   
     if (BUpPstatus=0) {
     lcd.setCursor(13, 1);
     lcd.print("Y"); 
     if (not BUpProc) {
     UDDelay=millis(); 
     BUpProc=true;
     lcd.setCursor(6, 1);
     lcd.print("        УУУУУУУ "); 
     } 
   }
  }
 delay(500);
}


Это часть некоего кода обработки двух кнопок. Не стал весь приводить, просто чтоб не перегружать. Суть не в этом.

Код должен работать так:
1. Читаем содержимое пина 6.
2. Выводим на дисплей BUpStatus и через пробелы с единичкой выводим переменную BUpPstatus. Это нужно для того, чтобы понять, что у нас кнопка работает и BUpStatus приобретает статус кнопки.
3. Если кнопка не нажата, то печатаем E+статус кнопки (итого E0) ну и выполняем некоторый другой код.
4. Если кнопка нажата, то печатаем o+статус кнопки (итого о1) ну и тоже выполняем некоторый другой код.
5. Далее все повторяется.

В реальности пока кнопка не нажата на дисплее: 0 1 0 o1, а когда кнопку нажимаем 1 1 0 o1.
Т.е. получается изначально и в дальнейшем он выполняет блок для нажатой кнопки (хотя блин сам вначале пишет, что она 0) независимо от ее состояния, а блок ненажатой кнопки вообще игнорирует.

Что я делаю не так? Или это компилятор мне погоду портит.?

Re: Обработка кнопки

Добавлено: 13 апр 2018, 11:11
alexlaw
Мне кажется у вас перегружен код (много лишнего и не нужного).
Т.е. для простой проверки статуса кнопки у вас несколько десятков строк кода и занятие процессора не нужной работой.
Упростите код до 1, 2 строк.
Вывод на LCD не информативен, (0 1) - вы сами не поймете в каком положении кнопка.

Re: Обработка кнопки

Добавлено: 13 апр 2018, 15:26
Шариков
Вопрос не в этом. Почему условный переход не выполняется? Почему BUpStatus=1 всегда верно, хотя дисплей четко отражает значение BUpStatus как единичное, так и нулевое?

Re: Обработка кнопки

Добавлено: 18 апр 2018, 15:25
InfoTechDep
Привлекли внимание вот эти детали:

1. сомнительное обилие volatile
2. чтение значения int (digitalRead) в переменную размом byte.
3. в остальном тексте нет ли прерываний, связанных с BUpStatus?

Re: Обработка кнопки

Добавлено: 18 апр 2018, 21:41
Эдуард
Здравствуйте!
В условии знак равенства выглядит так ==.

Re: Обработка кнопки

Добавлено: 21 апр 2018, 14:02
Goga-romanov
Здравствуйте подскажите пожалуйста хочу чтобы шд работал от кнопки крутился в одном направлении как написать код или приведите пример пожалуйста