pc.c

来自「PC机与51的通信程序」· C语言 代码 · 共 114 行

C
114
字号
#define IMASKREG  0x21   //系统中断控制器
#define ICREG 0x20       //中断命令寄存器
#define EOI   0x20       //中断结束命令字

#include<stdio.h>
#include<dos.h>


unsigned int portf,port;
unsigned int m;
unsigned int n;
unsigned int portaddr;
unsigned int reg;
unsigned char b=0,iir,ier,lcr,mod,msb,lsb;
void interrupt(* vect_com)();

void init(void);
void closeinit(void);
void get(void);
void interrupt receiver(void);


void main()
{
	get();
	init();
	while(1)
	{
		printf("input the number of the data you want to reccive(q to exit):    ");
		if(scanf("%ud",&n)!=1)
		{
			closeinit();
			exit(1);
		}
		printf("send low byte......\n");
		outportb(portaddr+0,(unsigned char)(n&0x00ff));		
		while((inportb(portaddr+2)&0x07)!=2);
		printf("send hight byte......\n");
        outportb(portaddr+0,(unsigned char)(n>>8));        
		while((inportb(portaddr+2)&0x07)!=2);
		printf("begining to reccive********\n");
		while(n>0);
		printf("receive end********\n\n\n\n");
	}
}

void get(void)
{
	printf("input the port:   ");
	scanf("%ud",&port);
	portaddr=peek(0x40,port*2);
	portf=(port==0)?4:3;
}

void init(void)
{
	vect_com=getvect(portf+8);
	disable(); 
	lcr=inportb(portaddr+3);
	outportb(portaddr+3,0x80);
	lsb=inportb(portaddr+0);
	msb=inportb(portaddr+1);
	outportb(portaddr+0,0x0c);
	outportb(portaddr+1,0x00);
	outportb(portaddr+3,0x03);
    mod=inportb(portaddr+4);
    outportb(portaddr+4,mod|0x08);
    iir=inportb(portaddr+2);
	ier=inportb(portaddr+1);
	outportb(portaddr+1,0x01);
    outportb(IMASKREG,inportb(IMASKREG)&(~(0x01<<portf)));
	setvect(portf+8,receiver);
	enable();
}

void closeinit(void)
{
	disable();  
	outportb(portaddr+3,0x80);
	outportb(portaddr+0,lsb);
	outportb(portaddr+1,msb);
	outportb(portaddr+3,lcr);
	outportb(portaddr+4,mod);
	outportb(portaddr+2,iir);
	outportb(portaddr+1,ier);
	outportb(IMASKREG,inportb(IMASKREG)|0x10);
	enable();
	setvect(portf+8,vect_com);
}

void interrupt receiver(void)
{
	if(n>0)
	{
		if(b==0)
		{
			m=(m&0xff00)|(unsigned int)inportb(portaddr+0);
			b=1-b;
		}
		else
		{
			m=(m&0x00ff)|((unsigned int)inportb(portaddr+0)<<8);
			b=1-b;
			printf("%ud\n",m);
		}
		n--;
	}
	outportb(ICREG,EOI);
}




⌨️ 快捷键说明

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