⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d50_time.c

📁 dos下时钟显示程序 dos下时钟显示程序 dos下时钟显示程序 dos下时钟显示程序
💻 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 + -