#include #include #include #include #include #include #define CLOCK_LOW 0xfb #define CLOCK_HIGH 0x04 #define DIN_LOW 0xef #define DIN_HIGH 0x10 #define CS_LOW 0xf7 #define CS_HIGH 0x08 #define POWER_ON 0x01 #define POWER_OFF 0xfe typedef unsigned int WORD; int out_port, in_port, out, power_boost_status=0; char msg[80]; float read_data(int measure) /* read data from MAX132 */ { int i, j, test_bit, data[3], command[4]; float data_dis; data[0]=0; data[1]=0; data[2]=0; if (measure==0) command[0]=0x92; /* set to read zero offset */ else command[0]=0x82; /* set to read input voltage */ command[1]=0x04; command[2]=0x00; command[3]=0x00; out|=CS_HIGH; outportb(out_port, out); for (j=0; j<4; j++) { out&=CS_LOW; /* CS low */ outportb(out_port, out); delay(1); test_bit=0x80; for (i=0; i<8; i++) /* start convert */ { if ((command[j]&test_bit)==0) out&=DIN_LOW; else out|=DIN_HIGH; outportb(out_port, out); delay(1); out|=CLOCK_HIGH; /* clock high */ outportb(out_port, out); delay(1); if (j!=0) data[j-1]=data[j-1]*2+(inportb(in_port)&0x10)/16; out&=CLOCK_LOW; outportb(out_port, out); /* clock low */ delay(1); test_bit/=2; } out|=CS_HIGH; /* CS high */ outportb(out_port, out); delay(1); if (j==0) delay(100); /* wait 100ms */ } data_dis=((float)data[2])/64+((float)data[1])*4+((float)(data[0]&0x07))/512; if ((data[0]&0x08)==0) return (data_dis); else return (data_dis-1024+1/512); } void display_data(float data_dis) { int current_x; current_x=(int)(data_dis/2); setviewport(10, 200, 630, 220, 1); clearviewport(); setfillstyle(1, YELLOW); bar(310, 0, (current_x+310), 10); /* show a bar on screen */ setviewport(280, 240, 630, 300, 1); clearviewport(); if (data_dis>512 || data_dis<-512) sprintf(msg, "Overrange!"); else sprintf(msg, "%.2f mV", data_dis); outtext(msg); /* show data on screen */ } void init_screen(void) /* initialize display screen */ { setbkcolor (BLUE); setcolor(WHITE); line(2,2,637,2); line(5,4,634,4); line(2,2,2,477); line(5,4,5,475); line(5,475,634,475); line(2,477,637,477); line(634,5,634,475); line(637,2,637,477); line(3,350,634,350); setviewport(450,440,630,460,1); sprintf(msg, "press any key to quit"); outtext(msg); setviewport(0,0,639,479,1); } int init_graph(void) /* initialize graphic mode */ { int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, ""); errorcode = graphresult(); if (errorcode != grOk) /* an error occurred */ { printf("Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to halt:"); getch(); exit(1); /* return with error code */ } } void find_port(void) /* find printer port address */ { out=0; out_port=*(WORD far *)MK_FP(0x0040, 8); in_port=out_port+1; out|=POWER_ON; outportb(out_port, out); delay(100); } void clean_up(void) /* close graphic mode */ { closegraph(); out&=POWER_OFF; outportb(out_port, out); /* turn off power supply */ } void main(void) { int channel, measure=0, k; float tp, measured_data=0, zero_offset; find_port(); init_graph(); init_screen(); delay(1000); read_data(measure); read_data(measure); read_data(measure); for (k=0; k<8; k++) measured_data+=read_data(measure); zero_offset=measured_data/8; measure=1; do{ measured_data=0; for (k=0; k<8; k++) { tp=read_data(measure); measured_data+=(tp-zero_offset); } display_data(measured_data/8); } while(!kbhit()); /* quit if hit any key */ clean_up(); }