⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 outandin.cpp

📁 并口数据交互程序 实现计算机与单片机的数据交换
💻 CPP
字号:
/***

   rdbinary.c ----read binary data file and output data to lpt
   designed by lu biying, 2002.02.04

   using "nack" and "naf" as shavehanding signals while reading data
   using "nstrobe" and "busy" as shavehanding signals while writeing data
***/

//#include <math.h>
//#include <dos.h>
#include <stdio.h>
//#include <malloc.h>
#include <stdlib.h>
#include <conio.h>

#define pport  0x378
#define  N  0x400

   
void main()
{
     FILE	*fp;
     short int x1=0xaa;
     long int i,j;
     unsigned char wdata[N],rbdata[N];
     int IsValid=1;

     _outp(pport+2,0x0c);

 //    if((fp=fopen("e:\\wm\\temp\\lfm75.bin","rb"))==NULL)
   if((fp=fopen("e:\\xiong\\data\\data.bin","rb"))==NULL)
       {
	printf("\n数据文件不能打开");
	exit(0);
       }
     else
      {
	printf("\n读取数据文件 请等待...");
	for(i=0;i<N;i++) wdata[i]=fgetc(fp);
	printf("\n数据文件读取完毕");
      }
     fclose(fp);
     //设置并口为输出模式?会不会产生一个额外的中断?一般不会,开机后STB=AF=1,
     //不会产生下跳沿,即使不正常结束,设置STB=AF=1,也不会产生下跳沿. 
     _outp(pport+2,0x0c);//线上电平STB=AF=1   
     printf("\n\n加载数据...\n\n");
     for (i=0;i<N;i++)
      {
       test0: x1=_inp(pport+1);
	    x1=x1&0x80;
	    if(x1==0x80) goto test0;

	_outp(pport,wdata[i]);
	//_outp(pport+2,0x0c);//为0x0c时,bit0=0,bit1=0(线上电平STB=AF=1) 
	//_outp(pport+2,0x0c);//为0x0c时,bit0=0,bit1=0(线上电平STB=AF=1) 
	_outp(pport+2,0x0d);//为0x0d时,bit0=1,bit1=0(线上电平STB=0,AF=1)
	_outp(pport+2,0x0c);//为0x0c时,bit0=0,bit1=0(线上电平STB=AF=1) 
   // printf("\nwrite %d",i);
   //for(int j=0;j<=1000;j++) {;}
      }
 
	 printf("\n加载完毕!");
     //可以在输出结束之后,立即将并口置为输入状态
     //_outp(pport+2,0x2e);
//*******************************************************************************************
	 //此处可能会有问题,因为没有检测BUSY的电平是否为1(线上电平),已加入?????
//*******************************************************************************************


     printf("\n\n");
     test1: x1=_inp(pport+1);
	    x1=x1&0x80;
	    if(x1==0x80) goto test1;
       
     _outp(pport,0xff);      // set data port to 1
     _outp(pport+2,0x2c);	// set ctrl port bit5 to 1 --- input mode
				//not use interrupt mode to receive data
				//so bit4(IRQEN) is 0
     			        //为0x0c时,bit0=0,bit1=0(线上电平STB=AF=1) 
   //  printf("test ACK");			        
   //   test2:x1=_inp(pport+1);
	//   x1=x1&0x40;
	//   if(x1==0x40) goto test2; //线上电平ACK=0时,跳出检测,向下执行
     	   		
     printf("\n\n开始回读,清等待...");
     for (i=0;i<N;i++)
     {
     
		 _outp(pport+2,0x2e); //bit0=0,bit1=1(线上电平STB=1,AF=0)
     	                        //通知F206发送数据,同时置ACK=1
           
    // test3:x1=_inp(pport+1);
	//   x1=x1&0x40;
	 //  if(x1==0x40) goto test3; //线上电平ACK=0时,跳出检测,向下执行
       //printf("\nread back %d",i+1);
	
	//rbdata[i]=_inp(pport);
	//printf("\nread back %d",i+1);
	//for(int j=0;j<=1000;j++) {;}
		 j=0;
test4: if(j==0x0a) {printf("\n读不出数!");	goto exx;}
		 x1=_inp(pport+1);
	    x1=x1&0x80;
		j++;
	    if(x1==0x80) goto test4;
		 
	rbdata[i]=_inp(pport);
	  _outp(pport+2,0x2c); //bit0=0,bit1=0(线上电平STB=AF=1)             
     }
exx:	_outp(pport+2,0x0c);
     if((fp=fopen("e:\\xiong\\data\\rdback.bin","wb"))==NULL)
     {
      printf("\n\n回读数据文件打开错误.\n");
      exit(0);
     }
    else
     {
      printf("\n\n写入回读数据,请等待...");
      
      for(i=0;i<N;i++) fputc(rbdata[i],fp);
      printf("\n回读数据写入完毕!\n");
     }
    fclose(fp);
     printf("\n回读完毕!");
     
 //    _outp(pport+2,0x2e); //bit0=0,bit1=1(线上电平STB=1,AF=0),同时置ACK=1
                             //通知F206关闭从CPLD到PC机的三态门,RBEND
 //    _outp(pport+2,0x2c); //bit0=0,bit1=0(线上电平STB=AF=1)                       
 //    printf("\n等待NACK!");
      
//     test4:x1=_inp(pport+1);
//	   x1=x1&0x40;
//	   if(x1==0x40) goto test4;   //线上电平ACK=0时,跳出检测,向下执行
	   
//     printf("\nNACK=0!");
     	   
 //    _outp(pport+2,0x0c);      //bit0=0,bit1=0(线上电平STB=AF=1)
                                  //set the port to write only mode,bit5=0
 //    _outp(pport,0xff);                             
     _outp(pport+2,0x0c);
     
     printf("\n\n校验数据...");
     for(i=0;i<N;i++)
     {  if(wdata[i]!=rbdata[i])
             IsValid=0;
     	
     }

     test5: x1=_inp(pport+1);
	    x1=x1&0x80;
	    if(x1==0x80) goto test5;

     if(IsValid)
     {
      printf("\n校验完毕,数据加载数据正确!");
      _outp(pport,0x55);
      _outp(pport+2,0x0d);//为0x0d时,bit0=1,bit1=0(线上电平STB=0,AF=1)
      _outp(pport+2,0x0c);//为0x0c时,bit0=0,bit1=0(线上电平STB=1,AF=1)
      printf("\n系统正常工作!");
     }
     else
	 {
      printf("\n数据加载错误,请重新加载");
       _outp(pport,0xaa);
      _outp(pport+2,0x0d);//为0x0d时,bit0=1,bit1=0(线上电平STB=0,AF=1)
      _outp(pport+2,0x0c);//为0x0c时,bit0=0,bit1=0(线上电平STB=1,AF=1)
     }
	 printf("\nPlease press any key to continue!");
	getch();
} /* end main()*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -