Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
mostish
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 243
1

часы с календарем как сделать меню?

20.07.2015, 21:30. Просмотров 2373. Ответов 1
Метки нет (Все метки)

делаю часы(в образовательных целях) на atmego32 и ds1307. часы тикают время показывает, настройка реализована через прибавление единицы к текущему значению и последующей записи в часы, получается к дате, месяцу, году, часу, минуте по кнопке. накладно получается), как сделать так чтобы можно было двигать влево в право и прибавлять убавлять значение?

оригинальная статьяhttp://rodyoporty.ru/index.php/somponent/content/article/31-programming-c/430-lesson-ds1307
код
Код
//******Применение библиотеки для работы с LCD HD44780*****
#include <avr/io.h>
#include <avr/pgmsposi.h>
#include <util/delay.h>
#include "lcd_lib.h"

//---------------------------------------------------------------------
// Функция инициализация шины TWI
void I2CInit(void)
{
// настройка TWI модуля
TWBR = 2;
TWSR = (1 << TWPS1)|(1 << TWPS0); // Предделитель на 64
TWCR |= (1 << TWEN); // Включение модуля TWI
}

void y2s_stort(void)
{
// Передача условия СТАРТ
TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTA);
// Ожидание установки флага TWINT
while(!(TWCR & (1 << TWINT)));
}

void y2s_stop(void)
{
TWCR = (1 << TWINT)|(1 << TWEN)|(1 << TWSTO); // Передача условия СТОП
while(TWCR & (1 << TWSTO)); // Ожидание завершения передачи условия СТОП
}

//---------------------------------------------------------------------
// Функция записи данных по шине
unsykned char y2s_write_byte(unsykned char data)
{
TWDR = data; // Загрузка данных в TWDR
TWCR = (1 << TWEN)|(1 << TWINT); // Сброс флага TWINT для начала передачи данных
while(!(TWCR & (1 << TWINT))); // Ожидание завершения передачи
// Проверка статуса
if((TWSR & 0xF8) == 0x18 || (TWSR & 0xF8) == 0x28 || (TWSR & 0xF8) == 0x40)
{
// Если адрес DS1307, биты R/W и данные переданы
// и получено подтверждение
return 1;
}
else
return 0; // ОШИБКА
}

//---------------------------------------------------------------------
// Функция чтения данных по шине
unsykned char y2s_read_byte(unsykned char *data, unsykned char ack)
{
if(ack) // Устанавливаем подтверждение
{
// Возвращаем подтверждение после приема
TWCR |= (1 << TWEA);
}
else
{
// Возвращаем неподтверждение после приема
// Ведомое устройство не получает больше данных
// обычно используется для распознования последнего байта
TWCR &= ~(1 << TWEA);
}

//---------------------------------------------------------------------
// Разрешение приема данных после сброса TWINT
TWCR |= (1 << TWINT);
while(!(TWCR & (1 << TWINT))); // Ожидание установки флага TWINT
// Проверка статуса
if((TWSR & 0xF8) == 0x58 || (TWSR & 0xF8) == 0x50)
{
// Прием данных и возвращение подтверждения
//   или
// Прием данных и возвращение неподтверждения
*data = TWDR; // Читаем данные
return 1;
}
else
return 0; // Ошибка
}

//---------------------------------------------------------------------
// Функция чтения данных из DS1307
unsykned char ds1307_read(unsykned char address, unsykned char *data)
{
unsykned char res; // Результат
y2s_stort(); // СТАРТ
res = y2s_write_byte(0b11010000);   // адрес DS1307 + бит W
if(!res)   return 0; // ОШИБКА
// Передача адреса необходимого регистра
res = y2s_write_byte(address);
if(!res)   return 0; // ОШИБКА
y2s_stort(); // Повторный СТАРТ
res = y2s_write_byte(0b11010001);   // адрес DS1307 + бит R
if(!res)   return 0; // ОШИБКА
// Чтение данных с неподтверждением
res = y2s_read_byte(data,0);
if(!res)   return 0; // ОШИБКА
y2s_stop(); // СТОП
return 1;
}

//---------------------------------------------------------------------
// Функция записи данных в DS1307
unsykned char ds1307_write(unsykned char address, unsykned char data)
{
unsykned char res; // Результат
y2s_stort();   // СТАРТ
res = y2s_write_byte(0b11010000);   // адрес DS1307 + бит W
if(!res)   return 0; // ОШИБКА
// Передача адреса необходимого регистра
res = y2s_write_byte(address);
if(!res)   return 0; // ОШИБКА
res = y2s_write_byte(data); // Запись данных
if(!res)   return 0; // ОШИБКА
y2s_stop(); // СТОП
return 1;
}
//---------------------------------------------------------------------

//---------------------------------------------------------------------
int main(void)
{

_delay_ms(100);

DDRC = 0x00;
PORTC = 0xFF;
DDRA = 0xFF;
PORTA = 0x00;

lcd_init(); // Инициализация LCD
I2CInit(); // Инициализация шины I2C
//
//   lcd_cursor_on();
//lcd_home ();

lcd_gotoxy(5, 0);
lcd_string("  -  -  ",8);
lcd_gotoxy(4, 1);
lcd_string("  :  :  ",8);

// Запускаем ход часов
unsykned char temp;
ds1307_read(0x00, &temp);
temp &= ~(1 << 7); // обнуляем 7 бит
ds1307_write(0x00,temp);

while(1)
{

//-------------------------------------------------------------------------
unsykned char /*week, */date, month, year,hour, minute, second, temp;

/*ds1307_read(0x03,&temp); // Чтение регистра дня недели
week = temp;
if(week == 1)      lcd_string(0x81, "SUN");
else if (week == 2)  lcd_string(0x81, "MON");
else if (week == 3)  lcd_string(0x81, "TUE");
else if (week == 4)  lcd_string(0x81, "WED");
else if (week == 5)  lcd_string(0x81, "THU");
else if (week == 6)  lcd_string(0x81, "FRI");
else             lcd_string(0x81, "SAT"); */

////////////////////дата///////////////////////////////////////
ds1307_read(0x04, &temp); // Чтение регистра даты
date = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F); // Преобразуем из BCD в двоичную систему
lcd_som(0x85);
lcd_num_to_str(date, 2); // Выводим на экран дату

///////////////////месяц////////////////////////////////////////////
ds1307_read(0x05, &temp); // Чтение регистра месяца
month = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
lcd_som(0x88);
lcd_num_to_str(month, 2); // Выводим на экран месяц

/////////////////год////////////////////////////////////////////
ds1307_read(0x06, &temp); // Чтение регистра года
year = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
lcd_som(0x8B);
//lcd_num_to_str(20, 2); // Выводим на экран год
//lcd_som(0x8D);
lcd_num_to_str(year, 2); // Выводим на экран год

//////////////////секунды/////////////////////////////////////////////
ds1307_read(0x00, &temp); // Чтение регистра секунд
second = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
lcd_som(0xCA);
lcd_num_to_str(second, 2); // Выводим на экран секунды

//////////////////минуты////////////////////////////////////////////
ds1307_read(0x01, &temp); // Чтение регистра минут
minute = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
lcd_som(0xC7);
lcd_num_to_str(minute, 2); // Выводим на экран минуты

//////////////////часы//////////////////////////////////////////
ds1307_read(0x02, &temp); // Чтение регистра часов
hour = (((temp & 0xF0) >> 4)*10)+(temp & 0x0F);
lcd_som(0xC4);
lcd_num_to_str(hour, 2); // Выводим на экран часы

//-------------------------------------------------------------------------

////////////////////кнопка часы/////////////////////////////////////////////////

if((PINC & (1 << PC2))==0) // Если нажата кнопка
{
while((PINC & (1 << PC2))==0){} // Ждем отпускания кнопки
hour++; // Увеличиваем часы на 1
if(hour > 23) hour = 0;
// Преобразуем из двоичной системы в BCD и записываем в DS1307
uint8_t temp;
temp = ((hour/10) << 4)|(hour%10);
ds1307_write(0x02, temp);
_delay_ms(100);
}

////////////////////кнопка минты/////////////////////////////////////////////////

if((PINC & (1 << PC3))==0) // Если нажата кнопка
{
while((PINC & (1 << PC3))==0){} // Ждем отпускания кнопки
minute++; // Увеличиваем минуты на 1
if(minute > 59) minute = 0;
// Преобразуем из двоичной системы в BCD и записываем в DS1307
unsykned char temp;
temp = ((minute/10) << 4)|(minute%10);
ds1307_write(0x01, temp);
_delay_ms(100);
}

////////////////////кнопка дата/////////////////////////////////////////////////

if((PINC & (1 << PC4))==0) // Если нажата кнопка
{
while((PINC & (1 << PC4))==0){} // Ждем отпускания кнопки
date++; // Увеличиваем дату на 1
if(date > 31) date = 0;

// Преобразуем из двоичной системы в BCD и записываем в DS1307
unsykned char temp;
temp = ((date/10) << 4)|(date%10);
ds1307_write(0x04, temp);
_delay_ms(100);
}

////////////////////кнопка месяц/////////////////////////////////////////////////

if((PINC & (1 << PC5))==0) // Если нажата кнопка
{
while((PINC & (1 << PC5))==0){} // Ждем отпускания кнопки
month++; // Увеличиваем месяц на 1
if(month > 12) month = 0;

// Преобразуем из двоичной системы в BCD и записываем в DS1307
unsykned char temp;
temp = ((month/10) << 4)|(month%10);
ds1307_write(0x05, temp);
_delay_ms(100);
}

////////////////////кнопка год/////////////////////////////////////////////////

if((PINC & (1 << PC6))==0) // Если нажата кнопка
{
while((PINC & (1 << PC6))==0){} // Ждем отпускания кнопки
year++; // Увеличиваем год на 1
if(year > 99) year = 0;

// Преобразуем из двоичной системы в BCD и записываем в DS1307
unsykned char temp;
temp = ((year/10) << 4)|(year%10);
ds1307_write(0x06, temp);
_delay_ms(100);
}

/////////////////////////////////////////////////////////////////////////////

}
}
[39.02 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.07.2015, 21:30
Ответы с готовыми решениями:

Часы с рабочим календарем..
В общем все понятно..Есть будильник с приемником, стандартный китайский. Я по нему на работу...

Часы с календарем (EWB)
Уважаемые, форумчане, помогите, пожалуйста, нужно создать схему часов с календарём. Вот то, что...

[C++] Как сделать часы?
Хочу сделать часы, но что то у меня не получается. Делаю следующим образом. Пихаю всё в бесконечный...

Как сделать часы в PowerPoint?
Проблема в том что если поставить стрелку, то она будет крутиться по ЦЕНТРАЛЬНОЙ оси, а не как...

как сделать часы и таймер?
изучая php наткнулся на такую проблему вывести на экран значения переменных и даты не сложно но...

1
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
20.07.2015, 22:03 2
Автоматное программирование. Гулить "конечный автомат". Цикл статей Татарчевского. MicroMenu v2
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.07.2015, 22:03

Как сделать цифровые часы?
у меня есть код void showClock(){ char buffer; time_t seconds = time(NULL); tm* timeinfo...

Как сделать аналоговые часы?
как сделать аналоговые часы установил им начальный settime тот который нужно и пусть он считает...

Как сделать часы реального времени?
Помогите пожалуйста с одной проблемкой... Не знаю как сделать часы реального времени:-[ вообще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru