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



 

Урок 21

Часть 4

 

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

 

Продолжим работать с обеспечением возможности интерактивного редактирования показателей регистров микросхемы DS1307.

В предыдущей части нашего занятия мы написали код для редактирования числа месяца.

 

 

Сегодня мы продолжим это дело и займёмся редактированием значения месяца. Всё делается аналогично, даже проще. Месяцев в любом году 12, что значительно облегчает обработку и сокращает код

 

case 2: //месяц

  I2C_SendByte(5);//Переходим на 0x05 — байт месяца

  //вперед

  if (direction==1)

  {

    if(month<12) I2C_SendByte(RTC_ConvertFromBinDec(month+1));

    else I2C_SendByte(RTC_ConvertFromBinDec(1));

  }

  //назад

  if (direction==0)

  {

    if(month>1) I2C_SendByte(RTC_ConvertFromBinDec(month-1));

    else I2C_SendByte(RTC_ConvertFromBinDec(12));

  }

  break;

 

Думаю, здесь и объяснять нечего, кроме того, что мы работаем с регистром 5 вместо 4.

Теперь переводим год. В 20 век мы переводить не будем, так как он уже давно прошел. Поэтому обеспечим перевод года от 2001 до 2099

 

case 3: //год

  I2C_SendByte(6);//Переходим на 0x06 — байт года

  //вперед

  if (direction==1)

  {

    if(year<99) I2C_SendByte(RTC_ConvertFromBinDec(year+1));

    else I2C_SendByte(RTC_ConvertFromBinDec(1));

  }

  //назад

  if (direction==0)

  {

    if(year>1) I2C_SendByte(RTC_ConvertFromBinDec(year-1));

    else I2C_SendByte(RTC_ConvertFromBinDec(99));

  }

  break;

 

 

С днём недели, часами и минутами всё аналогично. Обработаем их все

 

case 4: //день недели

  I2C_SendByte(3);//Переходим на 0x03 — байт дня недели

  //вперед

  if (direction==1)

  {

    if(day<7) I2C_SendByte(RTC_ConvertFromBinDec(day+1));

    else I2C_SendByte(RTC_ConvertFromBinDec(1));

  }

  //назад

  if (direction==0)

  {

    if(day>1) I2C_SendByte(RTC_ConvertFromBinDec(day-1));

    else I2C_SendByte(RTC_ConvertFromBinDec(7));

  }

  break;

case 5: //часы

  I2C_SendByte(2);//Переходим на 0x02 — байт часов

  //вперед

  if (direction==1)

  {

    if(hour<23) I2C_SendByte(RTC_ConvertFromBinDec(hour+1));

    else I2C_SendByte(RTC_ConvertFromBinDec(0));

  }

  //назад

  if (direction==0)

  {

    if(hour>0) I2C_SendByte(RTC_ConvertFromBinDec(hour-1));

    else I2C_SendByte(RTC_ConvertFromBinDec(23));

  }

  break;

case 6: //минуты

  I2C_SendByte(1);//Переходим на 0x01 — байт минут

  //вперед

  if (direction==1)

  {

    if(min<59) I2C_SendByte(RTC_ConvertFromBinDec(min+1));

    else I2C_SendByte(RTC_ConvertFromBinDec(0));

  }

  //назад

  if (direction==0)

  {

    if(min>0) I2C_SendByte(RTC_ConvertFromBinDec(min-1));

    else I2C_SendByte(RTC_ConvertFromBinDec(59));

  }

  break;

 

Теперь поработаем с секундами. Здесь оказалось всё намного даже проще. Тем не менее комментарии напишем. Так красивее

 

case 7: //секунды

  I2C_SendByte(0);//Переходим на 0x00 — байт секунд

  //сброс секунд в 0

  if (direction==1)

  {

    I2C_SendByte(RTC_ConvertFromBinDec(0));

  }

  //сброс секунд в 30

  if (direction==0)

  {

    I2C_SendByte(RTC_ConvertFromBinDec(30));

  }

  break;

 

Соберём код и проверим на настоящем контроллере. Опять же, показывать здесь смысла нет картинки, так как ничего не увидишь. Всё прекрасно видно в видеоверсии, прикрепленной в самом низу страницы.

Вроде бы, можно на этом и завершить занятие, но для большей профессиональности работы нашей программы нам ещё необходимо побороться с дребезгом контактов кнопок, а то мы этот вопрос упустили.

Этим мы займёмся в следующей части занятия.

 

 

Предыдущая часть Программирование МК AVR Следующая часть

 

Программатор, модуль RTC DS1307 с микросхемой памяти и дисплей можно приобрести здесь:

Программатор (продавец надёжный) USBASP USBISP 2.0

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

Дисплей LCD 16×2

 

 

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

 

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

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

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

*