Урок 21
Часть 5
Управление DS1307 кнопками
Продолжим работать с обеспечением возможности интерактивного редактирования показателей регистров микросхемы DS1307.
В предыдущей части нашего занятия мы написали код для редактирования показателей всех регистров данной микросхемы.
Теперь для полной профессиональности нам осталось провести борьбу с дребезгом контактов.
Для этого мы создадим отдельную функцию отслеживания состояний определенной кнопки. Разместим её сразу после функции редактирования показателей регистров
//—————————————-
char ButtonPress (char index)
{
}
//—————————————-
В данной функции в качестве входящего аргумента будет номер кнопки, а возвратом будет статус кнопки.
Добавим несколько локальных переменных в данную функцию
char ButtonPress (char index)
{
char result=0,butcount=0,butstate=0;
Добавим с помощью оператора switch варианты трёх кнопок
char result=0,butcount=0,butstate=0;
switch(index){
case 1:
break;
case 2:
break;
case 3:
break;
}
И из проекта урока 9 Test06 мы скопируем код и немного подправим его во всех кейсах.
case 1:
while(butstate==0)
{
if (!(BUTTONPIN&(1<<BUTTONPIN1))) //Кнопка 1 нажата
{
if (butcount < 5)
{
butcount++;
}
else
{
result=1;
butstate=1;
}
}
else
{
if (butcount > 0)
{
butcount—;
}
else
{
butstate=1;
}
}
}
break;
case 2:
while(butstate==0)
{
if (!(BUTTONPIN&(1<<BUTTONPIN2))) //Кнопка 2 нажата
{
if (butcount < 5)
{
butcount++;
}
else
{
result=2;
butstate=1;
}
}
else
{
if (butcount > 0)
{
butcount—;
}
else
{
butstate=1;
}
}
}
break;
case 3:
while(butstate==0)
{
if (!(BUTTONPIN&(1<<BUTTONPIN3))) //Кнопка 3 нажата
{
if (butcount < 5)
{
butcount++;
}
else
{
result=3;
butstate=1;
}
}
else
{
if (butcount > 0)
{
butcount—;
}
else
{
butstate=1;
}
}
}
break;
Как видно из кода выше, функция возвращает 0, если кнопка не нажата, а если нажата, то возвращает номер кнопки.
Переменная butstate у нас задействана в целях, чтобы слишком резко не перескакивали показания.
Теперь займёмся поправкой кода в бесконечном цикле в функции main(), заменив опрос ножки порта вызовом вышенаписанной функции.
Вставим следующую строку везде вместо другой строки с таким же комментарием
if(ButtonPress(1)==1)//Кнопка 1 нажата
Точно также поступим и с другими двумя кнопками
if(ButtonPress(2)==2)//Кнопка 2 нажата
if(ButtonPress(3)==3)//Кнопка 3 нажата
Попробуем собрать код и прошить контроллер. Посмотрим результат.
Если всё работает, то цель нашего занятия полностью достигнута. Как всё это выглядит, можно посмотреть в видеоверсии урока, размещённой ниже.
Предыдущая часть Программирование МК AVR Следующий урок
Программатор, модуль RTC DS1307 с микросхемой памяти и дисплей можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Модуль RTC DS1307 с микросхемой памяти
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Температуру не показывает. В модели Протеуса забыли резистор поставить при подключении датчика температуры. Исправил — все отлично заработало.
Спасибо!
Вот бы то же самое, но на семисегментных индикаторах!!!
Дорогой друг, собрал часы, работают норм, но температуру кажет 15*с и всё, замыкаешь шины DQ и GND — показывает 0*с в чём дело не могу понять. Если можешь помоги пожалуйста. Другого датчика пока нет.