Нашёл у себя на компьютере экспериментальный проектик на часах DS1307. Сам проект не планировалось собирать, а делался чисто для проверки… поэтому здесь нет никаких наворотов, а просто микроконтроллер+дисплей nokia 3310 + 4 кнопки. Собственно вот схема в Proteus.
На схеме нет кварца — к меге 16мгц, а к часикам часовой кварц желательно с канденсаторами по 22пф. Вообщем чтоб небыло неясностей привожу схему со всеми элементами( схема выше — чисто для симулятора).
Фьюзы — нужно настроить на внешний кварц.
Не забудьте про батарейку для часов.
Исходник написан в CVAVR:
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 16,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> #include <stdio.h> #include <stdlib.h> // библиотека преобразоания чисел в символьную строку #include <ctype.h> // библиотека преобразования символов в число #include <string.h> //библиотека работы со строками #include "NokiaLCD.h" #include "lcd_3310.c" // I2C Bus functions #asm .equ __i2c_port=0x15 ;PORTC .equ __sda_bit=4 .equ __scl_bit=5 #endasm #include <i2c.h> // DS1307 Real Time Clock functions #include <ds1307.h> #define btn_m PIND.0 #define btn_minus PIND.2 #define btn_plus PIND.1 #define btn_b PIND.3 unsigned char buff [99]; //буфер дисплея unsigned char hour,minut,sek; //часы, минуты, секунды unsigned char m,h,s; //часы, минуты, секунды unsigned char day,month,year; //день, месяц, год unsigned char d,mo,y; //день, месяц, год unsigned char flag,menu; void read_time() { rtc_get_time(&hour,&minut,&sek); //считать время h=hour; m=minut; s=sek; } void read_date() { rtc_get_date(&day,&month,&year); //считать дату d=day; mo=month; y=year; } void btn() { if(btn_m==0&&menu==0){menu=1;ClearLcd();} if(menu==1){if(btn_m!=0){menu=2;ClearLcd();}} if(btn_m==0&&menu!=0&&menu!=1){delay_ms(100);menu++;flag=0;ClearLcd();} if(btn_b==0&&menu!=0&&menu!=1){delay_ms(100);menu--;flag=0;ClearLcd();} if(menu>=8){menu=0;} if(menu==2) { if(flag==0){ read_time(); flag=1;} if(btn_plus==0){delay_ms(100);hour++;} if(btn_minus==0){delay_ms(100);hour--;} } if(menu==3) { if(flag==0){ read_time(); flag=1;} if(btn_plus==0){delay_ms(100);minut++;} if(btn_minus==0){delay_ms(100);minut--;} } if(menu==4) { if(flag==0){ read_time(); flag=1;} if(btn_plus==0){delay_ms(100);sek++;} if(btn_minus==0){delay_ms(100);sek--;} } if(hour>=24){hour=0;} if(minut<1){minut=59;hour--;} if(minut>=60){minut=0;hour++;} if(sek<1){sek=59;minut--;} if(sek>=60){sek=0;minut++;} if(menu>1){ rtc_set_time(hour,minut,sek);} //установить время: часы, минуты, секунды if(menu==5) { if(flag==0){ read_date(); flag=1;} if(btn_plus==0){delay_ms(100);day++;} if(btn_minus==0){delay_ms(100);day--;} } if(menu==6) { if(flag==0){ read_date(); flag=1;} if(btn_plus==0){delay_ms(100);month++;} if(btn_minus==0){delay_ms(100);month--;} } if(menu==7) { if(flag==0){ read_date(); flag=1;} if(btn_plus==0){delay_ms(100);year++;} if(btn_minus==0){delay_ms(100);year--;} } if(day>=32){day=1;month++;} if(day<1){day=31;month--;} if(month>=13){month=1;year++;} if(month<1){month=12;year--;} if(year>=255){year=0;} if(menu>1){ rtc_set_date(day,month,year);} //установить date } void lcd() { if(menu==0) { LcdPutLine("Сегодня:", 2, 1); // вывели текст sprintf( buff,"%i.%i.%i г ", d,mo,y+2000 ); LcdPutLine(buff, 2, 2); LcdPutLine("Время:", 2, 3); // вывели текст sprintf( buff,"%i:%i%i:%i%i ", h,m/10,m%10,s/10,s%10 ); LcdPutLine(buff, 2, 4); } if(menu==1) { LcdPutLine(" Режим", 2, 3); // вывели текст LcdPutLine(" Настроек", 2, 4); // вывели текст delay_ms(500); } if(menu==2) { LcdPutLine("Сегодня:", 2, 1); // вывели текст sprintf( buff,"%i.%i.%i г ", d,mo,y+2000 ); LcdPutLine(buff, 2, 2); LcdPutLine("Время:", 2, 3); // вывели текст sprintf( buff,"%i<%i%i:%i%i ", h,m/10,m%10,s/10,s%10 ); LcdPutLine(buff, 2, 4); } if(menu==3) { LcdPutLine("Сегодня:", 2, 1); // вывели текст sprintf( buff,"%i.%i.%i г ", d,mo,y+2000 ); LcdPutLine(buff, 2, 2); LcdPutLine("Время:", 2, 3); // вывели текст sprintf( buff,"%i:%i%i<%i%i ", h,m/10,m%10,s/10,s%10 ); LcdPutLine(buff, 2, 4); } if(menu==4) { LcdPutLine("Сегодня:", 2, 1); // вывели текст sprintf( buff,"%i.%i.%i г ", d,mo,y+2000 ); LcdPutLine(buff, 2, 2); LcdPutLine("Время:", 2, 3); // вывели текст sprintf( buff,"%i:%i%i:%i%i< ", h,m/10,m%10,s/10,s%10 ); LcdPutLine(buff, 2, 4); } if(menu==5) { LcdPutLine("Сегодня:", 2, 1); // вывели текст sprintf( buff,"%i<%i.%i г ", d,mo,y+2000 ); LcdPutLine(buff, 2, 2); LcdPutLine("Время:", 2, 3); // вывели текст sprintf( buff,"%i:%i%i:%i%i ", h,m/10,m%10,s/10,s%10 ); LcdPutLine(buff, 2, 4); } if(menu==6) { LcdPutLine("Сегодня:", 2, 1); // вывели текст sprintf( buff,"%i.%i<%i г ", d,mo,y+2000 ); LcdPutLine(buff, 2, 2); LcdPutLine("Время:", 2, 3); // вывели текст sprintf( buff,"%i:%i%i:%i%i ", h,m/10,m%10,s/10,s%10 ); LcdPutLine(buff, 2, 4); } if(menu==7) { LcdPutLine("Сегодня:", 2, 1); // вывели текст sprintf( buff,"%i.%i.%i< ", d,mo,y+2000 ); LcdPutLine(buff, 2, 2); LcdPutLine("Время:", 2, 3); // вывели текст sprintf( buff,"%i:%i%i:%i%i ", h,m/10,m%10,s/10,s%10 ); LcdPutLine(buff, 2, 4); } } void main(void) { // Port B initialization PORTB=0x00; DDRB=0x3F; // Port C initialization PORTC=0x70; DDRC=0x00; // Port D initialization PORTD=0x00; DDRD=0xF0; PORTD.0=1; PORTD.1=1; PORTD.2=1; PORTD.3=1; // I2C Bus initialization i2c_init(); // DS1307 Real Time Clock initialization // Square wave output on pin SQW/OUT: Off // SQW/OUT pin state: 0 rtc_init(0,0,0); LcdInit(); ClearLcd(); LcdContrast (40); while (1) { read_time(); read_date(); lcd(); btn(); } }
При включени сразуже отображается дата и время. Если нажать кнопку «MENU» то на экране кратковременно появится надпись «Режим настроек» — после этого на дисплее появится стрелка указывающая на изменяемый параметр. Навигация осуществляется той же кнопкой + кнопка «DOWN» для возврата на предыдущий параметр.
Думаю в пояснении схема больше не нуждается, если что то не понятно спрашивайте на форуме или в коментариях.
ВНИМАНИЕ!
Если у вас не работают часы — проверьте питание! — оно должно быть не менее 4,5В! При меньшем напряжении микросхема работает нестабильно, а то и вообще никак!
Скачать проект Часы DS1307 Скачали 5692 раз
А можно попросить схему подключению к какому нибудь другому LCD? к той же NOKIA7110. Спасибо
Эта прошивка не будет работать с другими дисплеями — для них нужно писать программу отдельно.
написал на форуме, еще в пятницу, до сих пор модерацию не прошел мой пост(((
Возможно Ваш пост не прошёл анти-спам проверку… Что бы писать без модерации нужно быть зарегистрированным пользователем — вы зарегистрированы?
А вы пробывали собрать часы из статьи? или сразу полезли код править?
Собрал в кодевизе 3.19, часы идут(единственно переписал немного под библиотеку LPH9157-2, ну нету у меня 3310:-), работает часы идут, но только стоит нажать на меню, вечно крутит «меню настроек» и на этом все(((
вот код:
в декларации порта С исправил ошибку, но результата нет, если принудительно отправляю в программе на меню2 т.е. установку hour +- кнопки работают, но дальше не переключается, т.е я так понимаю при нажатии не добавляется отнимается menu вопрос почему?
Смотрите Ваш код — очевидно что ошибка в обработке функции кнопок… Подтяжка включена? Проверьте все те изменения которые вносили. И исходник лучше из архива возьмите. В комментариях Ваш код неправильно отображается — пишите или на почту или на форуме.