Хочу расширить свой вопрос.
В проекте используется DS1307.
Фрагменты кода:
typedef union
{
struct __TIMER__
{
unsigned char seconds;
unsigned char minutes;
unsigned char hours;
unsigned char day;
unsigned char date;
unsigned char mounth;
unsigned char year;
unsigned char control;
};
unsigned char tm[LENGHT_TIME_DATA];
}TIMER;
extern TIMER time;
Данные из RTC переписываются по команде:
// Читаем регистры DS1307
for(i = 0;i < LENGHT_TIME_DATA - 1;i++)
{
// Выставляем подтверждение ЕА
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
while(!TESTBIT(TWCR,TWINT));
time.tm[i] = TWDR;
Показания хочу выводить в виде
часы,-,минуты,-,секунды или день недели, ,дата,месяц,год
Сформированы масивы
unsigned char array[2][number_max];
// Быстрое преобразование десятичной цифры в семисегментный образ
__flash const char indicator[12]={0xC0,0xFC,0xA4,0xB0,0x99,0x92,0x02,0xF8,0x80,0x90,0xBF,0xF7};
// Быстрое преобразование адреса разряда в дешифрированное значение
__flash const char adr[number_max] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
я не придумал ничего лучше, как переписать данные:
array [0][0]=time.tm[0]&0x0F;
array [0][1]=time.tm[0]&0x70;
array [0][2]=defis;
array [0][3]=time.tm[1]&0x0F; и так далее
Вывод провожу вот так
// Обработка прерывания по таймеру ТС0
#pragma vector=TIMER0_OVF_vect
__interrupt void STROB (void)
{
unsigned char static cnt;
TCNT0=0x80; // Предварительная загрузка таймера
display=screen_off; // Выключить индикатор
if (!flag_data_time)
{ // показываем [часы - минуты - секунды]
if (!((cnt==2)||(cnt==4)))
{
display=indicator[array[0][cnt]];
strob=adr[cnt];
}
else
{
display=indicator[array[0][10]]; // показываем --
strob=adr[cnt];
}
}
else
{ // показываем [день недели _ число. месяц. год]
if (!(cnt==6)||(cnt==4)||(cnt==2))
{
display=indicator[array[1][cnt]];
strob=adr[cnt];
}
else
{
if (cnt==6)
{
display=indicator[array[1][11]]; // добавляем пробел после дня неделиздесь предупреждение strob=adr[cnt];
}
else
{
display=indicator[array[0][cnt]]&0x7F; // добавляем число и месяц с точкой
strob=adr[cnt];
}
}
}
cnt++;
if (cnt==8) cnt=0;
}
Компилятор выдаёт предупреждение Warning[Pe175]: subscript out of range Что это? И можно ли сделать попроще?
Извините, что нагружаю большим кодом!