Скачиваний:
25
Добавлен:
15.09.2014
Размер:
5.67 Кб
Скачать
	#include<dos.h>
	#include<stdio.h>
	#include<stdlib.h>
	#include<conio.h>
	int intrflag=0;
	union REGS rr;
	struct SREGS sr;
	////////////////////////////
	////////////////////////////
	///////////////////////////
	int convertBCDtoDEC(int BCD)
	{
	int a=BCD,rez=0;
	int b=1;
	while(a)
	{
	   rez+=(a&0x000f)*b;
	   a=a>>4;
	   b*=10;
	}
	return rez;
	}
	////////////////////////////////////////
	int convertDECtoBCD(int DEC)
	{
	 int Num1=0,Num2=0,Rez=0;
	 Num1=DEC%10;
	 Num2=(DEC-Num1)/10;
	 Rez=Num2;
	 Rez=Rez<<4;
	 Rez=Rez|Num1;
	 return Rez;
	}
	/////////////////////////////////////////
	////////////////////////////////////////
	void setABregs()
	{
	  int a=0;
	   do{
	      outp(0x70,0x0A);
	      a=inp(0x71);
	   }while(a&128);
	   outp(0x70,0x0B);
	   a=inp(0x71);
	   a=a|128;
	   outp(0x71,a);
	}
	void resetAB()
	{
	  int a=0;
	  outp(0x70,0x0B);
	   a=inp(0x71);
	   a=a&127;
	   outp(0x71,a);
	}
	////////////////////////////////////////////////
	/////////////////////////////////////////////////
	////////////////////////////////////////////////
	char menu()
	{
	   char flag=0;
	   do{
	   clrscr();
	   puts("Press key for chois item");
	   puts("1-Set time");
	   puts("2-Print current time");
	   puts("3-Set time budilnik");
	   puts("4-Exit");
	   flag=getch();
	   if(flag<'1'|| flag>'4') {puts("Uncorrect opration ");getch();}
	   }while(flag<'1'||flag>'4');
	   return flag;
	}
	//////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////
	void printclock()
	{
	  clrscr();
	  setABregs();
	  int i=4;
	  printf("\t\t");
	  for(i;i>=0;i-=2)
	  {
	    outp(0x70,i);
	    printf("%d",convertBCDtoDEC(inp(0x71)));
	    if(i>0) printf(":");
	  }
	  resetAB();
	 }
	 ///////////////////////////////////////////////////////////////
	 void setclock()
	 {
	  clrscr();
	  int sec=0,min=0,hour=0;
	  fflush(stdin);
	  int flag=1;
	  do{
	  puts("hour:");
	  scanf("%d",&hour);
	  if(hour<0 && hour>24) {printf("uncorrect");flag=0;}
	  puts("\n minute:");
	  scanf("%d",&min);
	  if(min<0 && min>60) {printf("uncorrect");flag=0;}
	  puts("\n second:");
	  scanf("%d",&sec);
	  if(sec<0 && sec>60) {printf("uncorrect");flag=0;}
	  }while(!flag);
	  setABregs();
	  outp(0x70,4);
	  outp(0x71,convertDECtoBCD(hour));
	  outp(0x70,2);
	  outp(0x71,convertDECtoBCD(min));
	  outp(0x70,0);
	  outp(0x71,convertDECtoBCD(sec));
	  resetAB();
	  printf("clock set completed");
	 }
	/////////////////////////////////////////////////////////
	/////////////////////////////////////////////////////////
	////////////////////////////////////////////////////////
	void unmasked()
	{
	  int a=0;
	  outp(0x70,0x0b);
	  a=inp(0x71);
	  a=a|32;
	  outp(0x70,0x0b);
	  outp(0x71,a);
	  a=inp(0xA1);
	  a=a&254;
	  outp(0xA1,a);
	}
	void masked()
	{
	  int a=0;
	  outp(0x70,0x0b);
	  a=inp(0x71);
	  a=a&223;
	  outp(0x70,0x0b);
	  outp(0x71,a);
	  a=inp(0xA1);
	  a=a|1;
	  outp(0xA1,a);
	}
	////////////////////////////////////////////////
	////////////////////////////////////////////////
	void interrupt new70()
	{
	  intrflag=1;
	  outp(0x70,0x0c);
	  inp(0x71);
	  outp(0x20,0x20);
	  outp(0xA0,0x20);
	}
	////////////////////////////////////////////////////
	////////////////////////////////////////////////////
	void setbudtime()
	{
	  clrscr();
	  int sec=0,min=0,hour=0;
	  fflush(stdin);
	  int flag=1;
	  do{
	  puts("hour:");
	  scanf("%d",&hour);
	  if(hour<0 && hour>24) {printf("uncorrect");flag=0;}
	  puts("\n minute:");
	  scanf("%d",&min);
	  if(min<0 && min>60) {printf("uncorrect");flag=0;}
	  puts("\n second:");
	  scanf("%d",&sec);
	  if(sec<0 && sec>60) {printf("uncorrect");flag=0;}
	  }while(!flag);
	  setABregs();
	  outp(0x70,5);
	  outp(0x71,convertDECtoBCD(hour));
	  outp(0x70,3);
	  outp(0x71,convertDECtoBCD(min));
	  outp(0x70,1);
	  outp(0x71,convertDECtoBCD(sec));
	  resetAB();
	  printf("budilnik set completed");
	 }
	 //////////////////////////////////////
	 ////////////////////////////////////////
	 void writevect(int in,void far *h)
	{
	rr.h.ah=0x25;rr.h.al=in;sr.ds=FP_SEG(h);
	rr.x.dx=FP_OFF(h);intdosx(&rr,&rr,&sr);
	}
	///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////
	//////////////////////////////////////////////////
	void beep(int chast,int slp)
	{
	int bound=(int)(1193180/chast);
	  outp(0x43,0xb6);
	  outp(0x42,0x00ff&bound);
	  int a=0;
	  a=bound>>8;
	  outp(0x42,a);
	  outp(0x61,inp(0x61)|3);
	  sleep(slp);
	}
	//////////////////
	void stop()
	{
	  outp(0x61,inp(0x61)&252);
	}
	//////////////////
	void play()
	{
	int not[5]={196,262,196,220,247};
	int inter[5]={1,1,1,1,1};

	  for(int i=0;i<5;i++)
	  {
	  beep(not[i],inter[i]);
	  }
	  stop();
	}
	///////////////////////////////////////////
	///////////////////////////////////////////
	//////////////////////////////////////////
	 void waitprer()
	 {
	   setbudtime();
	   unmasked();
	   writevect(0x70,new70);
	   intrflag=0;
	   while(!intrflag);
	   if(intrflag==1)
	   {
	   printf("\n\t\tbudilnik srabotal, vsem spasibo");
	   play();
           getch();
	   }
	   masked();
	 }
       /////////////////////////////////////////////////////////////////
	void main()
	{
	  char flag=0;
	 do{
	  flag=menu();
	  switch(flag)
	  {
		case '1':setclock();break;
		case '2':printclock();getch();break;
		case '3':waitprer();break;
		case '4':return;
	  }
	  }while(1);
	}
Соседние файлы в папке АВМиС