Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть2 / lab1sem / rtc
.CPP#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;
}