07. december 2001 - 19:56
Der er
1 løsning
timerinterrrupt i c program under dos
hejsa,
Hvordan sætter man et interrupt eller en timer op så der bliver kørt en bestemt funktion inden for et bestemt tidsinterval?
Det skal pointeres at programmet kører under DOS.
På forhånd tak
11. december 2001 - 10:22
#1
Denne laver et lille ur i nederste højre hjørne. Du trykker blot ESC eller \'EXIT\' på det nye prompt for at stoppe uret:
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
/* The clock tick interrupt */
#define INTR 0X1C
struct time curTim;
int timX, timY;
int oldX, oldY;
char curTimStr[16]; // TT:MM:SS + attributter.
void interrupt ( *oldtimertick)(...);
/* -------------------------- HOVED PROGRAM ----------------------- */
void interrupt timertick(...)
{
disable();
/* S† hent nuv. tid - og smid det ud p† skr‘men. */
gettime(&curTim);
/*
curTimStr[0] = \'0\' + curTim.ti_hour / 10;
curTimStr[2] = \'0\' + curTim.ti_hour % 10;
curTimStr[6] = \'0\' + curTim.ti_min / 10;
curTimStr[8] = \'0\' + curTim.ti_min % 10;
curTimStr[12] = \'0\' + curTim.ti_sec / 10;
curTimStr[14] = \'0\' + curTim.ti_sec % 10;
puttext(timX, timY, timX+8, timY, &curTimStr);
*/
oldX = wherex(); oldY = wherey();
gotoxy(timX, timY);
cprintf(\"%0d:%0d:%0d\", curTim.ti_hour, curTim.ti_min, curTim.ti_sec);
gotoxy(oldX, oldY);
oldtimertick();
enable();
return;
} // timertick
int main(int argc, char* argv[])
{
/* Initier egne variable. (Forventer op til 2 params - men ingen er OK. */
if (argc < 2 || (timX = atoi(argv[1])) < 1 || timX > 72)
timX = 72;
if (argc < 3 || (timY = atoi(argv[2])) < 1 || timY > 24)
timY = 24;
gettext(timX, timY, timX+8, timY, &curTimStr);
curTimStr[4] = curTimStr[10] = \':\';
oldtimertick = getvect(INTR);
/* Flyt timer tick til egen rutine - og start ny DOS skal. Hvis brugeren */
/* skriver \'exit\' afsluttes den, og dermed forsvinder ogs† uret. */
setvect(INTR, timertick);
clrscr();
cprintf(\"Ur k›rer i position (X,Y) = (%d,%d)\\r\\n\", timX, timY);
cputs(\"Tryk p† en tast for at starte DOS - ESC for at afbryde.\");
if (getch() != 0x1B)
system(getenv(\"COMSPEC\"));
/* S‘t timer tick tilbage til gamle handler - og afslut dette program. */
setvect(INTR, oldtimertick);
return 0;
} // MAIN