📄 main.c
字号:
PCACPAL[i+BDBegin] = random;
PCACPAH[i+BDBegin] = random>>8;
PointSum += random;
random = (float)random/k+0.5;
}
//判断调整
while(RangePoint != PointSum)
{
if(PointSum>RangePoint)
{
dis = (PointSum-RangePoint);
if(dis >= Tn)//多出的比最小周期要大,先去掉一个最小周期
{
PointSum -= Tn;
n--;
PCACPAL[BDBegin+n] = 0;
PCACPAH[BDBegin+n] = 0;
}
else
{
dis /= n;
if(dis>0) //误差可以平均到每一个转速脉冲半周期
{
PointSum = 0;
for(i=0;i<n;i++)
{
TempPoint = PCACPAH[i+BDBegin]<<8;
TempPoint += PCACPAL[i+BDBegin];
TempPoint -= dis;
PointSum += TempPoint;
PCACPAL[i+BDBegin] = TempPoint;
PCACPAH[i+BDBegin] = TempPoint>>8;
}
}
else
{
dis = PointSum-RangePoint;
for(i=0;i<dis;i++)
{
TempPoint = PCACPAH[i+BDBegin]<<8;
TempPoint += PCACPAL[i+BDBegin];
TempPoint--;
PointSum--;
PCACPAL[i+BDBegin] = TempPoint;
PCACPAH[i+BDBegin] = TempPoint>>8;
}
}
}
}
else
{
dis = (RangePoint-PointSum);
if(dis >= Tn)//少的比最小周期要大,先加上一个最小周期
{
PointSum += Tn;
PCACPAL[BDBegin+n] = Tn;
PCACPAH[BDBegin+n] = Tn>>8;
n++;
}
else
{
dis /= n;
if(dis>0)
{
PointSum = 0;
for(i=0;i<n;i++)
{
TempPoint = PCACPAH[i+BDBegin]<<8;
TempPoint += PCACPAL[i+BDBegin];
TempPoint += dis;
PointSum += TempPoint;
PCACPAL[i+BDBegin] = TempPoint;
PCACPAH[i+BDBegin] = TempPoint>>8;
}
}
else
{
dis = RangePoint-PointSum;
for(i=0;i<dis;i++)
{
TempPoint = PCACPAH[i+BDBegin]<<8;
TempPoint += PCACPAL[i+BDBegin];
TempPoint++;
PointSum++;
PCACPAL[i+BDBegin] = TempPoint;
PCACPAH[i+BDBegin] = TempPoint>>8;
}
}
}
}
}
//加上2500转的点数
StepCounter[0] = BDBegin+n;
PCACPAL[StepCounter[0]] = TUp; //8294
PCACPAH[StepCounter[0]] = TUp>>8;//3000转
StepCounter[0]++;
BDEnd = StepCounter[0];
//至此加速过程结束
//3秒钟内从2500转加到3000转再回来
HalfSpeedTime = 0.5f;//3秒钟的一半
RangePoint = HalfSpeedTime*PCADRVCLOCK+0.5;
DownSpeed = 2500;
UpSpeed = 3000;
T0 = 120/CYLINDERNUMBER/DownSpeed/2*PCADRVCLOCK+0.5;
Tn = 120/CYLINDERNUMBER/UpSpeed/2*PCADRVCLOCK+0.5;
k = (float)(RangePoint-Tn)/(RangePoint-T0);
random = T0;
i = 0;
while(1)//求n算法
{
i++;
TempPoint = random;
random = (float)random/k+0.5;//random=T0/k的i次方
// random /= k;
if(random <= Tn)
{
//判断这个和上一个谁更近
if((TempPoint-Tn) < (Tn-random))
i--;
break;
}
}
n = i+1;
random = T0;
PointSum = 0;
i = 0;
for(i=0;i<n;i++)
{
PCACPAL[i+StepCounter[0]] = random;
PCACPAH[i+StepCounter[0]] = random>>8;
PointSum += random;
random = (float)random/k+0.5;
}
//------------------------------------------------------
StepCounter[0] += n;
// stepCounter[0]--;//The last one is empty!
StepCounter[1] = StepCounter[0]*2-1;
// stepCounter[2] = stepCounter[0]+stepCounter[1];
}
uchar ReadKeyBoard(void)
{
uchar ScanCode,i;
uchar ReturnCode=0;
P7 &= 0x0f;//全零扫描
DelayM(100);
if((P7&0x0f) != 0x0f)//有键按下
{
ScanCode = P7;
DelayM(100);
if((P7&0x0f) != 0x0f)//有键按下
{
if(P7 == ScanCode)//如果键值稳定开始扫描
{
ScanCode = 0xef;
for(i=0;i<4;i++)
{
P7 |= 0xf0;
P7 &= ScanCode;
DelayM(100);
if((P7&0x0f) != 0x0f)
{
ReturnCode = P7;
ReturnCode &= 0x0f;
ReturnCode |= 0xf0;
P7 = 0x0f;
return((~ScanCode)+(~ReturnCode));
}
else
{
ScanCode >>=4;
ScanCode = (ScanCode<<1)|0x01;
ScanCode &= 0x0f;
ScanCode = ScanCode<<4;
ScanCode |= 0x0f;
}
}
}
}
}
P7 = 0x0f;
return 0;
}
void AnswerKeyBoard(uchar key)
{
switch (key)
{
case KeyNum0:
OnNumber(0);
break;
case KeyNum1:
OnNumber(1);
break;
case KeyNum2:
OnNumber(2);
break;
case KeyNum3:
OnNumber(3);
break;
case KeyNum4:
OnNumber(4);
break;
case KeyNum5:
OnNumber(5);
break;
case KeyNum6:
OnNumber(6);
break;
case KeyNum7:
OnNumber(7);
break;
case KeyNum8:
OnNumber(8);
break;
case KeyNum9:
OnNumber(9);
break;
case KeyUp://Up Arrow
OnUp();
break;
case KeyDown://Down Arrow
OnDown();
break;
case KeyLeft:
OnLeft();
break;
case KeyRight:
OnRight();
break;
case KeyEsc:
OnEsc();
break;
case KeyEnter:
OnEnter();
break;
default:
break;
}
}
//以毫秒为单位延时
void DelayM(ulong n)
{
// DelayCounter=n;
// while(DelayCounter>0);
while(n)
n--;
}
void DisplayOneNumber(uchar x,uchar y,uchar number,uchar counter)
{
if(counter == InputCounterInt-1)
{
Putstr(x+counter,y,".",0,0);
Locatexy(x+counter+1,y+16,0);
}
else
{
Put_uint(x+counter,y,1,number,0,0);
Locatexy(x+counter+1,y+16,0);
}
}
void DeleteOneNumber(uchar x,uchar y,uchar counter)
{
Putstr(x+counter-1,y,"#",0,0);
Locatexy(x+counter-1,y+16,0);
}
//--------------------一行内的区域清屏--------------------
//显示欢迎界面
void DisplayStart()
{
PutLogo(1,2,0);
Putstr(16,50,"FDJJ-1型",1,0);
PutHz_32(0,104,"发动机检测仪检定装置",1);
// PutHz_12(4,188,"深圳市安车科技有限公司济南分公司",1);
Putstr(4,188,"深圳市安车科技有限公司济南分公司",1,0);
// PutHz_12(4,220,"地址:济南市高新区新宇路751号大学科技园B-103",0);
// PutHz_12(12,208,"电话:0531-88878803",1);
Putstr(12,218,"电话:0531-88558884",1,0);
// PutHz_12(4,208,"深圳市安车科技有限公司济南分公司",0);
Linexy(0,0,0,239,1);
Linexy(0,0,319,0,1);
Linexy(0,239,319,239,1);
Linexy(319,0,319,239,1);
}//
void DisplayMainMenu(uchar func,uchar oldfunc)
{
if(func == 0)
{
PutHz_24(12,MainZoneTop,"请选择功能",0);
Putstr(LeftItem,MainZoneTop+24+16,"1.转速",0,1);
Putstr(LeftItem,MainZoneTop+24+16+24,"2.加速时间",0,0);
Putstr(LeftItem,MainZoneTop+24+16+24+24,"3.闭合角",0,0);
Putstr(LeftItem,MainZoneTop+24+16+24+24+24,"4.缸压提前角",0,0);
// Putstr(6,164,"5.提前角",0,0);
Putstr(RightItem,MainZoneTop+24+16,"5.起动系",0,0);
Putstr(RightItem,MainZoneTop+24+16+24,"6.充电系",0,0);
Putstr(RightItem,MainZoneTop+24+16+24+24,"7.闪光提前角",0,0);//
// Putstr(32,10,"缸量=",0,0);//汉字“数”的区位码总是不正常,疑与KEIL有关,用“量”的代替
// Put_uint(37,10,2,CYLINDERNUMBER,0,0);
// Putstr(26,140,"9.频率",0,0);
PutLogo(1,2,0);
Putstr(32,7,"Ver2.9",0,0);
Linexy(ScreenLeft,ScreenBottom-56,ScreenRight,ScreenBottom-56,1);
Putstr(15,ScreenBottom-54,"*操作提示*",0,0);//
Putstr(8,ScreenBottom-36,"贱腚键或量字键移动光标",0,0);
Putstr(10,ScreenBottom-18,"确认键进入选定项目",0,0);
Linexy(ScreenLeft,ScreenTop,ScreenLeft,ScreenBottom,1);
Linexy(ScreenLeft,ScreenTop,ScreenRight,ScreenTop,1);
Linexy(ScreenLeft,ScreenBottom,ScreenRight,ScreenBottom,1);
Linexy(ScreenRight,ScreenTop,ScreenRight,ScreenBottom,1);
}
else
{
switch (oldfunc)
{
case 0:
case 1:
Putstr(LeftItem,MainZoneTop+24+16,"1.转速",0,0);
break;
case 2:
Putstr(LeftItem,MainZoneTop+24+16+24,"2.加速时间",0,0);
break;
case 3:
Putstr(LeftItem,MainZoneTop+24+16+24+24,"3.闭合角",0,0);
break;
case 4:
Putstr(LeftItem,MainZoneTop+24+16+24+24+24,"4.缸压提前角",0,0);
break;
case 5:
Putstr(RightItem,MainZoneTop+24+16,"5.起动系",0,0);
break;
case 6:
Putstr(RightItem,MainZoneTop+24+16+24,"6.充电系",0,0);
break;
case 7:
Putstr(RightItem,MainZoneTop+24+16+24+24,"7.闪光提前角",0,0);
break;
default:
break;
}
switch (func)
{
case 1:
Putstr(LeftItem,MainZoneTop+24+16,"1.转速",0,1);
break;
case 2:
Putstr(LeftItem,MainZoneTop+24+16+24,"2.加速时间",0,1);
break;
case 3:
Putstr(LeftItem,MainZoneTop+24+16+24+24,"3.闭合角",0,1);
break;
case 4:
Putstr(LeftItem,MainZoneTop+24+16+24+24+24,"4.缸压提前角",0,1);
break;
case 5:
Putstr(RightItem,MainZoneTop+24+16,"5.起动系",0,1);
break;
case 6:
Putstr(RightItem,MainZoneTop+24+16+24,"6.充电系",0,1);
break;
case 7:
Putstr(RightItem,MainZoneTop+24+16+24+24,"7.闪光提前角",0,1);
break;
default:
break;
}
}
}
void DisplayItem(uchar func)
{
// uint temp;
Linexy(ScreenLeft,ScreenTop,ScreenLeft,ScreenBottom,1);
Linexy(ScreenLeft,ScreenTop,ScreenRight,ScreenTop,1);
Linexy(ScreenLeft,ScreenBottom,ScreenRight,ScreenBottom,1);
Linexy(ScreenRight,ScreenTop,ScreenRight,ScreenBottom,1);
switch (func)
{
case 1:
// P3 = 0;
WRITHE = 100;
Putstr(16,4,"转速检定",0,0);
// Linexy(ScreenLeft,22,ScreenRight,22,1);
Putstr(10,36,"转速值:",0,0);
Putf(17,36,"62",fSpeed,0);
Putstr(25,36,"转/分",0,0);
Linexy(ScreenLeft,66,ScreenRight,66,1);
CYLINDERNUMBER = 4;
Putstr(2,68,"缸量",0,0);
Put_uint(6,68,2,CYLINDERNUMBER,0,0);
Putstr(11,68,"转速",0,0);
Put_uint(15,68,4,WRITHE,0,0);
Putstr(21,68,"转速选择",0,0);
Putstr(31,68,"缸量选择",0,0);
Linexy(ScreenLeft,85,ScreenRight,85,1);
Linexy(80,66,80,85,1);
Linexy(160,66,160,239,1);
Linexy(240,66,240,239,1);
Put_uint(23,87,4,100,0,1);
Put_uint(34,87,2,3,0,0);
Put_uint(23,106,4,300,0,0);
Put_uint(34,106,2,4,0,0);
Put_uint(23,125,4,400,0,0);
Put_uint(34,125,2,6,0,0);
Put_uint(23,144,4,1200,0,0);
Put_uint(34,144,2,8,0,0);
Put_uint(23,163,4,2400,0,0);
Putstr(33,163,"输入",0,0);
Put_uint(23,182,4,5000,0,0);
// Linexy(240,184,319,184,1);
Putstr(33,182,"标定",0,0);
Put_uint(23,201,4,7200,0,0);
Putstr(33,201,"退出",0,0);
Putstr(23,220,"输入",0,0);
PromptX1 = 5;
PromptY1 = 87;
PromptX2 = 1;
PromptY2 = 116;
PromptX3 = 1;
PromptY3 = 135;
PromptX4 = 1;
PromptY4 = 154;
Putstr(PromptX1,PromptY1,"*操作提示*",0,0);
//此处可以不与右边选项平齐,以便表示区别
Putstr(PromptX2,PromptY2,"空贱腚键移动光标空",0,0);
Putstr(PromptX3,PromptY3,"空确认键设定转速空",0,0);
DisplayCounter = 0;
CylinderCounter = 0;
CylinderNumberEnd = CYLINDERNUMBER;//+100;
MaxSubMenuCode = 15; //子菜单数目
LeftSubMenuCode = 8; //左边子菜单数目
ParaFlag = 12; //用电压的标志区分转速档位
fSpeedParaMul = 100/fPara[ParaFlag];
fSpeedParaAdd = 0.0f;
SetWrithe();
//用TIMER4捕捉并计算转速,因为它的中断优先级较低于pca
COUNTER = 0;
TIMER4DRVCLOCK = SYSCLOCK;///12;
Timer4Overflow = 0;
// CKCON &= 0xb8; //Timer4使用系统时钟/12
CKCON |= 0x40; //Timer4使用系统时钟
T4CON = 0x0d;//允许并工作在捕捉方式,系统时钟/12
EIE2 |= 0x04;//允许中断
EIP2 |= 0x20;//Timer4优先级置高
break;
case 2:
fSpeedTime = 0;
Putstr(14,4,"加速时间检定",0,0);
Putstr(10,36,"转速值:",0,0);
Putf(17,36,"62",fSpeed,0);
Putstr(25,36,"转/分",0,0);
Putstr(9,68,"加速时间:",0,0);
Putf(18,68,"62",fSpeedTime,0);
Putstr(27,68,"毫秒",0,0);
Putstr(1,102,"加速时间设定0200ms",0,0);
Putstr(24,102,"加速时间选择",0,0);
Linexy(ScreenLeft,100,ScreenRight,100,1);
Linexy(ScreenLeft,120,ScreenRight,120,1);
Linexy(160,100,160,239,1);
// Linexy(80,100,80,120,1);
Linexy(240,120,240,239,1);
PromptX1 = 5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -