comm.c

来自「基于51的单片机的PPP协议实现」· C语言 代码 · 共 94 行

C
94
字号
#include <dos.h>
#include "Comm.h"

static void (* EvtProcedure) (BYTE value);

static void interrupt UartISR (void);
static void interrupt (*IsrOriginal)();
static void CommDrvDefaultProc (BYTE value);

static Word Port = COM1;
static	Byte IRQMask;

//////////////////////////////////////////////////
// Assigns an Event Handler for Comm Driver
//////////////////////////////////////////////////
void InitCommDriver (void) {
	EvtProcedure = CommDrvDefaultProc;
}

//////////////////////////////////////////////////
// Assigns an Event Handler for Comm Driver
//////////////////////////////////////////////////
void AssignCommEventProc (EventProc Proc) {
	disable ();
	EvtProcedure = Proc;
	enable ();
}


//////////////////////////////////////////////////
// Default Event Handler for Comm Driver
//////////////////////////////////////////////////
static void CommDrvDefaultProc (BYTE value) {
	(void) value;
}

//////////////////////////////////////////////////
void OpenComm (Word CommPort) {

	disable ();

	Port = CommPort;

	// Configura el puerto "CommPort" a 9600,n,8,1
	outportb (Port + LCR, LATCH_DIVISOR);
	outportb (Port + DIVISOR_BAJO, 0x30);
	outportb (Port + DIVISOR_ALTO, 0x0);
	outportb (Port + LCR, 0x03);

	outportb (Port + MCR, HABILITA_INT);
	outportb (Port + IER, RX_ENABLE);

	if (Port == COM1) {
		IsrOriginal = getvect (COM1_ISR);
		setvect (COM1_ISR, UartISR); 	}
	else	{
		IsrOriginal = getvect (COM2_ISR);
		setvect (COM2_ISR, UartISR); 	}


	IRQMask = inportb (PIC_IMR);

	outportb (PIC_IMR, (Port == COM1) ? (IRQMask & 0xEF):(IRQMask & 0xF7));

	enable ();
}

void CloseComm (void) {

	if (!Port) return;

	outportb (Port + MCR, 0);
	outportb (Port + IER, 0);
	outportb (PIC_IMR, IRQMask);

        if (Port == COM1) {
		setvect (COM1_ISR, IsrOriginal); }
	else {
		setvect (COM2_ISR, IsrOriginal); }
}

void WriteComm (Byte c) {
	while (!(inportb(Port + LSR) & 0x20));
	outportb (Port + THR, c);
}


void interrupt UartISR (void) {

	EvtProcedure (inportb (Port + RBR));

	outport (PIC_ICR, 0x20);	//Ack this IRQ
}

⌨️ 快捷键说明

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