Доброго здоровья всем форумчанам. В общем сделал я часы как в этой теме http://cxem.net/mc/mc316.php, всё хорошо, они работают, но захотелось внести в программу некоторые изменения. Когда пытаюсь компилировать в Аtmel Studio то сразу вылетает 88 ероров (скрин экрана прилагается). А когда пытаюсь то же скомпилировать в CVAVR то вылазит всего 1ерор:
Error: D:\...\(67): missing ';'
Проверял, тчк. с запятой стоят правильно. Библиотеки есть все и подключены.
#include <io.h>
#include <interrupt.h>
#include <delay.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <eeprom.h>
// библиотека преобразования двоично-десятичной системы и вывод на LCD
#include "bcd.h"
// библиотеки ЖК
#include "lcd_lib_2.h"
// библиотеки I2C
#include "i2c.h"
// библиотека кнопок
#include "buttons.h"
// дефайны адресов микросхемы
#define RTC_adr_write 0b11010000
#define RTC_adr_read 0b11010001
// переменные времени
unsigned char hour;
unsigned char min;
unsigned char sec;
// переменные даты
unsigned char day;
unsigned char wday;
unsigned char month;
unsigned char year;
// переменные температуры
unsigned int temp;
unsigned char t1;
unsigned char t2;
// переменные будильника
unsigned char alarm_hour;
unsigned char alarm_min;
unsigned char alarm_on;
// переменные настройки
unsigned char i=0; // переменная кнопок
unsigned char al_on; // переменная состояния будильника (вкл / выкл)
unsigned char al; // переменная сработки будильника
unsigned char j=1; // подуровни меню
#define LED_PORT PORTB
#define LED_DDR DDRB
#define LED PB0
uint8_t alarm_hour_ee EEMEM = 0;
uint8_t alarm_min_ee EEMEM = 0;
uint8_t alarm_on_ee EEMEM = 0;
// пользовательский символ колокольчика для индикаци будильника
const uint8_t alarm[] PROGMEM = {0x02,0x04,0x04,0x0E,0x0E,0x1F,0x1F,0x04};
// ============
// ============
// DS3231
// функции преобразования чисел (для корректного отображения значений) ================
unsigned char bcd (unsigned char data)
{
unsigned char bc;
bc=((((data&(1<<6))|(data&(1<<5))|(data&(1<<4)))*0x0A)>>4)+((data&(1<<3))|(data&(1<<2))|(data&(1<<1))|(data&0x01));
return bc;
}
unsigned char bin(unsigned char dec){
char bcd;
char n, dig, num, count;
num = dec;
count = 0;
bcd = 0;
for (n=0; n<4; n++) {
dig = num%10;
num = num/10;
bcd = (dig<<count)|bcd;
count += 4;
}
return bcd;
}
// функции с часами =============
// инициализация начальных установок
void RTC_init(void){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x0E); // передача адреса памяти
i2c_send_byte(0b00100000); // запустить преобразование температуры и выход на 1 Гц
i2c_send_byte(0b00001000); // разрешить выход 32 кГц
i2c_stop_cond(); // остановка i2c
}
// получение времени и даты
void RTC_read_time(void){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x00); // передача адреса памяти
i2c_stop_cond(); // остановка i2c
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения
sec = bcd(i2c_get_byte(0)); // чтение секунд, ACK
min = bcd(i2c_get_byte(0)); // чтение минут, ACK
hour = bcd(i2c_get_byte(0)); // чтение часов, ACK
wday = bcd(i2c_get_byte(0)); // чтение день недели, ACK
day = bcd(i2c_get_byte(0)); // чтение число, ACK
month = bcd(i2c_get_byte(0)); // чтение месяц, ACK
year = bcd(i2c_get_byte(1)); // чтение год, NACK
i2c_stop_cond(); // остановка i2c
}
// установка времени
void RTC_write_time(unsigned char hour1,unsigned char min1, unsigned char sec1){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x00); // передача адреса памяти
i2c_send_byte(bin(sec1)); // 0x00 скунды (целесообразно ли задавать еще и секунды?)
i2c_send_byte(bin(min1)); // 0x01 минуты
i2c_send_byte(bin(hour1)); // 0x02 часы
i2c_stop_cond(); // остановка i2c
}
// установка даты
void RTC_write_date(unsigned char wday, unsigned char day, unsigned char month, unsigned char year){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x03); // передача адреса памяти
i2c_send_byte(bin(wday)); // 0x03 адень недели (воскресенье - 1, пн 2, вт 3, ср 4, чт 5, пт 6, сб 7)
i2c_send_byte(bin(day)); // 0x04 день месяц
i2c_send_byte(bin(month)); // 0x05 месяц
i2c_send_byte(bin(year)); // 0x06 год
i2c_stop_cond(); // остановка i2c
}
// чтение температуры
void RTC_read_temper(void){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x11); // передача адреса памяти
i2c_stop_cond(); // остановка i2c
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения
t1 = i2c_get_byte(0); // чтение MSB температуры
t2 = i2c_get_byte(1); // чтение LSB температуры
i2c_stop_cond(); // остановка i2c
t2=(t2>>7); // сдвигаем на 6 - точность 0,25 (2 бита)
// сдвигаем на 7 - точность 0,5 (1 бит)
t2=t2*5;
}
// вывод дня недели
void put_wday (void) {
if (wday==1) {LCD_SendStr("Sun");}
if (wday==2) {LCD_SendStr("Mon");}
if (wday==3) {LCD_SendStr("Tue");}
if (wday==4) {LCD_SendStr("Wed");}
if (wday==5) {LCD_SendStr("Thu");}
if (wday==6) {LCD_SendStr("Fri");}
if (wday==7) {LCD_SendStr("Sat");}
}
//
// ============
// ============
ISR (TIMER0_OVF_vect) // вектор прерывания по переполнеинию таймера 0
{
BUT_Debrief (); // опрос 4х кнопок
}
int main (void)
{
// инициализации
LCD_Init();
i2c_init();
BUT_Init();
RTC_init();
LED_DDR |= (1<<LED);
LED_PORT &= ~(1<<LED);
// загрузить из eeprom значения будильника
alarm_hour = eeprom_read_byte(&alarm_hour_ee);
alarm_min = eeprom_read_byte(&alarm_min_ee);
alarm_on = eeprom_read_byte(&alarm_on_ee);
LCD_SetUserChar(alarm, 1); // загружаем пользовательский символ в ОЗУ дисплея
//инициализация таймера 0
TCCR0 |= 0b00000101; // Включаем предделитель 1/1024
TIMSK |= 0b00000001; // разрешаем прерывания по переполнению таймера T0.
TCNT0=0; // Обнуляем счётный регистр таймера T0
sei(); // глобально разрешить прерывания
main:
LCD_Clear();
while (1)
{
i=BUT_GetKey();
// вывод времени
RTC_read_time ();
LCD_Goto(0,0);
BCD_2Lcd(hour);
LCD_WriteData(':');
BCD_2Lcd(min);
LCD_WriteData(':');
BCD_2Lcd(sec);
// вывод даты
LCD_Goto(0,1);
BCD_2Lcd(day);
LCD_WriteData('/');
BCD_2Lcd(month);
LCD_WriteData('/');
BCD_2Lcd(year);
// вывод дня недели
LCD_Goto(10,0);
put_wday ();
// вывод температуры
RTC_read_temper();
LCD_Goto(10,1);
LCD_WriteData('+');
BCD_2Lcd(t1);
LCD_WriteData(',');
BCD_1Lcd(t2);
LCD_WriteData('C');
// будильник
if(alarm_on==1) {
if(alarm_hour==hour) {
if(alarm_min==min) {
if(sec==1) {
al=1;
}
}
}
}
// отображение включенности будильника
if (alarm_on==1) {LCD_Goto(15,0); LCD_WriteData(1);}
else {LCD_Goto(15,0); LCD_WriteData(' ');}
// отключение сигнала будильника (сброс флага при нажатии кнопки 3)
i=BUT_GetKey();
if (i==3)
{ al=0; }
// при сработке будильника совершит действие
if (al==1)
{
LED_PORT |= (1<<LED);
}
else
{
LED_PORT &=~(1<<LED);
}
//_delay_ms(200);
//=== дальше настройки ===========
//==============
// кнопка 1 заходит в меню и перелистывает уровни менюшки
// кнопка 2 увеличивает переменную на 1 (защита от переполнения предусмотрена)
// кнопка 3 немедленно выходит из меню настроек
//
if (i==1)
{
LCD_Clear();
while (3) // настрока будильника
{
i=BUT_GetKey();
if (i==1)
{
j++;
}
if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}
// индикация настроек будильника
if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(6,1); LCD_SendStr(" ^^");}
if (j==3) {LCD_Goto(9,1); LCD_SendStr(" ^^");}
LCD_Goto(0,0);
LCD_SendStr("Alarm");
LCD_Goto(6,0);
BCD_2Lcd(alarm_hour);
LCD_WriteData(':');
BCD_2Lcd(alarm_min);
LCD_WriteData('-');
if (alarm_on==1)
{ LCD_SendStr("on "); }
else
{ LCD_SendStr("off"); }
switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{
alarm_hour++;
if (alarm_hour>23) {alarm_hour=0;}
}
}
case (2):
{
if (j!=2) {break;}
if (i==2)
{
alarm_min++;
if (alarm_min>59) {alarm_min=0;}
}
}
case (3):
{
if (j!=3) {break;}
if (i==2)
{
alarm_on++;
if (alarm_on>1) {alarm_on=0;}
}
}
}
if (j==4) // сохранить настройки и продолжить
{
//сохранить значения в eeprom
eeprom_write_byte(&alarm_hour_ee, alarm_hour);
eeprom_write_byte(&alarm_min_ee, alarm_min);
eeprom_write_byte(&alarm_on_ee, alarm_on);
j=1;
LCD_Clear();
break;
}
}
while (2) // настройка времени
{
i=BUT_GetKey();
if (i==1)
{
j++;
}
if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}
// индикация настраевомого времени
if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(6,1); LCD_SendStr(" ^^");}
LCD_Goto(0,0);
LCD_SendStr("Time");
LCD_Goto(6,0);
BCD_2Lcd(hour);
LCD_WriteData(':');
BCD_2Lcd(min);
LCD_WriteData(':');
BCD_2Lcd(0);
switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{
hour++;
if (hour>23) {hour=0;}
}
}
case (2):
{
if (j!=2) {break;}
if (i==2)
{
min++;
if (min>59) {min=0;}
}
}
}
if (j==3) // сохранить настройки и продолжить
{
RTC_write_time(hour, min, 0);
j=1;
LCD_Clear();
break;
}
}
while (2) // настрока даты
{
i=BUT_GetKey();
if (i==1)
{
j++;
}
if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}
// индикация настраиваемой даты и дня недели
if (j==1) {LCD_Goto(5,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(5,1); LCD_SendStr(" ^^");}
if (j==3) {LCD_Goto(8,1); LCD_SendStr(" ^^");}
if (j==4) {LCD_Goto(11,1); LCD_SendStr(" ^^");}
LCD_Goto(0,0);
LCD_SendStr("Date");
LCD_Goto(5,0);
BCD_2Lcd(day);
LCD_WriteData('/');
BCD_2Lcd(month);
LCD_WriteData('/');
BCD_2Lcd(year);
LCD_WriteData(' ');
put_wday();
switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{
day++;
if (day>31) {day=1;}
}
}
case (2):
{
if (j!=2) {break;}
if (i==2)
{
month++;
if (month>12) {month=1;}
}
}
case (3):
{
if (j!=3) {break;}
if (i==2)
{
year++;
if (year>40) {year=12;}
}
}
case (4):
{
if (j!=4) {break;}
if (i==2)
{
wday++;
if (wday>6) {wday=0;}
}
}
}
if (j==5) // сохранить настройки и продолжить
{
RTC_write_date (wday, day, month, year);
j=1;
LCD_Clear();
break;
}
}
}
//=== конец настроек =============
//==============
} // end while(1)
} // end main
Интересно то, что hex файл компилировался изначально на АтмелСтудио у автора, у меня же в ней не хочет компилиться. В Cvavr после бубна и добавления хидеров которых не хватает, вместо ";" требует "("... Бьюсь уже месяц сам, интернеты не помагают(
Error: D:\...\(67): missing ';'
Проверял, тчк. с запятой стоят правильно. Библиотеки есть все и подключены.
Спойлер
#define F_CPU 8000000L#include <io.h>
#include <interrupt.h>
#include <delay.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <eeprom.h>
// библиотека преобразования двоично-десятичной системы и вывод на LCD
#include "bcd.h"
// библиотеки ЖК
#include "lcd_lib_2.h"
// библиотеки I2C
#include "i2c.h"
// библиотека кнопок
#include "buttons.h"
// дефайны адресов микросхемы
#define RTC_adr_write 0b11010000
#define RTC_adr_read 0b11010001
// переменные времени
unsigned char hour;
unsigned char min;
unsigned char sec;
// переменные даты
unsigned char day;
unsigned char wday;
unsigned char month;
unsigned char year;
// переменные температуры
unsigned int temp;
unsigned char t1;
unsigned char t2;
// переменные будильника
unsigned char alarm_hour;
unsigned char alarm_min;
unsigned char alarm_on;
// переменные настройки
unsigned char i=0; // переменная кнопок
unsigned char al_on; // переменная состояния будильника (вкл / выкл)
unsigned char al; // переменная сработки будильника
unsigned char j=1; // подуровни меню
#define LED_PORT PORTB
#define LED_DDR DDRB
#define LED PB0
uint8_t alarm_hour_ee EEMEM = 0;
uint8_t alarm_min_ee EEMEM = 0;
uint8_t alarm_on_ee EEMEM = 0;
// пользовательский символ колокольчика для индикаци будильника
const uint8_t alarm[] PROGMEM = {0x02,0x04,0x04,0x0E,0x0E,0x1F,0x1F,0x04};
// ============
// ============
// DS3231
// функции преобразования чисел (для корректного отображения значений) ================
unsigned char bcd (unsigned char data)
{
unsigned char bc;
bc=((((data&(1<<6))|(data&(1<<5))|(data&(1<<4)))*0x0A)>>4)+((data&(1<<3))|(data&(1<<2))|(data&(1<<1))|(data&0x01));
return bc;
}
unsigned char bin(unsigned char dec){
char bcd;
char n, dig, num, count;
num = dec;
count = 0;
bcd = 0;
for (n=0; n<4; n++) {
dig = num%10;
num = num/10;
bcd = (dig<<count)|bcd;
count += 4;
}
return bcd;
}
// функции с часами =============
// инициализация начальных установок
void RTC_init(void){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x0E); // передача адреса памяти
i2c_send_byte(0b00100000); // запустить преобразование температуры и выход на 1 Гц
i2c_send_byte(0b00001000); // разрешить выход 32 кГц
i2c_stop_cond(); // остановка i2c
}
// получение времени и даты
void RTC_read_time(void){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x00); // передача адреса памяти
i2c_stop_cond(); // остановка i2c
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения
sec = bcd(i2c_get_byte(0)); // чтение секунд, ACK
min = bcd(i2c_get_byte(0)); // чтение минут, ACK
hour = bcd(i2c_get_byte(0)); // чтение часов, ACK
wday = bcd(i2c_get_byte(0)); // чтение день недели, ACK
day = bcd(i2c_get_byte(0)); // чтение число, ACK
month = bcd(i2c_get_byte(0)); // чтение месяц, ACK
year = bcd(i2c_get_byte(1)); // чтение год, NACK
i2c_stop_cond(); // остановка i2c
}
// установка времени
void RTC_write_time(unsigned char hour1,unsigned char min1, unsigned char sec1){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x00); // передача адреса памяти
i2c_send_byte(bin(sec1)); // 0x00 скунды (целесообразно ли задавать еще и секунды?)
i2c_send_byte(bin(min1)); // 0x01 минуты
i2c_send_byte(bin(hour1)); // 0x02 часы
i2c_stop_cond(); // остановка i2c
}
// установка даты
void RTC_write_date(unsigned char wday, unsigned char day, unsigned char month, unsigned char year){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x03); // передача адреса памяти
i2c_send_byte(bin(wday)); // 0x03 адень недели (воскресенье - 1, пн 2, вт 3, ср 4, чт 5, пт 6, сб 7)
i2c_send_byte(bin(day)); // 0x04 день месяц
i2c_send_byte(bin(month)); // 0x05 месяц
i2c_send_byte(bin(year)); // 0x06 год
i2c_stop_cond(); // остановка i2c
}
// чтение температуры
void RTC_read_temper(void){
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_write); // передача адреса устройства, режим записи
i2c_send_byte(0x11); // передача адреса памяти
i2c_stop_cond(); // остановка i2c
i2c_start_cond(); // запуск i2c
i2c_send_byte(RTC_adr_read); // передача адреса устройства, режим чтения
t1 = i2c_get_byte(0); // чтение MSB температуры
t2 = i2c_get_byte(1); // чтение LSB температуры
i2c_stop_cond(); // остановка i2c
t2=(t2>>7); // сдвигаем на 6 - точность 0,25 (2 бита)
// сдвигаем на 7 - точность 0,5 (1 бит)
t2=t2*5;
}
// вывод дня недели
void put_wday (void) {
if (wday==1) {LCD_SendStr("Sun");}
if (wday==2) {LCD_SendStr("Mon");}
if (wday==3) {LCD_SendStr("Tue");}
if (wday==4) {LCD_SendStr("Wed");}
if (wday==5) {LCD_SendStr("Thu");}
if (wday==6) {LCD_SendStr("Fri");}
if (wday==7) {LCD_SendStr("Sat");}
}
//
// ============
// ============
ISR (TIMER0_OVF_vect) // вектор прерывания по переполнеинию таймера 0
{
BUT_Debrief (); // опрос 4х кнопок
}
int main (void)
{
// инициализации
LCD_Init();
i2c_init();
BUT_Init();
RTC_init();
LED_DDR |= (1<<LED);
LED_PORT &= ~(1<<LED);
// загрузить из eeprom значения будильника
alarm_hour = eeprom_read_byte(&alarm_hour_ee);
alarm_min = eeprom_read_byte(&alarm_min_ee);
alarm_on = eeprom_read_byte(&alarm_on_ee);
LCD_SetUserChar(alarm, 1); // загружаем пользовательский символ в ОЗУ дисплея
//инициализация таймера 0
TCCR0 |= 0b00000101; // Включаем предделитель 1/1024
TIMSK |= 0b00000001; // разрешаем прерывания по переполнению таймера T0.
TCNT0=0; // Обнуляем счётный регистр таймера T0
sei(); // глобально разрешить прерывания
main:
LCD_Clear();
while (1)
{
i=BUT_GetKey();
// вывод времени
RTC_read_time ();
LCD_Goto(0,0);
BCD_2Lcd(hour);
LCD_WriteData(':');
BCD_2Lcd(min);
LCD_WriteData(':');
BCD_2Lcd(sec);
// вывод даты
LCD_Goto(0,1);
BCD_2Lcd(day);
LCD_WriteData('/');
BCD_2Lcd(month);
LCD_WriteData('/');
BCD_2Lcd(year);
// вывод дня недели
LCD_Goto(10,0);
put_wday ();
// вывод температуры
RTC_read_temper();
LCD_Goto(10,1);
LCD_WriteData('+');
BCD_2Lcd(t1);
LCD_WriteData(',');
BCD_1Lcd(t2);
LCD_WriteData('C');
// будильник
if(alarm_on==1) {
if(alarm_hour==hour) {
if(alarm_min==min) {
if(sec==1) {
al=1;
}
}
}
}
// отображение включенности будильника
if (alarm_on==1) {LCD_Goto(15,0); LCD_WriteData(1);}
else {LCD_Goto(15,0); LCD_WriteData(' ');}
// отключение сигнала будильника (сброс флага при нажатии кнопки 3)
i=BUT_GetKey();
if (i==3)
{ al=0; }
// при сработке будильника совершит действие
if (al==1)
{
LED_PORT |= (1<<LED);
}
else
{
LED_PORT &=~(1<<LED);
}
//_delay_ms(200);
//=== дальше настройки ===========
//==============
// кнопка 1 заходит в меню и перелистывает уровни менюшки
// кнопка 2 увеличивает переменную на 1 (защита от переполнения предусмотрена)
// кнопка 3 немедленно выходит из меню настроек
//
if (i==1)
{
LCD_Clear();
while (3) // настрока будильника
{
i=BUT_GetKey();
if (i==1)
{
j++;
}
if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}
// индикация настроек будильника
if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(6,1); LCD_SendStr(" ^^");}
if (j==3) {LCD_Goto(9,1); LCD_SendStr(" ^^");}
LCD_Goto(0,0);
LCD_SendStr("Alarm");
LCD_Goto(6,0);
BCD_2Lcd(alarm_hour);
LCD_WriteData(':');
BCD_2Lcd(alarm_min);
LCD_WriteData('-');
if (alarm_on==1)
{ LCD_SendStr("on "); }
else
{ LCD_SendStr("off"); }
switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{
alarm_hour++;
if (alarm_hour>23) {alarm_hour=0;}
}
}
case (2):
{
if (j!=2) {break;}
if (i==2)
{
alarm_min++;
if (alarm_min>59) {alarm_min=0;}
}
}
case (3):
{
if (j!=3) {break;}
if (i==2)
{
alarm_on++;
if (alarm_on>1) {alarm_on=0;}
}
}
}
if (j==4) // сохранить настройки и продолжить
{
//сохранить значения в eeprom
eeprom_write_byte(&alarm_hour_ee, alarm_hour);
eeprom_write_byte(&alarm_min_ee, alarm_min);
eeprom_write_byte(&alarm_on_ee, alarm_on);
j=1;
LCD_Clear();
break;
}
}
while (2) // настройка времени
{
i=BUT_GetKey();
if (i==1)
{
j++;
}
if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}
// индикация настраевомого времени
if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(6,1); LCD_SendStr(" ^^");}
LCD_Goto(0,0);
LCD_SendStr("Time");
LCD_Goto(6,0);
BCD_2Lcd(hour);
LCD_WriteData(':');
BCD_2Lcd(min);
LCD_WriteData(':');
BCD_2Lcd(0);
switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{
hour++;
if (hour>23) {hour=0;}
}
}
case (2):
{
if (j!=2) {break;}
if (i==2)
{
min++;
if (min>59) {min=0;}
}
}
}
if (j==3) // сохранить настройки и продолжить
{
RTC_write_time(hour, min, 0);
j=1;
LCD_Clear();
break;
}
}
while (2) // настрока даты
{
i=BUT_GetKey();
if (i==1)
{
j++;
}
if (i==3) // отменить и выйти
{
i=0;
j=1;
goto main;
}
// индикация настраиваемой даты и дня недели
if (j==1) {LCD_Goto(5,1); LCD_SendStr("^^");}
if (j==2) {LCD_Goto(5,1); LCD_SendStr(" ^^");}
if (j==3) {LCD_Goto(8,1); LCD_SendStr(" ^^");}
if (j==4) {LCD_Goto(11,1); LCD_SendStr(" ^^");}
LCD_Goto(0,0);
LCD_SendStr("Date");
LCD_Goto(5,0);
BCD_2Lcd(day);
LCD_WriteData('/');
BCD_2Lcd(month);
LCD_WriteData('/');
BCD_2Lcd(year);
LCD_WriteData(' ');
put_wday();
switch (j)
{
case (1):
{
if (j!=1) {break;}
if (i==2)
{
day++;
if (day>31) {day=1;}
}
}
case (2):
{
if (j!=2) {break;}
if (i==2)
{
month++;
if (month>12) {month=1;}
}
}
case (3):
{
if (j!=3) {break;}
if (i==2)
{
year++;
if (year>40) {year=12;}
}
}
case (4):
{
if (j!=4) {break;}
if (i==2)
{
wday++;
if (wday>6) {wday=0;}
}
}
}
if (j==5) // сохранить настройки и продолжить
{
RTC_write_date (wday, day, month, year);
j=1;
LCD_Clear();
break;
}
}
}
//=== конец настроек =============
//==============
} // end while(1)
} // end main
