📄 comm.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 + -