Скачиваний:
24
Добавлен:
15.09.2014
Размер:
4.61 Кб
Скачать
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <time.h>
int n;
void interrupt (*old)(...);     //adres starogo obrabot4uka
void interrupt newint(...){     //opisaniye novogo obrabot4uka
outp(0x70,0x0C);                //vabiraem registr C i vabrasivaem soderjimoe
inp(0x71);                      //0x70 - opredeleniye indeksa
n++;                            //0x71 - cteniye/zapis' iz dannogo byta
outport(0x20,0x20);             //sbros kontrolera prerivaniy
outport(0xA0,0x20);             //sbros sleiva
}

void setDelay(int k){
n=0;
old = getvect(0x70);           //zapominaem stariy obrabot4ik
setvect(0x70,newint);          //ystanavlivaet noviy
char tmp;
//vkluchenie
tmp = inp(0xA1);              //preruvaniye dlia raboty s RTC
outp(0xA1, tmp&0xFE);         //sbrasivaem periodicheschie prerivaniya

outp(0x70,0x0B);             //ystanovit' index registra B
tmp = inp(0x71);             //chitat' tekyschee znacheniye registra B

outp(0x70,0x0B);             //ystanovit' index snova, chtenye bedet v registr D
outp(0x71,tmp|0x40);         //zanosit bit 6 v registr D
//interrupt tickaet 1024 raza v sec
//ogranichenie cikla idet po kol-ve tickov
//i vvoditsia (peremennaia k) imenno kol-vo
//tickov, vi mojete sdelat' v ms...
while(n<k){}
printf("delay = %d , interrupt = %d\n" , k,n);
//vickluchenie

outp(0x70,0x0B);            //ystanovit' index registra B
tmp = inp(0x71);            //chitat' tekyschee znacheniye registra B

outp(0x70,0x0B);           //ystanovit' index snova chtenye bydet v registr D
outp(0x71,tmp&0xBF);       //registr B=B&10111111

tmp = inp(0xA1);
outp(0xA1, tmp|0x01);

setvect(0x70,old);        //ystanovka starogo vectora prerivaniya
}

void getDate(){
char h,m,s;              //hours, minutes, seconds
//char d,M,y;            //day, month, year
outp(0x70,0x00);         //polycheniye po adresam CMOS-pamiyaty
s = inp(0x71);           //znacheniy vremeny
			 //i zapis' ih v peremenniye
outp(0x70,0x02);
m = inp(0x71);

outp(0x70,0x04);
h = inp(0x71);

printf("\n%x:%x:%x",h,m,s);
time_t timer;
timer = time(0);
printf("\n%s",ctime(&timer)); //vyvod znacheniya systemnogo vremeny
}

char getBCD(char type){
char tmp1,tmp2;

do{
	switch(type){
		case 'm':
		printf("set minutes : ");
		break;
		case 's':
		printf("set seconds : ");
		break;
		case 'h':
		printf("set hours : ");
		break;
		default: printf("\nuncorrect parameter\n");return '0';
	}
	scanf("%c%c",&tmp1,&tmp2);
	fflush(stdin);
	if(tmp1 < '0' || tmp1 > '9' || tmp2 < '0' || tmp2 > '9'){
	printf("input error - try again\n");
	continue;
	}
	tmp1 -= '0';          //perehod ot aski kodov k znacheniyam
	tmp2 -= '0';
	tmp1 <<= 4;
	tmp1 += tmp2;
	switch(type){
		case 'm':
		case 's':
		if(tmp1 > 0x59 || tmp1 < 0x00)
		printf("input error - try again\n");
		else{
		 return tmp1;
		}             //priveriaem pravil'nost' vvedennih
		break;        //znacheniy vremeny
		case 'h':
		if(tmp1 > 0x23 || tmp1 < 0x00)
		printf("input error - try again\n");
		else{
		 return tmp1;
		}
		break;
	}
	fflush(stdin);
}while(1);
return tmp1;
}

void setDate(){
char h,m,s;
char tmp;
h = getBCD('h');        //ystanovka hours
m = getBCD('m');        //ystanovka minutes
s = getBCD('s');        //ystanovka seconds
printf("\n%x:%x:%x", h,m,s);

	printf("\ntime before: ");
	getDate();
	do{
	outp(0x70,0x0A);
	tmp = inp(0x71);
	if(!(tmp & 0x80)) {
	 break;
	}
	}while(1);
	outp(0x70,0x0B);
	tmp = inp(0x71);

	outp(0x70,0x0B);
	outp(0x71,tmp|0x80);

	outp(0x70,0x00);    //chteniye znacheniy vremeny do ystanovki
	outp(0x71,s);

	outp(0x70,0x02);
	outp(0x71,m);

	outp(0x70,0x04);
	outp(0x71,h);

	outp(0x70,0x0B);
	tmp = inp(0x71);

	outp(0x70,0x0B);
	outp(0x71,tmp&0x7f);

	printf("\ntime after: ");   //vuvod polychivshegosya vremeny
	getDate();

}

void main(){
char command;
clrscr();
while(1){
printf("---------------------------------\n1 - get time \n2 - set time\n3 - delay\nq - exit\n");
	scanf("%c",&command);
	fflush(stdin);
	switch(command){

		case '1':          //polychit'
		clrscr();
		getDate();
		break;

		case '2':          //ystanovit'
		clrscr();
		printf("set new time: \n");
		setDate();
		break;

		case '3':         //zaderjka
		printf("set delay in msec: ");
		int t = 0;
		scanf("%d", &t);
		setDelay(t);
		fflush(stdin);
		break;

		case 'q':       //exit program
		exit(1);

		default:
		clrscr();
		printf("please, press another key\n");
	}

}


return;
}
Соседние файлы в папке lab1sem