📄 serial.c
字号:
/****************************************/
/* Copyright (c) 2004, 63研究所 苗龙 */
/* All rights reserved. */
/* 作 者:苗龙 */
/****************************************/
/******************************************************************************/
/* */
/* SERIAL.C: Interrupt Controlled Serial Interface for RTX-51 tiny */
/* */
/******************************************************************************/
#include <reg52.h> /* special function register 8052 */
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
#include "serial.h"
#define OLEN 8 /* size of serial transmission buffer */
unsigned char ostart=0; /* transmission buffer start index */
unsigned char oend=0; /* transmission buffer end index */
char outbuf[OLEN]; /* storage for transmission buffer */
unsigned char otask = 0xff; /* task number of output task */
#define ILEN 8 /* size of serial receiving buffer */
unsigned char istart=0; /* receiving buffer start index */
unsigned char iend=0; /* receiving buffer end index */
char inbuf[ILEN]; /* storage for receiving buffer */
unsigned char itask = 0xff; /* task number of output task */
bit sendfull=0; /* flag: marks transmit buffer full */
bit sendactive=0; /* flag: marks transmitter active */
#define MaxLenStr 100 /*buf[MaxLenStr+1] for '\0'*/
#define TABNum 4 //TAB键移动长度
/******************************************************************************/
/* putbuf: write a character to SBUF or transmission buffer */
/******************************************************************************/
void putbuf (char c) {
if (!sendfull) { /* transmit only if buffer not full */
if (!sendactive) { /* if transmitter not active: */
sendactive = 1; /* transfer the first character direct */
SBUF = c; /* to SBUF to start transmission */
}
else { /* otherwize: */
outbuf[ostart++ % OLEN] = c;
ostart=ostart% OLEN;
if (((ostart+1)%OLEN)==oend) sendfull = 1;
}
}
}
/******************************************************************************/
/* putchar: interrupt controlled putchar function */
/******************************************************************************/
char putchar (char c) {
while (sendfull) {
otask = os_running_task_id ();
os_wait (K_SIG, 0, 0);
otask = 0xff;
}
putbuf (c); /* send character */
return (c); /* return character: ANSI requirement */
}
/******************************************************************************/
/* _getkey: interrupt controlled _getkey */
/******************************************************************************/
char _getkey (void) {
char tmp;
while (iend == istart) {
itask = os_running_task_id (); /* set input task number */
os_wait (K_SIG, 0, 0); /* RTX-51 call: wait for signal */
itask = 0xff; /* clear input task number */
}
tmp=inbuf[iend++% ILEN];
iend=iend% ILEN;
return (tmp);
}
/******************************************************************************/
/* serial: serial receiver / transmitter interrupt */
/******************************************************************************/
serial () interrupt 4 using 2 { /* use registerbank 2 for interrupt */
unsigned char c;
bit start_trans = 0;
if (RI) { /* if receiver interrupt */
c = SBUF; /* read character */
RI = 0; /* clear interrupt request flag */
if(((istart+1)%ILEN)!=iend){
inbuf[istart++ % ILEN] = c;
istart=istart % ILEN;
}
if (itask != 0xFF) isr_send_signal (itask);
}
if (TI || start_trans) {
TI = 0;
if(ostart!=oend){
SBUF = outbuf[oend++ %OLEN];
oend=oend%OLEN;
sendfull = 0;
if (otask != 0xFF) isr_send_signal (otask);
}
else sendactive = 0;
}
}
/******************************************************************************/
/* serial_init: initialize serial interface */
/******************************************************************************/
void serial_init (void) {
SCON = 0x50; /* mode 1: 8-bit UART, enable receiver */
TMOD |= 0x20; /* timer 1 mode 2: 8-Bit reload */
TH1 = 0xf4; /* reload value 2400 baud */
TR1 = 1; /* timer 1 run */
ES = 1; /* enable serial port interrupt */
}
void PrintCh(unsigned char ch) //内部使用,不建议用户看到。
{
if(ch>=0&&ch<=9) ch=ch+'0';
else ch=ch+'A'-10;
putchar(ch);
}
void insidePrintByte(unsigned char Byte) //内部使用,以十六进制格式显示1个字节数据
{
unsigned char c;
c=Byte;
c=c>>4;
PrintCh(c);
c=Byte;c=c&0x0F;PrintCh(c);
}
void PrintByte(unsigned char Byte) //以十六进制格式显示1个字节数据
{
//EA=0;
insidePrintByte(Byte);
//EA=1;
}
void insidePrintWord(unsigned int Word) //内部使用,以十六进制格式显示1个字数据
{
insidePrintByte(Word>>8);
insidePrintByte(Word&0xFF);
}
void PrintWord(unsigned int Word) //以十六进制格式显示1个字数据
{
//EA=0;
insidePrintWord(Word);
//EA=1;
}
void PrintLong(unsigned long LongWord) //以十六进制格式显示1个长字数据
{
//EA=0;
insidePrintWord(LongWord>>16);
insidePrintWord(LongWord&0xFFFF);
//EA=1;
}
void PrintStr(unsigned char *str) //显示字符串
{
int i;
unsigned char j;
unsigned char ch;
//EA=0;
for(i=0;i<MaxLenStr;i++){
ch=*(str+i);
if(ch=='\0') break;
else if(ch=='\n'){putchar(10);putchar(13);}
else if(ch=='\t'){
for(j=0;j<TABNum;j++)
putchar(' ');
}
else putchar(ch);
}
//EA=1;
}
void clrscr() //清屏
{
PrintStr("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");//25个回车换行清屏幕。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -