#include #include #include #include "lcd.h" #include unsigned int sek=0; unsigned int min=15; unsigned int hour=15; unsigned int day=12; unsigned int mouth=11; unsigned int year=2012; unsigned int alarm_hour=6; unsigned int alarm_min=0; char alarm_on=0; char sh_al=0; unsigned char tex0[] ="ALARM ALARM ALARM!!!"; unsigned char tex1[] ="LCDcloc v1.4 by AT-09-2"; int cnt = 0; char hh=0; int menu=0; ISR(TIMER0_OVF_vect) { cnt++; if (cnt==30) { hh=0; inc(); } if (cnt == 61) { sek++; hh=1; inc(); cnt = 0; } } void sdvig(char *a) { unsigned int i=0;; for(i=0; i < strlen(a) ; i++) { lcd_clrscr(); lcd_gotoxy(0,0); lcd_puts(&a[i]); _delay_ms(500); } } void Beep(int o) { for (long i = 1; i < o * 1000; i++) { PORTA^= 0b10000000; _delay_ms(500); } } char db(int del) { static char pp = 0xFF; int qc = del / 10; for (int qn = 0; qn < qc; ++qn) { char cp = PINA; char buttons = ~cp & pp; pp = cp; if (buttons) return buttons; _delay_ms(10); } return 0x00 ; } void obr_menu(void) { switch (menu) { case 1: { lcd_init(LCD_DISP_OFF); lcd_init(LCD_DISP_ON_CURSOR_BLINK); cli(); lcd_gotoxy(0,9); break; } case 2: { lcd_gotoxy(0,12); break; } case 3: { lcd_gotoxy(0,15); break; } case 4: { lcd_gotoxy(1,7); break; } case 5: { lcd_gotoxy(1,10); break; } case 6: { lcd_gotoxy(1,15); break; } case 7: { lcd_clrscr(); show_alarm(); lcd_gotoxy(0,1); break; } case 8: { lcd_gotoxy(0,4); break; } case 9: { lcd_gotoxy(1,9); break; } case 10: { menu=0; lcd_init(LCD_DISP_OFF); lcd_init(LCD_DISP_ON); lcd_clrscr(); show_menu(); show_cloc(); sei(); break; } } } void show_alarm(void) { lcd_gotoxy(0,0); lcd_putc(alarm_hour/10 + 0x30); lcd_putc(alarm_hour%10 + 0x30); lcd_putc(':'); lcd_putc(alarm_min/10 + 0x30); lcd_putc(alarm_min%10 + 0x30); lcd_gotoxy(0,1); lcd_puts('alarm'); lcd_gotoxy(6,1); if (alarm_on==1) lcd_puts('on'); else lcd_puts('off'); } void inc(void) { if (sek==60) { min++; sek=0; } if (min==60) { hour++; min=0; } if (hour==24) { day++; hour=0; } if (day==31) { mouth++; day=0; } if (mouth==12) { year++; mouth=0; } } void show_menu(void) { lcd_gotoxy(0,0); lcd_puts('menu'); lcd_gotoxy(0,1); lcd_puts('mode'); } void show_cloc(void) { lcd_gotoxy(8,0); lcd_putc(hour/10 + 0x30); lcd_putc(hour%10 + 0x30); if (hh==1) { lcd_putc(':'); } else { lcd_putc(' '); } lcd_putc(min/10 + 0x30); lcd_putc(min%10 + 0x30); if (hh==1) { lcd_putc(':'); } else { lcd_putc(' '); } lcd_putc(sek/10 + 0x30); lcd_putc(sek%10 + 0x30); lcd_gotoxy(6,1); lcd_putc(day/10 + 0x30); lcd_putc(day%10 + 0x30); lcd_putc('.'); lcd_putc(mouth/10 + 0x30); lcd_putc(mouth%10 + 0x30); lcd_putc('.'); lcd_putc(year/1000 + 0x30); lcd_putc(((year/100)-10*(year/1000)) + 0x30); lcd_putc(((year%100-year%10)/10) + 0x30); lcd_putc(year%10 + 0x30); } void alarm(void) { if ((alarm_hour==hour)&(alarm_min==min)) sdvig(tex0); beep(1000); } void obr_mode(void) { switch (menu) { case 0: {if (sh_al==0) { lcd_clrscr(); show_alarm(); } else { lcd_clrscr(); show_cloc; show_menu; } sh_al=~sh_al; break; } case 1: { hour++; break; } case 2: { min++; break; } case 3: { sek++; break; } case 4: { day++; break; } case 5: { mouth++; break; } case 6: { year++; break; } case 7: { alarm_hour++; break; } case 8: { alarm_min++; break; } case 9: { alarm_on=~alarm_on; show_alarm(); break; } } } void light(void) { PORTA=~PINA; } void obr_knopok(void) { switch (db(800)) { case 0x40: { menu++; obr_menu; break; } case 0x20: { obr_mode; break; } case 0x10: { light(); break; } case 0x00: { show_menu; show_cloc; } } } void main() { lcd_init(LCD_DISP_ON); lcd_clrscr(); sdvig(tex1); lcd_clrscr(); sei(); TIMSK |= _BV(TOIE0); TCCR0 |= _BV(CS02); DDRA=0b10001111; PORTA=~DDRA; while(1) { obr_knopok(); } }