- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
// процедура ввода новой даты в RTC
long __new_date()
{
date sysdate;
unsigned long str,i;
unsigned char tmpbuf[16];
// ...
nextda: __putsV("\n\rВведите новую дату: ");
__getsV(tmpbuf,10);
if(tmpbuf[0]==0) goto daok;
//проверка строки на допустимые символы '0'-'9' и '.'
for(i=0; tmpbuf[i]!=0; i++)
{ if((tmpbuf[i]>0x39 || tmpbuf[i]<0x30) && tmpbuf[i]!=0x2e) goto baddat;
}
//проверка числа в диапазоне 01-31
if(((tmpbuf[0]==0x33)&&(tmpbuf[1]>0x31)) || (tmpbuf[0]>0x33)
|| (tmpbuf[1]==0x2e) || ((tmpbuf[0]==0x30)&&(tmpbuf[1]==0x30)) ) goto baddat;
//проверка точки после числа
if((tmpbuf[2]!=0x2e) && (tmpbuf[2]!=0x0)) goto baddat;
if((tmpbuf[2]==0x0) || (tmpbuf[3]==0x00))
{ sysdate.ti_date=(tmpbuf[1]-0x30)+((tmpbuf[0]-0x30)<<4);
goto fordok; }
//проверка месяца в диапазоне 01-12
if(((tmpbuf[3]==0x31)&&(tmpbuf[4]>0x32)) || (tmpbuf[3]>0x31)
|| (tmpbuf[4]==0x2e) || ((tmpbuf[3]==0x30)&&(tmpbuf[4]==0x30)) ) goto baddat;
//проверка точки после месяца
if((tmpbuf[5]!=0x2e) && (tmpbuf[5]!=0x0)) goto baddat;
if((tmpbuf[5]==0x0) || (tmpbuf[6]==0x00))
{ sysdate.ti_date=(tmpbuf[1]-0x30)+((tmpbuf[0]-0x30)<<4);
sysdate.ti_month=(tmpbuf[4]-0x30)+((tmpbuf[3]-0x30)<<4);
goto fordok; }
//проверка года в диапазоне 00-99
if((tmpbuf[6]==0x2e) || (tmpbuf[7]==0x2e)) goto baddat;
if(tmpbuf[7]==0x00) goto baddat;
if(tmpbuf[8]==0x0)
{ sysdate.ti_date=(tmpbuf[1]-0x30)+((tmpbuf[0]-0x30)<<4);
sysdate.ti_month=(tmpbuf[4]-0x30)+((tmpbuf[3]-0x30)<<4);
sysdate.ti_year=(tmpbuf[7]-0x30)+((tmpbuf[6]-0x30)<<4);
goto fordok; }
baddat: __putsV("\n\rДата введена неверно (дд.мм.гг)");
goto nextda;
//установка новой даты
fordok:
__set_date(&sysdate);
daok:
return 0;
}
Из ПО отечественного шифродевайса. Функция получает от "оператора" время (дд.мм.гг), проверяет его на корректность и пишет в Real Time Clock.