📄 tpublic.c
字号:
//
// File name =TPUBLIC.C
// 设计 何风涛
#include "class.h"
#include "classext.h"
#include"lcd.c"
int Tputc(int ComNo,char ch) //向串行口发送字符
{
struct TComStruct FARDATA *Com;
Com=ComHandle[ComNo];
Task[ComNo].WaitControl |=01;
disable();
if(Com->Status==2) // Wait
{
(*Com->SendFunc)(ch);
enable();
return(0xff);
};
enable();
if(Com->TxdBufLength >= 255) return(0);
*(Com->TxdBuf+Com->TxdBufFront++)=ch;
disable();
Com->TxdBufLength++;
if(Com->TxdBufLength>=Com->TxdProWarn) Task[ComNo].WaitStatus &=0xFE;
enable();
return(0xff);
}
// 发送一个字符串到串行口缓冲区, ComNo为串行口号,*Sum指向需发送的字符的数目.
// *S指向需发送的字符缓冲区.
//返回值 ff,失败, *Sum返回的是本次实际发送字符的个数.
//每次最多可发送255个字符.
int Tputs(int ComNo,unsigned char *Sum,char *S)
{
unsigned char RealSum,End,i,ch,Sptr=0;
struct TComStruct FARDATA *Com;
Task[ComNo].WaitControl |=01;
Com=ComHandle[ComNo];
if(!*Sum) return(0xff);
if((*Sum + Com->TxdBufLength) >= 255)
{
RealSum=255-Com->TxdBufLength;
End=RealSum+Com->TxdBufFront;
for(i=Com->TxdBufFront;i!=End;i++) *(Com->TxdBuf+i)=S[Sptr++];
*Sum -=RealSum;
}else
{
RealSum=*Sum;
End=Com->TxdBufFront + *Sum ;
for(i=Com->TxdBufFront;i!=End;i++)*(Com->TxdBuf+i)=S[Sptr++];
*Sum=0;
};
Com->TxdBufFront=i;
disable();
Com->TxdBufLength +=RealSum;
if(Com->TxdBufLength >= Com->TxdProWarn) Task[ComNo].WaitStatus &=0xFE;
if(Com->Status==02) //Wait
{
if(Com->TxdBufLength)
{
Com->TxdBufLength--;
ch=*(Com->TxdBuf+Com->TxdBufRear++);
(*Com->SendFunc)(ch);
};
}
enable();
return(*Sum);
}
//从串行口接收缓冲区取一字符串,ComNo是串行口号,Sum是本次欲接收字符的数目,
// *s是为接收字符串而准备的缓冲区.
// 返回值,实际接收字符的数目.
int Tgets(int ComNo,int Sum,int *s)
{
int i,j,Num;
struct TComStruct FARDATA *Com;
Com=ComHandle[ComNo];
disable();
if(Com->RxdBufLength<Sum) Sum=Com->RxdBufLength;
enable();
for(i=0;i<Sum;i++) *(s+i)=*(Com->RxdBuf+Com->RxdBufRear++);
disable();
Com->RxdBufLength -=Sum;
if(Com->RxdBufLength<Com->RxdProWarn) Task[ComNo].WaitStatus &=0xfd;
enable();
return(Sum);
}
// 从串行口接收缓冲区取一字符,ComNo是串行口号,
// 返回值:低位,接收的字符,高位,00 接收正确,非0,出错.
int Tgetc(int ComNo)
{
struct TComStruct FARDATA *Com;
int RetCode;
Com=ComHandle[ComNo];
if(Com->RxdBufLength==0) return(0xff00);
disable();
Com->RxdBufLength--;
RetCode=*(Com->RxdBuf+Com->RxdBufRear++);
if(Com->RxdBufLength<Com->RxdProWarn) Task[ComNo].WaitStatus &=0xfd;
enable();
return(RetCode);
}
void outportb(register unsigned long portid, register unsigned char value)
{
asm estb value, [portid];
}
unsigned char inportb(register unsigned long portid)
{
register unsigned char value;
asm eldb value, [portid];
return(value);
}
void outport(register unsigned long portid, register unsigned int value)
{
asm est value, [portid];
}
unsigned char bittstb(unsigned char FARDATA *pch, int n)
{
register unsigned long portid;
register unsigned char value,ch;
portid=(unsigned long)pch;
ch=0;
switch(n)
{
case 0x00:asm
{
eldb value, [portid];
bbc value, 0, BTEND;
negb ch;
}
break;
case 0x01:asm
{
eldb value, [portid];
bbc value, 1, BTEND;
negb ch;
}
break;
case 0x02:asm
{
eldb value, [portid];
bbc value, 2, BTEND;
negb ch;
}
break;
case 0x03:asm
{
eldb value, [portid];
bbc value, 3, BTEND;
negb ch;
}
break;
case 0x04:asm
{
eldb value, [portid];
bbc value, 4, BTEND;
negb ch;
}
break;
case 0x05:asm
{
eldb value, [portid];
bbc value, 5, BTEND;
negb ch;
}
break;
case 0x06:asm
{
eldb value, [portid];
bbc value, 6, BTEND;
negb ch;
}
break;
case 0x07:asm
{
eldb value, [portid];
bbc value, 7, BTEND;
negb ch;
}
break;
case 0x08:asm
{
eldb value, 1[portid];
bbc value, 0, BTEND;
negb ch;
}
break;
case 0x09:asm
{
eldb value, 1[portid];
bbc value, 1, BTEND;
negb ch;
}
break;
case 0x0a:asm
{
eldb value, 1[portid];
bbc value, 2, BTEND;
negb ch;
}
break;
case 0x0b:asm
{
eldb value, 1[portid];
bbc value, 3, BTEND;
negb ch;
}
break;
case 0x0c:asm
{
eldb value, 1[portid];
bbc value, 4, BTEND;
negb ch;
}
break;
case 0x0d:asm
{
eldb value, 1[portid];
bbc value, 5, BTEND;
negb ch;
}
break;
case 0x0e:asm
{
eldb value, 1[portid];
bbc value, 6, BTEND;
negb ch;
}
break;
case 0x0f:asm
{
eldb value, 1[portid];
bbc value, 7, BTEND;
negb ch;
}
break;
default: break;
}
BTEND:return ch;
}
void setbit(volatile unsigned char near *p,register unsigned char value)
{
register unsigned long eadr;
eadr=(unsigned long)p;
switch(value)
{
case 0x00:asm
{ eldb value, [eadr];
orb value, #0x01;
estb value, [eadr];
}
break;
case 0x01:asm
{ eldb value, [eadr];
orb value, #0x02;
estb value, [eadr];
}
break;
case 0x02:asm
{ eldb value, [eadr];
orb value, #0x04;
estb value, [eadr];
}
break;
case 0x03:asm
{ eldb value, [eadr];
orb value, #0x08;
estb value, [eadr];
}
break;
case 0x04:asm
{ eldb value, [eadr];
orb value, #0x10;
estb value, [eadr];
}
break;
case 0x05:asm
{ eldb value, [eadr];
orb value, #0x20;
estb value, [eadr];
}
break;
case 0x06:asm
{ eldb value, [eadr];
orb value, #0x40;
estb value, [eadr];
}
break;
case 0x07:asm
{ eldb value, [eadr];
orb value, #0x80;
estb value, [eadr];
}
break;
case 0x08:asm
{ eldb value, 1[eadr];
orb value, #0x01;
estb value, 1[eadr];
}
break;
case 0x09:asm
{ eldb value, 1[eadr];
orb value, #0x02;
estb value, 1[eadr];
}
break;
case 0x0A:asm
{ eldb value, 1[eadr];
orb value, #0x04;
estb value, 1[eadr];
}
break;
case 0x0B:asm
{ eldb value, 1[eadr];
orb value, #0x08;
estb value, 1[eadr];
}
break;
case 0x0C:asm
{ eldb value, 1[eadr];
orb value, #0x10;
estb value, 1[eadr];
}
break;
case 0x0D:asm
{ eldb value, 1[eadr];
orb value, #0x20;
estb value, 1[eadr];
}
break;
case 0x0E:asm
{ eldb value, 1[eadr];
orb value, #0x40;
estb value, 1[eadr];
}
break;
case 0x0F:asm
{ eldb value, 1[eadr];
orb value, #0x80;
estb value, 1[eadr];
}
break;
default: break;
}
}
void clrbit(volatile unsigned char near *p,register unsigned char value)
{
register unsigned long eadr;
eadr=(unsigned long)p;
switch(value)
{
case 0x00:asm
{ eldb value, [eadr];
andb value, #0xFE;
estb value, [eadr];
}
break;
case 0x01:asm
{ eldb value, [eadr];
andb value, #0xFD;
estb value, [eadr];
}
break;
case 0x02:asm
{ eldb value, [eadr];
andb value, #0xFB;
estb value, [eadr];
}
break;
case 0x03:asm
{ eldb value, [eadr];
andb value, #0xF7;
estb value, [eadr];
}
break;
case 0x04:asm
{ eldb value, [eadr];
andb value, #0xEF;
estb value, [eadr];
}
break;
case 0x05:asm
{ eldb value, [eadr];
andb value, #0xDF;
estb value, [eadr];
}
break;
case 0x06:asm
{ eldb value, [eadr];
andb value, #0xBF;
estb value, [eadr];
}
break;
case 0x07:asm
{ eldb value, [eadr];
andb value, #0x7F;
estb value, [eadr];
}
break;
case 0x08:asm
{ eldb value, 1[eadr];
andb value, #0xFE;
estb value, 1[eadr];
}
break;
case 0x09:asm
{ eldb value, 1[eadr];
andb value, #0xFD;
estb value, 1[eadr];
}
break;
case 0x0A:asm
{ eldb value, 1[eadr];
andb value, #0xFB;
estb value, 1[eadr];
}
break;
case 0x0B:asm
{ eldb value, 1[eadr];
andb value, #0xF7;
estb value, 1[eadr];
}
break;
case 0x0C:asm
{ eldb value, 1[eadr];
andb value, #0xEF;
estb value, 1[eadr];
}
break;
case 0x0D:asm
{ eldb value, 1[eadr];
andb value, #0xDF;
estb value, 1[eadr];
}
break;
case 0x0E:asm
{ eldb value, 1[eadr];
andb value, #0xBF;
estb value, 1[eadr];
}
break;
case 0x0F:asm
{ eldb value, 1[eadr];
andb value, #0x7F;
estb value, 1[eadr];
}
break;
default: break;
}
}
void SetTimer(char TaskNo,unsigned int Time)
{ //------设置内部定时器间隔
disable();
Task[TaskNo].TimerLimit=Time;
Task[TaskNo].TimerCount=Time;
Task[TaskNo].WaitStatus &=0x7f;
if(Time!=0) //if not '0'
{
Task[TaskNo].WaitControl |=0x80; // Enable timer mode
}else Task[TaskNo].WaitControl &=0x07f; // Close timer mode
enable();
}
void Wait(char TaskNo,unsigned int WaitTime)
{
disable();
Task[TaskNo].WaitControl |=0x40;
Task[TaskNo].OverWaitCount=WaitTime;
enable();
}
void receive_enable(char TaskNo)
{
disable();
Task[TaskNo].WaitControl |=0x12;
enable();
}
void trans_enable(char TaskNo)
{
disable();
Task[TaskNo].WaitControl |=0x01;
enable();
}
void ResetWait(char TaskNo)
{
disable();
Task[TaskNo].WaitControl &=0xbf;
Task[TaskNo].WaitStatus &=0xbf;
enable();
}
void ResetTaskReset(char TaskNo)
{
disable();
Task[TaskNo].ResetNum=0; //复位次数
enable();
}
void ResetTimer(char TaskNo)
{
disable();
Task[TaskNo].WaitStatus &=0x07f;
enable();
}
unsigned char TaskStatus(int TaskNo)
{
return(Task[TaskNo].WaitStatus);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -