📄 d50_time.c
字号:
/* ************************************************************************ */
/* */
/* Projekt : DAW50 / eichfaehig Autor : H.Kern */
/* */
/* Modul : Time Datum : 23-Mai-95 */
/* */
/* ************************************************************************ */
/* */
/* */
/* 日期时间处理模块 */
/* */
/* ************************************************************************ */
/* */
/* dd-mmm-yy (..) v. x.xx */
/* 20-Mrz-97 (ke) v. 3.50 */
/* 20-AUG-97 (ke) */
/* */
/* ************************************************************************ */
#include <stdlib.h>
#include <stdio.h>
#include <dos.h>
#include <RTKernel.h>
#include <Timer.h>
#include "D50_KBRD.h"
#include "D50_COMX.h"
#define PARI PARITY_NONE
#define DATABIT 8
#define STOPBIT 1
#define STACK 4096
#define MAINPRIOR 8
/***************************************************************************/
/* */
/* Ectronic GmbH */
/* */
/***************************************************************************/
#define RTC_SEC_1 0x70 /* Adresse des Registers "SEC_1 */
#define RTC_SEC_10 0x71 /* Adresse des Registers "SEC_10 */
#define RTC_MIN_1 0x72 /* Adresse des Registers "MIN_1 */
#define RTC_MIN_10 0x73 /* Adresse des Registers "MIN_10 */
#define RTC_STD_1 0x74 /* Adresse des Registers "STD_1 */
#define RTC_STD_10 0x75 /* Adresse des Registers "STD_10 */
#define RTC_TAG_1 0x76 /* Adresse des Registers "TAG_1 */
#define RTC_TAG_10 0x77 /* Adresse des Registers "TAG_10 */
#define RTC_MON_1 0x78 /* Adresse des Registers "MON_1 */
#define RTC_MON_10 0x79 /* Adresse des Registers "MON_10 */
#define RTC_JAH_1 0x7a /* Adresse des Registers "JAH_1 */
#define RTC_JAH_10 0x7b /* Adresse des Registers "JAH_10 */
#define RTC_WOC_1 0x7c /* Adresse des Registers "WOC_1 */
#define RTC_REG_D 0x7d /* Adresse des Registers "REG_D */
#define RTC_REG_E 0x7e /* Adresse des Registers "REG_E */
#define RTC_REG_F 0x7f /* Adresse des Registers "REG_F */
#define MASKE_4_BIT 0x0f /* Maske, um nur die unteren */
/* Bits beizubehalten */
#define AM_PM_MASKE 0x0b /* Maske um AM/PM-Bit auszu- */
/* maskieren */
#define TEST_1 0x08 /* Test-Bit gesetzt */
#define TEST_0 0x00 /* Test-Bit geloescht */
#define RSET_1 0x01 /* Reset-Bit gesetzt */
#define RSET_0 0x00 /* Reset-Bit geloescht */
#define M_24H 0x04 /* 24h-Betrieb */
#define M_12H 0x00 /* 12h-Betrieb */
#define STOP_1 0x02 /* Stop-Bit gesetzt */
#define STOP_0 0x00 /* Stop-Bit geloescht */
#define M_30SEC_1 0x08 /* 30sec-Bit gesetzt */
#define M_30SEC_0 0x00 /* 30sec-Bit geloescht */
#define IRQ_1 0x04 /* IRQ-Bit gesetzt */
#define IRQ_0 0x00 /* IRQ-Bit geloescht */
#define HOLD_1 0x01 /* Hold-Bit gesetzt */
#define HOLD_0 0x00 /* Hold-Bit geloescht */
#define REG_E 0x01 /* Initialisierungswert fuer REG-E */
/* Std.P ist offen, Standard- */
/* Modus, Periodendauer = 1/64s */
typedef struct
{
char Datum[6];
char Uhrzeit[6];
char Hundertstel[2];
char Dat[3];
char Uhr[3];
char Hun;
} DatumUhrzeitTyp;
struct tim//a
{
unsigned char ti_min;
unsigned char ti_hour;
unsigned char ti_hund;
unsigned char ti_sec;
}t;
struct dat//a
{
int da_year;
char da_day;
char da_mon;
}d;
unsigned char TimeString[ 9];
unsigned char TimeBinary[ 3];
unsigned char DateString[10];
unsigned char DateBinary[ 3];
unsigned char Monate[36] = { 'J','a','n', 'F','e','b', 'M','r','z', 'A','p','r',
'M','a','i', 'J','u','n', 'J','u','l', 'A','u','g',
'S','e','p', 'O','k','t', 'N','o','v', 'D','e','z' };
TaskHandle TimeHandle;
Semaphore TimeSema;
/* ************************************************************************ */
/* */
/* ReadUhrzeit () */
/* */
/* ************************************************************************ */
char ReadUhrzeit (void)//读更改时间
{
unsigned char TimeByte[2];
unsigned char StdAlt;
RTKWait ( TimeSema );
StdAlt = TimeBinary[0];
gettime(&t);
// TimeByte [0] = (inportb (RTC_STD_10) & MASKE_4_BIT);
// TimeByte [1] = (inportb (RTC_STD_1 ) & MASKE_4_BIT);
TimeByte[0]=t.ti_hour/10;//a
TimeByte[1]=t.ti_hour%10;//a
TimeString[0] = TimeByte[0] + '0';//时字节
TimeString[1] = TimeByte[1] + '0';//时字节
TimeBinary[0] = TimeByte[0]*10+TimeByte[1];
// TimeByte [0] = (inportb (RTC_MIN_10) & MASKE_4_BIT);
// TimeByte [1] = (inportb (RTC_MIN_1 ) & MASKE_4_BIT);
TimeByte[0]=t.ti_min/10;//a
TimeByte[1]=t.ti_min%10;//a
TimeString[3] = TimeByte[0] + '0';//分高字节
TimeString[4] = TimeByte[1] + '0';//分高字节
TimeBinary[1] = TimeByte[0]*10+TimeByte[1];
// TimeByte [0] = (inportb (RTC_SEC_10) & MASKE_4_BIT);
// TimeByte [1] = (inportb (RTC_SEC_1 ) & MASKE_4_BIT);
TimeByte[0]=t.ti_sec/10;//a
TimeByte[1]=t.ti_sec%10;//a
TimeString[6] = TimeByte[0] + '0';//秒高字节
TimeString[7] = TimeByte[1] + '0';//秒高字节
TimeBinary[2] = TimeByte[0]*10+TimeByte[1];
RTKSignal ( TimeSema );
// if (( TimeBinary[0] == 0 ) && ( StdAlt == 23 )) { return ( True ); }
// else { return ( False ); }
//RTKWait ( TimeSema );
//gettime(&t);
//RTKSignal ( TimeSema );
}
/* ************************************************************************ */
/* */
/* ReadDatum () */
/* */
/* ************************************************************************ */
void ReadDatum (void)//读日期
{
unsigned char DateByte[2];
RTKWait ( TimeSema );
// DateByte [0] = (inportb (RTC_TAG_10) & MASKE_4_BIT);
// DateByte [1] = (inportb (RTC_TAG_1 ) & MASKE_4_BIT);
getdate(&d);//a
DateByte[0]=d.da_day/10;//a
DateByte[1]=d.da_day%10;//a
DateBinary[0] = DateByte[0]*10+DateByte[1];
DateString[0] = DateByte[0] + '0';//日字节,高字节
DateString[1] = DateByte[1] + '0';//日字节,低字节
// DateByte [0] = (inportb (RTC_MON_10) & MASKE_4_BIT);
// DateByte [1] = (inportb (RTC_MON_1 ) & MASKE_4_BIT);
// DateBinary[1] = DateByte[0]*10+DateByte[1];
// DateBinary[1]=d.da_mon;//a
DateByte[0]=d.da_mon/10;//a
DateByte[1]=d.da_mon%10;//a
DateBinary[1] = DateByte[0]*10+DateByte[1];
DateString[3] = Monate[DateBinary[1]*3-3];//月字节
DateString[4] = Monate[DateBinary[1]*3-2];//月字节
DateString[5] = Monate[DateBinary[1]*3-1];//月字节
// DateByte [0] = (inportb (RTC_JAH_10) & MASKE_4_BIT);
// DateByte [1] = (inportb (RTC_JAH_1 ) & MASKE_4_BIT);
DateBinary[2] = DateByte[0]*10+DateByte[1];
DateByte[0]=(d.da_year%100)/10;
DateByte[1]=(d.da_year%100)%10;
DateString[7] = DateByte[0] + '0';//年字节
DateString[8] = DateByte[1] + '0';//年字节
RTKSignal ( TimeSema );
// return d;
}
/* ************************************************************************ */
/* */
/* SetZeit () */
/* */
/* ************************************************************************ */
void SetZeit ( struct time *T )//设置时间
{
div_t Zahl;
char Ausgabe;
RTKWait ( TimeSema );
Ausgabe = 0;
outportb (0xfff5,0x77); /* Wait-States zum Beschreiben */
/* Initialisierung der RTC */
Ausgabe = TEST_0 | RSET_1 | M_24H | STOP_1;
outportb (RTC_REG_F, Ausgabe);
Zahl = div ( T->ti_sec, 10 );
outportb ( RTC_SEC_1, Zahl.rem ); /* Sekunden = 0 */
outportb ( RTC_SEC_10, Zahl.quot );
Zahl = div ( T->ti_min, 10 );
outportb ( RTC_MIN_1 , Zahl.rem ); /* Rest */
outportb ( RTC_MIN_10, Zahl.quot ); /* Quotient */
Zahl = div ( T->ti_hour, 10 );
outportb ( RTC_STD_1, Zahl.rem ); /* Rest */
/* AM/PM-Bit ausmaskieren */
outportb ( RTC_STD_10, ( Zahl.quot & AM_PM_MASKE ));
Ausgabe = 0;
Ausgabe = M_30SEC_0 | IRQ_0 | HOLD_0; /* fuer Register D */
outportb (RTC_REG_D, Ausgabe);
Ausgabe = 0;
Ausgabe = TEST_0 | M_24H | STOP_0 | RSET_0;
/* Ende der Initialisierung, wenn der naechste "outportb"- */
/* Befehl ausgefuehrt wird, wird die Uhr gestartet */
outportb ( RTC_REG_F, Ausgabe);
outportb ( 0xfff5, 0x00); /* Wait-States zuruecksetzen */
RTKSignal ( TimeSema );
}
/* ************************************************************************ */
/* */
/* SetDatum () */
/* */
/* ************************************************************************ */
void SetDatum ( struct date *D )//设置日期
{
div_t Zahl;
char Ausgabe;
RTKWait ( TimeSema );
Ausgabe = 0;
outportb (0xfff5,0x77); /* Wait-States zum Beschreiben */
/* Initialisierung */
Ausgabe = TEST_0 | RSET_1 | M_24H | STOP_1;
outportb (RTC_REG_F, Ausgabe);
Zahl = div ( D->da_day, 10 );
outportb ( RTC_TAG_1 , Zahl.rem ); /* Rest */
outportb ( RTC_TAG_10, Zahl.quot ); /* Quotient */
Zahl = div ( D->da_mon ,10 );
outportb ( RTC_MON_1 , Zahl.rem ); /* Rest */
outportb ( RTC_MON_10, Zahl.quot ); /* Quotient */
Zahl = div ( D->da_year,10 );
outportb ( RTC_JAH_1 , Zahl.rem ); /* Rest */
outportb ( RTC_JAH_10, Zahl.quot ); /* Quotient */
outportb ( RTC_WOC_1, 1 ); /* DUMMY */
outportb ( RTC_REG_E, REG_E); /* Register E setzen */
Ausgabe = 0;
Ausgabe = M_30SEC_0 | IRQ_0 | HOLD_0; /* fuer Register D */
outportb ( RTC_REG_D, Ausgabe);
Ausgabe = 0;
Ausgabe = TEST_0 | M_24H | STOP_0 | RSET_0;
outportb ( RTC_REG_F, Ausgabe );
outportb ( 0xfff5,0x00); /* Wait-States zuruecksetzen */
RTKSignal ( TimeSema );
// ReadDatum ();
}
/*PAGE*/
/* ************************************************************************ */
/* */
/* PRGTimer () */
/* */
/* ************************************************************************ */
void PRGTimer (void)//程序计时器
{
struct time t;
char An = 0;
char Cnt = 0;
RTKDelay (10);
while ( 1)
{
RTKDelay ( 30 );
RTKDelay ( 10 );
// if ( ReadUhrzeit () ) { ReadDatum (); };
ReadDatum ();//读日期
ReadUhrzeit ();//读时间
RTKWait ( ScreenSema );
gotoxy ( 23, 1 );
printf ("%s %s",DateString,TimeString );
gotoxy ( 40,8);
RTKSignal ( ScreenSema );
/* if ( NoKeyboard )
{
if ( !Cnt )
{
Cnt = 3;
if ( An )
{
An = False;
Set0x68 ( 0x80 );
}
else
{
An = True;
Set0x68 ( 0x40 );
}
}
else
{
Cnt--;
}
}*/
}
}
/* ************************************************************************ */
/* */
/* */
/* */
/* ************************************************************************ */
void InitTimer (void)//初始化计时器
{
TimeSema = RTKCreateSema (Binary ,1 );
TimerInit ();//初始化计时器
TimeString[2] = ':';
TimeString[5] = ':';
TimeString[8] = 0;
DateString[2] = '-';
DateString[6] = '-';
DateString[9] = 0;
SetTimerInterval(0.003); // 002 gibt 300 Hz
ReadUhrzeit ();//读时间
ReadDatum ();//读日期
TimeHandle = RTKCreateTask ( PRGTimer , MAINPRIOR-1, STACK, "PRGTime" );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -