Свежие обсуждения
Микроконтроллеры

Помогите написать программу цифрового таймера

1 3 9

так, народ. вы меня сейчас окончательно запутаете
Как тогда правильно написать тот код, что я привел на первой странице?
С учетом того, что эти переменные будут отвечать за определения нажатия кнопок

 

Вот цитата из того курса
вместо while(PINB & (1 < n)){
............
примечание - в CVAVR можно написать проще
while(PINB.n){

 

1. По поводу стандарта - тут только Жванецкого можно вспомнить: "Договоритесь с доктором, заплатите нянечке. Но вы можете этого не делать. Если вас не интересует результат".

2. Давайте начнем с того, как Вы дальше собираетесь с этими переменными работать? Я бы лично поступил так:
#define BUTTON_START 0
#define BUTTON_STOP 1
#define BUTTON_SET 2
#define BUTTON_PLUS 3
#define BUTTON_MINUS 4
.....
unsigned char getKey(void)
{ if ((PIND & 0b00000010) == 0) return BUTTON_START;
else if ((PIND & 0b00000100) == 0) return BUTTON_STOP;
.....
и т.д.
}

Теперь можете этой функцией пользоваться:
if (getKey() == BUTTON_START) {делай то}
else {делай другое}

Детали работы с кнопками Вы спрятали в функцию getKey(), всем остальным - глубоко наплевать, на каких именно линиях порта висят кнопки.

 

chav1961: { if ((PIND & 0b00000010) == 0) return BUTTON_START;
че-то я наверное не догоняю, я даташит понял так:
if ((PIND & 0b00000100) == 0) return BUTTON_START;

И еще вопрос по функции unsigned char getKey(void)
ее опрос должен идти постоянно, или только один раз?

 

Функцию опрашивайте (правильнее сказать - вызывайте), как считаете нужным - все зависит от того, как будете реализовывать обработку. С маской я, действительно, напутал.

 

Хм, все равно не пойму чем это лучше записи
#define start PIND.2 // Кнопка СТАРТ

Тогда в программе как только мне надо определить нажатие кнопки я напишу
if (start==0) { }

А если определить так
#define start (PIND.2==0) // Кнопка СТАРТ
то в программе можно написать реакцию так
if (start) { }
А надо будет кнопки переставить, то это просто сделать в #define start PIND.2 // Кнопка СТАРТ
По-моему просто и сердито

 

serg_svd: #define start (PIND.2==0)

Я рекомендую в дефайнах именовать заглавными бквами !

#define START (PIND.2 == 0) или #define START ( ! PIND.2 )

 

1. Это и ни лучше, и не хуже. Просто другой вариант. Речь о том, чтобы по возможности не употреблять конструкции, не входящие в стандарт языка, если им в принципе нет адекватной замены. PIND.2 - это как раз "тот случай".
2. Давайте поразмышляем о том, как Вы будете обрабатывать кнопку "+" и "-". Вот Вы нажали "+" - число увеличилось на единицу. Вот Вы нажали ее еще раз - число увеличилось еще на единицу. Вопрос - а дребезг контактов как Вы будете обрабатывать? Я - сделаю это внутри функции getKey() - И ВСЕ!. Вы будете это дребезг обрабатывать по всей программе. А если еще расширить функции кнопки - например, при длительном нажатии заставить автоматически увеличиваться/уменьшаться счетчик секунд? Функции в С для того и существуют, чтобы внутри них прятать детали реализации, а снаружи - только пользоваться готовым результатом.

 

chav1961: unsigned char getKey(void)
{ if ((PIND & 0b00000010) == 0) return BUTTON_START;
else if ((PIND & 0b00000100) == 0) return BUTTON_STOP;

Как здесь выволнена защита от дребезга?

 

Karados: #define START (PIND.2 == 0) или #define START ( ! PIND.2 )
А это одно и тоже?