AVR Урок 21. Управление DS1307 кнопками. Часть 5



Урок 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 мы скопируем код и немного подправим его во всех кейсах.

switch(index)

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 2.0

Модуль RTC DS1307 с микросхемой памяти

Дисплей LCD 16×2

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

AVR Управление DS1307 кнопками

4 комментария на “AVR Урок 21. Управление DS1307 кнопками. Часть 5
  1. 9929ПК:

    Температуру не показывает. В модели Протеуса забыли резистор поставить при подключении датчика температуры. Исправил — все отлично заработало.

  2. 9929ПК:

    Вот бы то же самое, но на семисегментных индикаторах!!!

  3. Серго:

    Дорогой друг, собрал часы, работают норм, но температуру кажет 15*с и всё, замыкаешь шины DQ и GND — показывает 0*с в чём дело не могу понять. Если можешь помоги пожалуйста. Другого датчика пока нет.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*