📄 main.c
字号:
//文件名 main.C
//目 的 主程序
//Copyright (c) 2006-2007 东方久乐公司电子研究所
//编 写 文洪奎 2007-01-15
//修 改
//修改原因
#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908SR12.h> /* include peripheral declarations */
#include "global.h"
#include "lcd.h"
#include "key.h"
#include "ad.h"
#include "error.h"
#include "flash.h"
#define FIRE1 PTC_PTC5
#define FIRE2 PTC_PTC6
#define TI1 PTA_PTA4
#define TI2 PTA_PTA3
#define FIRE_CURRENT1 PTC_PTC1
#define FIRE_CURRENT2 PTC_PTC2
#define FIRE_CURRENT1_DDR DDRC_DDRC1
#define FIRE_CURRENT2_DDR DDRC_DDRC2
#define TRG_OUT PTC_PTC7
#define TRG_OUT_DDR DDRC_DDRC7
#define T1 PTA_PTA5
#define T2 PTA_PTA6
extern unsigned char nError; //故障记录
unsigned char nFired; //点火标记
unsigned char nTrg_In; //外部触发标记
void StartFire(void);
void InitPort(void);
void RootMenu(void);
void SetCurrent(unsigned int Ch1,unsigned int Ch2);
char TestRam(void);
char TestProg(void);
char TestSystem(void);
const char name[] = "脉冲发生器";
#pragma DATA_SEG MY_ZEROPAGE
unsigned int sT0,sT1,lT0,lT1; //点火程序用
int Res0,Res1; //电阻值
unsigned char key;
SYSTEMSTR mSystem;
RECORDSTR mRecord;
int startAdd;
int endAdd;
#pragma DATA_SEG DEFAULT_RAM
extern unsigned char KeyBuf[4];
extern unsigned char pKey;
void main(void)
{
// unsigned int i,j,k;
// unsigned int ad0,ad1,ad5,ad6,ad8,ad9;
// unsigned char uKey;
// static unsigned char OldKey;
CONFIG1 = 1;
EnableInterrupts; /* enable interrupts */
/* include your code here */
sT0 = 0;
sT1 = 0;
lT0 = 0;
lT1 = 0;
InitPort();
InitFlash();
SetLight(200); //亮度
BKLIGHT = mSystem.bLight;
LCD_Init();
LCD_Cls();
LCD_TurnOn();
LCD_SetAdd(0);
Initkey();
InitAD();
if(TestRam())
{
nError = 1;
Error();
}
if(TestProg())
{
nError = 2;
Error();
}
if(ReadSystem())
{
nError = 17;
Error();
}
if(TestSystem())
{
nError = 5;
Error();
}
if(mSystem.OutType) //输出触发
TRG_OUT = 0;
else
TRG_OUT = 1;
TRG_OUT_DDR = 1;
if(ReadRecord(0))
{
nError = 18;
Error();
}
DDRA_DDRA7 = 1;
PTA_PTA7 = 0;
SetLight(mSystem.ld); //亮度
BKLIGHT = mSystem.bLight;
LCD_Cls();
LCD_TurnOn();
LCD_SetAdd(0);
Str(name);
PWMCR_PWMEN1 = 1;
PWMCR_PCH1 = 1;
PWMCR_PWMEN2 = 1;
PWMCR_PCH2 = 1;
PWMDR1 = 0;
PWMDR2 = 0;
RootMenu();
for(;;) //防止程序
{
//强制复位
nError = 0x01; //程序跑飞
_asm jmp $0C080; //程序重新运行
}
}
void PreFire(void)
{
static unsigned int oCh1,oCh2,oCh3,oCh4;
unsigned int Ch1,Ch2,Ch3,Ch4;
unsigned int i;
unsigned char bReady;
bReady = 0;
T1 = 1; //开测量
T2 = 1; //开测量
LCD_Cls();
LCD_SetAdd(0);
Str("通道一电阻");
oCh1 = Ch1 = DatatoRes(1,GetAD(8));
LCD_DrawNum(5,0,Ch1);
LCD_SetAdd(8);
Str("通道二电阻");
oCh2 = Ch2 = DatatoRes(2,GetAD(9));
LCD_DrawNum(5,1,Ch2);
i = GetAD(0) * 49;
if(i > (mRecord.iCur0 - 200) && i < mRecord.iCur0 + 200)
bReady = 1;
else
bReady = 0;
i = GetAD(1) * 49;
if(i > (mRecord.iCur1 - 200) && i < mRecord.iCur1 + 200)
bReady += 1;
else
bReady = 0;
if(bReady == 2)
{
LCD_SetAdd(16);
Str("设备准备就绪");
LCD_SetAdd(24);
Str("请按7 键开始点火");
}
else
{
LCD_SetAdd(16);
Str("电压一");
oCh3 = Ch3 = GetAD(0);
LCD_DrawNum(3,2,Ch3);
LCD_SetAdd(24);
Str("电压二");
oCh4 = Ch4 = GetAD(1);
LCD_DrawNum(3,3,Ch4);
}
// LCD_SetAdd(16);
// Str("请按7键启动点火");
SetCurrent(mRecord.iCur0,mRecord.iCur1);
while(1)
{
i = 10000;
while(i)
{
i--;
}
key = GetKey();
if(key == KEY_ESC)
{
T1 = 0; //关测量
T2 = 0; //关测量
SetCurrent(0,0);
return;
}
if(key == KEY_7)
{
if(bReady == 2)
{
T1 = 0; //关测量
T2 = 0; //关测量
nFired = 0x0C5;
StartFire();
//等待点火完成
nFired = 0x000;
LCD_Cls();
LCD_SetAdd(8);
Str("点火已经完成!");
LCD_SetAdd(16);
Str("按Enter 继续");
while(GetKey() != '\n');
return;
}
}
Ch1 = DatatoRes(1,GetAD(8));
if(Ch1 != oCh1)
{
oCh1 = Ch1;
LCD_DrawNum(5,0,Ch1);
}
Ch2 = DatatoRes(2,GetAD(9));
if(Ch2 != oCh2)
{
oCh2 = Ch2;
LCD_DrawNum(5,1,Ch2);
}
i = GetAD(0) * 49;
if(i > (mRecord.iCur0 - 250) && i < mRecord.iCur0 + 250)
bReady = 1;
else
bReady = 0;
i = GetAD(1) * 49;
if(i > (mRecord.iCur1 - 250) && i < mRecord.iCur1 + 250)
bReady += 1;
else
bReady = 0;
if(bReady == 2)
{
LCD_SetAdd(16);
Str("设备准备就绪");
LCD_SetAdd(24);
Str("请按7 键开始点火");
}
else
{
Ch3 = GetAD(0);
if(Ch3 != oCh3)
{
oCh3 = Ch3;
LCD_DrawNum(3,2,Ch3);
}
Ch4 = GetAD(1);
if(Ch4 != oCh4)
{
oCh4 = Ch4;
LCD_DrawNum(3,3,Ch4);
}
}
}
}
char TestRam(void)
{
__asm
{
}
return 0;
}
unsigned char TestProg(void)
{
unsigned char crc;
unsigned char *far p;
p = (unsigned char *far) 0x0C500;
crc = 0;
do
{
crc += *p;
p++;
}while(p < (unsigned char *far)(0x0F000));
return crc;
}
char TestSystem(void)
{
T1 = 0;
T2 = 0;
if(GetAD(8) < ( 10 + mSystem.R1_O ) && GetAD(9) <( 10 + mSystem.R2_O))
return 0;
else
return 1;
}
//
void Start(void)
{
StartReDraw:
LCD_Cls();
LCD_SetAdd(0);
Str(" CH1 CH2 ");
LCD_SetAdd(8);
Str("I :"); //点火电流
LCD_DrawTimer(mRecord.iCur0);
Str(" ");
LCD_DrawTimer(mRecord.iCur1); //点火电流
LCD_SetAdd(16);
Str("ST:");
LCD_DrawTimer(mRecord.sTime0);
Str(" ");
LCD_DrawTimer(mRecord.sTime1); //开始时间
LCD_SetAdd(24);
Str("FL:");
LCD_DrawTimer(mRecord.lTime0);
Str(" ");
LCD_DrawTimer(mRecord.lTime1); //点火时间
while(1)
{
switch(GetKey())
{
case 'E':
return;
case '\n':
PreFire();
goto StartReDraw;
default:
break;
};
}
};
void SetCh1(void)
{
unsigned char cursel;
unsigned int siCur;
unsigned int ssTime;
unsigned int slTime;
unsigned char key;
siCur = mRecord.iCur0;
ssTime = mRecord.sTime0;
slTime = mRecord.lTime0;
cursel = 1;
LCD_Cls();
LCD_SetAdd(0);
Str(" 通道一设置");
LCD_SetAdd(8);
Str("点火电流");
LCD_DrawTimer(siCur);
LCD_SetAdd(16);
Str("延时时间");
LCD_DrawTimer(ssTime);
LCD_SetAdd(24);
Str("点火时间");
LCD_DrawTimer(slTime);
LCD_Reverse(cursel);
while(1)
{
key = GetKey();
if(key)
{
switch(key)
{
case 'U':
if( cursel > 1)
cursel--;
break;
case 'D':
if(cursel < 3)
cursel++;
break;
case '<':
switch(cursel)
{
case 1:
if(siCur > 100)
siCur -= 100;
break;
case 2:
if(ssTime > 0)
ssTime--;
break;
case 3:
if(slTime > 0)
slTime--;
default:
break;
}
break;
case '>':
switch(cursel)
{
case 1:
if(siCur < 30000)
siCur += 100;
break;
case 2:
if(ssTime < 30000)
ssTime++;
break;
case 3:
if(slTime < 30000)
slTime++;
default:
break;
}
break;
case '\n':
mRecord.iCur0 = siCur;
mRecord.sTime0 = ssTime;
mRecord.lTime0 = slTime;
return;
case 'E':
return;
default:
break;
}
LCD_Cls();
LCD_SetAdd(0);
Str(" 通道一设置");
LCD_SetAdd(8);
Str("点火电流");
LCD_DrawTimer(siCur);
LCD_SetAdd(16);
Str("延时时间");
LCD_DrawTimer(ssTime);
LCD_SetAdd(24);
Str("点火时间");
LCD_DrawTimer(slTime);
LCD_Reverse(cursel);
}
}
};
void SetCh2(void)
{
unsigned char cursel;
unsigned int siCur;
unsigned int ssTime;
unsigned int slTime;
unsigned char key;
siCur = mRecord.iCur1;
ssTime = mRecord.sTime1;
slTime = mRecord.lTime1;
cursel = 1;
LCD_Cls();
LCD_SetAdd(0);
Str(" 通道二设置");
LCD_SetAdd(8);
Str("点火电流");
LCD_DrawTimer(siCur);
LCD_SetAdd(16);
Str("延时时间");
LCD_DrawTimer(ssTime);
LCD_SetAdd(24);
Str("点火时间");
LCD_DrawTimer(slTime);
LCD_Reverse(cursel);
while(1)
{
key = GetKey();
if(key)
{
switch(key)
{
case 'U':
if( cursel > 1)
cursel--;
break;
case 'D':
if(cursel < 3)
cursel++;
break;
case '<':
switch(cursel)
{
case 1:
if(siCur > 100)
siCur-= 100;
break;
case 2:
if(ssTime > 0)
ssTime--;
break;
case 3:
if(slTime > 0)
slTime--;
default:
break;
}
break;
case '>':
switch(cursel)
{
case 1:
if(siCur < 30000)
siCur+= 100;
break;
case 2:
if(ssTime < 60000)
ssTime++;
break;
case 3:
if(slTime < 60000)
slTime++;
default:
break;
}
break;
case '\n':
mRecord.iCur1 = siCur;
mRecord.sTime1 = ssTime;
mRecord.lTime1 = slTime;
return;
case 'E':
return;
default:
break;
}
LCD_Cls();
LCD_SetAdd(0);
Str(" 通道二设置");
LCD_SetAdd(8);
Str("点火电流");
LCD_DrawTimer(siCur);
LCD_SetAdd(16);
Str("延时时间");
LCD_DrawTimer(ssTime);
LCD_SetAdd(24);
Str("点火时间");
LCD_DrawTimer(slTime);
LCD_Reverse(cursel);
}
}
};
const char HideM[][12] = {{"I1_O "},
{"I1_S "},
{"I2_O "},
{"I2_S "},
{"R1_O "},
{"R1_S "},
{"R2_O "},
{"R2_S "},
{"C1_O "},
{"C1_S "},
{"C2_O "},
{"C2_S "},
{"PCRC "}};
void HideMenu(void)
{
char i;
unsigned char sMenu,oldsMenu;
unsigned char cursel,oldcur;
oldcur = cursel = 0;
oldsMenu = sMenu = 0;
do
{
LCD_Cls();
for(i = 0; i < 4; i++)
{
LCD_SetAdd(i * 8);
Str(HideM[sMenu + i]);
if(i + sMenu < 12)
LCD_DrawNum(2,i,*(&(mSystem.I1_O) + i + sMenu));
else
LCD_DrawNum(2,i,TestProg());
}
LCD_Reverse(cursel - sMenu);
do
{
key = GetKey();
}while(!key);
switch(key)
{
case 'U':
if(cursel > 0)
cursel--;
if(cursel < sMenu)
sMenu = cursel;
break;
case 'D':
if(cursel < 12)
cursel++;
if(cursel - sMenu > 3)
sMenu++;
break;
case '<':
break;
case '>':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -