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

📄 comm.c

📁 基于51的单片机的PPP协议实现
💻 C
字号:
#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -