📄 timer.cpp
字号:
// TIMER.cpp: implementation of the TIMER class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GlobalVar.h"
#include "TIMER.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
///////////////////////
//暂时假设定时器开启时不能对T0 T1计数器设置新的数值
//
//
///////////////////////
void TIMER_T0_WRITE_HOOK(BYTE VarNum,int mode,BYTE data)
{
TIMER_TCON_TR0_HOOK(VarNum,mode,var8051[VarNum]->pTIMER->TR0);
}
void TIMER_T1_WRITE_HOOK(BYTE VarNum,int mode,BYTE data)
{
TIMER_TCON_TR1_HOOK(VarNum,mode,var8051[VarNum]->pTIMER->TR1);
}
void TIMER_TH0_Mode3_CLOCK_HOOK(BYTE VarNum,unsigned short Clocknum)
{
if(var8051[VarNum]->pTIMER->TR1)//停止定时则不会发生中断,T0 mode3时TH0使用T1的TR1 TF1
{
//产生中断
//根据模式计算下一个HOOK
var8051[VarNum]->IPC->Setinterrupt(TF1);
//var8051[VarNum]->pTIMER->TH0_Mode3_Clock_CallBackNum=256+var8051[VarNum]->KMsg->Clockpos;
//var8051[VarNum]->KMsg->CallBackAfterRelativeClock(256,TIMER_T0_CLOCK_HOOK);
var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS.CLOCK_POS=256;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_TH0_Mode3_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS));
//var8051[VarNum]->IPC->Setinterrupt(TF1);
}
}
void TIMER_T0_CLOCK_HOOK(BYTE VarNum,unsigned short Clocknum)//定时器溢出HOOK
{
// unsigned short buf=var8051[VarNum]->KMsg->Clockpos;
unsigned int NextClock=0;
if(var8051[VarNum]->pTIMER->TR0)//停止定时则不会发生中断
{
//产生中断
//根据模式计算下一个发生HOOK的时间
//TX T0;
var8051[VarNum]->IPC->Setinterrupt(TF0);
var8051[VarNum]->pTIMER->T0.Tlh.TH=var8051[VarNum]->mem->GetidataMemBytef(TH0);
switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
{
case 0:
NextClock=8192;
break;
case 1:
NextClock=65535;
break;
case 2:
NextClock=256-var8051[VarNum]->pTIMER->T0.Tlh.TH;
break;
case 3:
NextClock=256;
break;
default: return;
}
var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS.CLOCK_POS=NextClock;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T0_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS));
}
return ;
}
void TIMER_T1_CLOCK_HOOK(BYTE VarNum,unsigned short Clocknum)
{
//return;//T1开关
if(var8051[VarNum]->pTIMER->TR1||var8051[VarNum]->pTIMER->T0Mode==3)
{
//产生中断
//根据模式计算下一个HOOK
if(var8051[VarNum]->mem->GetidataMemBytef(IE)&0x88==0x88)
{
if(var8051[VarNum]->pTIMER->T0Mode!=3)
{
var8051[VarNum]->IPC->Setinterrupt(TF1);
}
}
else
{
var8051[VarNum]->mem->SetBitf(TCON_TF1,1);
}
//else
//{
//}
unsigned int NextClock=0;
//TX T1;
var8051[VarNum]->pTIMER->T1.Tlh.TH=var8051[VarNum]->mem->GetidataMemBytef(TH1);
switch(var8051[VarNum]->pTIMER->T1Mode)//计算溢出中断HOOK的触发时机
{
case 0:
NextClock=8192;
break;
case 1:
NextClock=65536;
break;
case 2:
NextClock=256-var8051[VarNum]->pTIMER->T1.Tlh.TH;
break;
default: return;
}
var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS.CLOCK_POS=NextClock;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T1_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS));
}
return ;
}
void TIMER_T0T1_READ_HOOK(BYTE VarNum,int mode,BYTE data)//data=1表示TR HOOK中调用该函数
{
unsigned short buf=var8051[VarNum]->KMsg->Clockpos;
unsigned short buf1=var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS.CLOCK_POS;
unsigned short buf2=var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS.CLOCK_POS;
unsigned short buf3=var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS.CLOCK_POS;
TX T0,T1;
if(var8051[VarNum]->pTIMER->TR0||data==1)
{
if(buf1>buf)
{
buf1=buf1-buf;
}
else
{
buf1=65536-buf+buf1;
}
if(var8051[VarNum]->pTIMER->T0Mode==3)
{
if(buf3>buf)
{
buf3=buf3-buf;
}
else
{
buf3=65536-buf+buf3;
}
}
switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
{
case 0:
T0.Tx=8192-buf1;
T0.Tx=T0.Tx<<3;
T0.Tlh.TL=T0.Tlh.TL>>3;
var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
var8051[VarNum]->mem->SetidataMemBytef(TH0,T0.Tlh.TH);
break;
case 1:
T0.Tx=65536-buf1;
var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
var8051[VarNum]->mem->SetidataMemBytef(TH0,T0.Tlh.TH);
break;
case 2:
T0.Tx=256-buf1;
//var8051[VarNum]->mem->SetidataMemBytef(TL0,var8051[VarNum]->pTIMER->T0.Tlh.TL);
if(T0.Tlh.TL)
{
var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
}
else
{
var8051[VarNum]->mem->SetidataMemBytef(TL0,var8051[VarNum]->mem->GetidataMemBytef(TH0));
}
break;
case 3:
T0.Tx=256-buf1;
var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
T0.Tx=256-buf3;
var8051[VarNum]->mem->SetidataMemBytef(TH0,T0.Tlh.TH);
break;
default: return;
}
}
if(var8051[VarNum]->pTIMER->T1Mode!=3)//T1mode==3就停止计算保持原有t1数值
{
if(var8051[VarNum]->pTIMER->TR1||data==1)
{
if(buf2>buf)
{
buf2-=buf;
}
else
{
buf2+=(65536-buf);
}
switch(var8051[VarNum]->pTIMER->T1Mode)//计算溢出中断HOOK的触发时机
{
case 0:
T1.Tx=8192-buf2;
T1.Tx=T1.Tx<<3;
T1.Tlh.TL=T1.Tlh.TL>>3;
var8051[VarNum]->mem->SetidataMemBytef(TL1,T1.Tlh.TL);
var8051[VarNum]->mem->SetidataMemBytef(TH1,T1.Tlh.TH);
break;
case 1:
T1.Tx=65536-buf2;
var8051[VarNum]->mem->SetidataMemBytef(TL1,T1.Tlh.TL);
var8051[VarNum]->mem->SetidataMemBytef(TH1,T1.Tlh.TH);
break;
case 2:
T1.Tx=256-buf2;
//var8051[VarNum]->mem->SetidataMemBytef(TL1,var8051[VarNum]->pTIMER->T1.Tlh.TL);
if(T1.Tlh.TL)
{
var8051[VarNum]->mem->SetidataMemBytef(TL1,T1.Tlh.TL);
}
else
{
var8051[VarNum]->mem->SetidataMemBytef(TL1,var8051[VarNum]->mem->GetidataMemBytef(TH1));
}
break;
default: return;
}
}
}
return ;
}
void TIMER_TMOD_HOOK(BYTE VarNum,int mode,BYTE data)
{
var8051[VarNum]->pTIMER->T0Mode=data&0x3;
var8051[VarNum]->pTIMER->T1Mode=data&0x30;
var8051[VarNum]->pTIMER->T1Mode=var8051[VarNum]->pTIMER->T1Mode>>4;
TIMER_TCON_HOOK(VarNum,mode,var8051[VarNum]->mem->idata[TCON]);
//C_T0=data&0x4;//暂时还不考虑实现下面这些功能位
//C_T1=data&0x40;
//GATE0=data&0x8;
//GATA1=data&0x80;
return ;
}
void TIMER_TCON_HOOK(BYTE VarNum,int mode,BYTE data)
{
if(data&0x10)
{
TIMER_TCON_TR0_HOOK(VarNum,mode,data&0x10);
}
if(data&0x40)
{
TIMER_TCON_TR1_HOOK(VarNum,mode,data&0x40);
}
//设置TCON可能会造成中断,这是从串口可以被软件中断这个现象总结出来的
//var8051[VarNum]->IPC->CheakIRQ();
return ;
}
void TIMER_TCON_TR0_HOOK(BYTE VarNum,int mode,BYTE data)
{
unsigned int NextClock=0;//为什么不取unsigned short?因为NextClock的最大值是65536,超出了1
//取消当前的ClockHook
var8051[VarNum]->KMsg->CancelCallBackByClocknum(&(var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS));
if(data)
{
//用不加f系列的函数是为了触发定时器寄存器刷新
var8051[VarNum]->pTIMER->T0.Tlh.TL=var8051[VarNum]->mem->GetidataMemByte(TL0);
var8051[VarNum]->pTIMER->T0.Tlh.TH=var8051[VarNum]->mem->GetidataMemByte(TH0);
switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
{
case 0:
var8051[VarNum]->pTIMER->T0.Tlh.TL=var8051[VarNum]->pTIMER->T0.Tlh.TL<<3;
var8051[VarNum]->pTIMER->T0.Tx=var8051[VarNum]->pTIMER->T0.Tx>>3;
NextClock=8192-var8051[VarNum]->pTIMER->T0.Tx;
break;
case 1:
NextClock=65536-var8051[VarNum]->pTIMER->T0.Tx;
break;
case 2:
NextClock=256-var8051[VarNum]->pTIMER->T0.Tlh.TL;
break;
case 3:
NextClock=256-var8051[VarNum]->pTIMER->T0.Tlh.TL;
var8051[VarNum]->KMsg->CancelCallBackByClocknum(&(var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS));
var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS.CLOCK_POS=256-var8051[VarNum]->pTIMER->T0.Tlh.TH;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_TH0_Mode3_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS));
break;
default: return;
}
var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS.CLOCK_POS=NextClock;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T0_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS));
}
var8051[VarNum]->pTIMER->TR0=data;
/* else
{
//计算出真正的T0并设置寄存器T0
if(var8051[VarNum]->pTIMER->TR0)//TR0=0的话不用计算
{
TIMER_T0T1_READ_HOOK(VarNum,Read,1);
}
}*/
//var8051[VarNum]->pTIMER->TR0=data;
return ;
}
void TIMER_TCON_TR1_HOOK(BYTE VarNum,int mode,BYTE data)
{
unsigned int NextClock=0;//为什么不取unsigned short?因为NextClock的最大值是65536,超出了1
//取消当前的ClockHook
var8051[VarNum]->KMsg->CancelCallBackByClocknum(&(var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS));
if(data)
{
//用不加f系列的函数是为了触发定时器寄存器刷新
var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->mem->GetidataMemByte(TL1);
var8051[VarNum]->pTIMER->T1.Tlh.TH=var8051[VarNum]->mem->GetidataMemByte(TH1);
switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
{
case 0:
var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->pTIMER->T1.Tlh.TL<<3;
var8051[VarNum]->pTIMER->T1.Tx=var8051[VarNum]->pTIMER->T1.Tx>>3;
NextClock=8192-var8051[VarNum]->pTIMER->T1.Tx;
break;
case 1:
NextClock=65536-var8051[VarNum]->pTIMER->T1.Tx;
break;
case 2:
NextClock=256-var8051[VarNum]->pTIMER->T1.Tlh.TL;
break;
case 3:
break;
default: return;
}
var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS.CLOCK_POS=NextClock;
var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T1_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS));
}
var8051[VarNum]->pTIMER->TR1=data;
/* unsigned int NextClock=0;
//取消当前的ClockHook
var8051[VarNum]->KMsg->CancelCallBackByClocknum(var8051[VarNum]->pTIMER->T1_Clock_CallBackNum,var8051[VarNum]->pTIMER->T1_Clock_BackFun);
if(data)
{
var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->mem->GetidataMemByte(TL1);
var8051[VarNum]->pTIMER->T1.Tlh.TH=var8051[VarNum]->mem->GetidataMemByte(TH1);
switch(var8051[VarNum]->pTIMER->T1Mode)//计算溢出中断HOOK的触发时机
{
case 0:
var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->pTIMER->T1.Tlh.TL<<3;
var8051[VarNum]->pTIMER->T1.Tx=var8051[VarNum]->pTIMER->T1.Tx>>3;
NextClock=8192-var8051[VarNum]->pTIMER->T1.Tx;
break;
case 1:
NextClock=65536-var8051[VarNum]->pTIMER->T1.Tx;
break;
case 2:
NextClock=256-var8051[VarNum]->pTIMER->T1.Tlh.TL;
break;
case 3:
//var8051[VarNum]->pTIMER->TR1=0;//停止中断
break;
default: return;
}
var8051[VarNum]->pTIMER->T1_Clock_CallBackNum=NextClock+var8051[VarNum]->KMsg->Clockpos;
var8051[VarNum]->pTIMER->T1_Clock_BackFun=var8051[VarNum]->KMsg->CallBackAfterRelativeClock(NextClock,TIMER_T1_CLOCK_HOOK);
if(var8051[VarNum]->pTIMER->T1_Clock_BackFun==TIMER_T1_CLOCK_HOOK)
{
var8051[VarNum]->pTIMER->T1_Clock_BackFun=0;
}
}
else
{
//计算出真正的T1并设置寄存器T1
if(var8051[VarNum]->pTIMER->TR1)//TR0=0的话不用计算
{
TIMER_T0T1_READ_HOOK(VarNum,Read,1);
}
}
var8051[VarNum]->pTIMER->TR1=data;
*/
return ;
}
TIMER::TIMER()
{
}
TIMER::~TIMER()
{
}
int TIMER::init()
{
//CodeSpace 0
//BitSpace 1
//IdataSpace 2
//XdataSpace 3
T0Mode=0;
T1Mode=0;
GATE0=0;
GATE1=0;
T0.Tx=0;
T1.Tx=0;
C_T0=0;
C_T1=0;
TR0=0;
TR1=0;
T0CLOCKEVENTPOS.CLOCK_POS=0;
T0CLOCKEVENTPOS.EVENT_QUEUE_POS=0;
T1CLOCKEVENTPOS.CLOCK_POS=0;
T1CLOCKEVENTPOS.EVENT_QUEUE_POS=0;
T0MODE3CLOCKEVENTPOS.CLOCK_POS=0;
T0MODE3CLOCKEVENTPOS.EVENT_QUEUE_POS=0;
pKMsg->SetupMemHook(TL0,IdataSpace,Read,TIMER_T0T1_READ_HOOK);//读取定时器时计算
pKMsg->SetupMemHook(TH0,IdataSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TL1,IdataSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TH1,IdataSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TL0,IdataSpace,Write,TIMER_T0_WRITE_HOOK);//写定时器时计算
pKMsg->SetupMemHook(TH0,IdataSpace,Write,TIMER_T0_WRITE_HOOK);
pKMsg->SetupMemHook(TL1,IdataSpace,Write,TIMER_T1_WRITE_HOOK);
pKMsg->SetupMemHook(TH1,IdataSpace,Write,TIMER_T1_WRITE_HOOK);
/* pKMsg->SetupMemHook(TMOD_,BitSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TL0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TL0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TL0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
*/
//TMOD虽然定义了位,但似乎没有位寻址模式
pKMsg->SetupMemHook(TCON_TR0,BitSpace,Write,TIMER_TCON_TR0_HOOK);
pKMsg->SetupMemHook(TCON_TR1,BitSpace,Write,TIMER_TCON_TR1_HOOK);
pKMsg->SetupMemHook(TMOD,IdataSpace,Write,TIMER_TMOD_HOOK);
pKMsg->SetupMemHook(TCON,IdataSpace,Write,TIMER_TCON_HOOK);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -