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