Урок 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 с адаптером USBASP USBISP 3.3 с адаптером
Модуль RTC DS1307 с микросхемой памяти
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий