+1 И я о том-же... Как припрет, ужом изовьешься, лишь бы было полезно...
#include <windows.h> #include <dos.h> #define ST_PORT 0x368 /* Адрес программного запуска */ #define TIMER_0 0x36c /* Адрес 0-го таймера/счетчика */ #define TIMER_1 0x36d /* Адрес 1-го таймера/счетчика */ #define TIMER_2 0x36e /* Адрес 2-го таймера/счетчика */ #define TIMER_CTRL 0x36f /* Адрес управляющего регистра таймера */ #define INTR 0X8 /* The clock tick interrupt */ #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif int count=0; int count1=0; int out_mas[8]; unsigned char out_val; unsigned char i; void FAR interrupt ( *oldhandler)(__CPPARGS); void FAR interrupt handler(__CPPARGS) { count++; count1++; outportb(0x378,out_val); for(i=0;i<8;i++) { if(out_mas[i] < count) out_val &= 255-(1<<i); else out_val |= (1<<i); } if(count==31)count=0; if(count1==128) { count1=0; oldhandler(); /* call the old routine */ } else outportb(0x20,0x20); } #pragma argsused int FAR PASCAL LibMain( HINSTANCE hInstance, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine ) { if ( wHeapSize != 0 ) UnlockData( 0 ); outp(0x364,0); //init adc outp(TIMER_CTRL, 0x34); /* Задание частоты запусков АЦП */ outp(TIMER_0, 0xff); /* Частота = 2000/К (кГц) */ outp(TIMER_0, 0x00); /* К - код в счетчике 0 */ outp(TIMER_CTRL, 0x74); /* Задание частоты запусков АЦП */ outp(TIMER_1, 0xff); /* Частота = 2000/К (кГц) */ outp(TIMER_1, 0x00); /* К - код в счетчике 0 */ oldhandler = getvect(INTR); setvect(INTR, handler); outportb(0x43,0x36); outportb(0x40,0); outportb(0x40,0x2); //18.2*128 return 1; } #pragma argsused int FAR PASCAL WEP ( int bSystemExit ) { setvect(INTR, oldhandler); outportb(0x43,0x36); outportb(0x40,0); outportb(0x40,0); //18.2 return 1; } int FAR PASCAL _export ADC(int * channel) { outp(0x360,* channel); while(! (inp(0x366) & 1)); return((inpw(0x360)) & 0xfff); } void FAR PASCAL _export DAC(int *channel,int *value) { out_mas[*channel] = *value >>7; }