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

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

1 4 9

Ее еще нет. Я написал "сделаю". Ее здесь столько же, сколько в if (start) { }

 

chav1961: #define BUTTON_START 0
#define BUTTON_STOP 1
#define BUTTON_SET 2
#define BUTTON_PLUS 3
#define BUTTON_MINUS 4

Еще здесь мне непонятно для чего присваиваем значениям кнопок от 0 до 4. Для чего они?

И еще вопросик, а нельзя ли сразу в дефайнах записать скан код кнопок, а потом уже внутри программы его как-то обрабатывать?
например
#define BUTTON_START 0b00000100 // кнопка старт

 

Можно. Вместо 0, 1, 2, 3 и 4. Нумерация - совершенно произвольная, важно лишь, чтобы у двух разных кнопок не было одного и того же номера. Скан-коды в этом смысле ничем не хуже нулей, единиц и двоек.

 

Хорошо, а как тогда сделать распознавание в?
if () {}
else

Вот пример из одной программы для сканирования кнопок (просто я рассматриваю разные варианты и разные источники)
// Скан-коды клавиатуры
// PINB
#define KEY_UP 0b00000100
#define KEY_LEFT 0b00001000
#define KEY_ENTER 0b00000010
#define KEY_DOWN 0b00000001
//PIND
#define KEY_RIGHT 0b10000000
#define KEY_START 0b00100000
#define KEY_STOP 0b01000000
.........................
// Макрос чтения клавиатуры
#define ReadKey key=0b00010000; key|=(PINB&0b00001111); key|=(PIND&0b11100000); key^=0xff
Можете мне помоч как он работает?

 

Код забавный Видимо, в этом случае часть кнопок виcела на порту B (линии 0..3) , а часть - на порту D (линии 5..7), кнопки были подключены на землю, а на линиях висели подтягивающие резисторы. Тому, кто это писал, нужно было получить лог.1 в битах, соответствующих нажатым кнопкам, для чего их, естественно, надо было проинвертировать (последний оператор), т.к. при нажатии кнопки сигнал на линии становится лог.0, а не лог.1. Вначале в байт результата заносится состояние четырех младших бит порта B (маска 0b00001111 выделяет только их), затем в полученный результат добавляется состояние трех старших битов порта D (маска 0b11100000 выделяет только их). А неиспользуемый бит 4 результата, чтобы он не "портил картину", заранее взводится в лог.1 (первый оператор), тогда при инверсии он даст лог.0 и все будут довольны (такие приемчики в литературе носят название "антиалгоритмов").
PS. Пока писал, в предыдущем посте появилась доп. информация, так что насчет разводки кнопок я угадал

 

Мне в принципе важно было бы определить в программе нажата кнопка или нет, а какое состояние лог 0 или лог 1 мне нужно в программе я пока не знаю. По умолчанию согласно схемы я получаю лог 1 при ненажатой кнопке, так как порт будет подтянут внутренними резисторами, и лог 0 при нажатии кнопки.
Хм, я думал что самая сложная часть будет инициализация таймера и работа с ним, а оказалось, что я еще сильнее застрял на начальном коде с кнопками

 

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

 

PORTD=0xFF;
DDRD=0x00;

Правильно я написал для порта D установить на порт D как вход подтянутый внутренними резисторами?
Это просто для моего понимания, т.к. по отношению к моей схеме это будет неправильно, т.к. PIND.0 и PIND.1 используется как выходы

 

Да.

 

в моем случае должно быть
PORTD=0b11111100; // пины 2-7 подтянуты резисторами
DDRD=0b00000011; // пины 2-7 вход, 0-1 выход

Правильно?