📄 main.c
字号:
break;
case '\n':
return;
default:
break;
}
}while(1);
}
const char SystemMenu[][16] = {{"背景灯 开"},
{"亮 度 210"},
{"触发方式 高"},
{"信号输出 高"}};
void SetSystem(void)
{
unsigned char cursel;
unsigned char sLight;
unsigned char sld;
char sTargetType;
char sOutType;
unsigned char key;
sLight = mSystem.bLight;
sld = mSystem.ld;
if(sld < 150 )
sld = 150;
sTargetType = mSystem.TargetType;
sOutType = mSystem.OutType;
cursel = 0;
LCD_Cls();
LCD_SetAdd(0);
Str("背景灯");
if(sLight)
Str(" 开");
else
Str(" 关");
LCD_DrawNum(4,1,sld);
LCD_SetAdd(8);
Str("亮 度");
LCD_SetAdd(16);
Str("触发方式");
switch(sTargetType)
{
case 0:
Str(" 低");
break;
case 1:
Str(" 高");
break;
case 2:
Str(" 下");
break;
case 3:
Str(" 上");
break;
default:
Str(" 低");
sTargetType = 0;
}
LCD_SetAdd(24);
Str("输出方式");
switch(sOutType)
{
case 0:
Str(" 低");
break;
case 1:
Str(" 高");
break;
default:
Str(" 低");
sOutType = 0;
}
LCD_Reverse(cursel);
while(1)
{
key = GetKey();
if(key)
{
switch(key)
{
case 'U':
if( cursel > 0)
cursel--;
break;
case 'D':
if(cursel < 4)
cursel++;
break;
case '<':
switch(cursel)
{
case 0:
sLight = 0x00;
break;
case 1:
if(sld > 150)
sld--;
break;
case 2:
sTargetType--;
if(sTargetType < 0)
sTargetType = 3;
break;
case 3:
sOutType--;
if(sOutType < 0)
sOutType = 1;
default:
break;
}
break;
case '>':
switch(cursel)
{
case 0:
sLight = 0x0FF;
break;
case 1:
if(sld <254)
sld++;
break;
case 2:
sTargetType++;
if(sTargetType > 3)
sTargetType = 0;
break;
case 3:
sOutType++;
if(sOutType > 1)
sOutType = 0;
default:
break;
}
break;
case '\n':
mSystem.ld = sld;
mSystem.bLight = sLight;
mSystem.TargetType = sTargetType;
mSystem.OutType = sOutType;
if(mSystem.OutType)
TRG_OUT = 0; //输出触发
else
TRG_OUT = 1;
EraseSystem();
if(WriteSystem())
{
Error();
};
return;
case 'E':
return;
case '7':
HideMenu();
break;
default:
break;
}
SetLight(sld);
LCD_Cls();
LCD_SetAdd(0);
Str("背景灯");
if(sLight)
{
BKLIGHT = 1;
Str(" 开");
}
else
{
BKLIGHT = 0;
Str(" 关");
}
LCD_DrawNum(4,1,sld);
LCD_SetAdd(8);
Str("亮 度");
LCD_SetAdd(16);
Str("触发方式");
switch(sTargetType)
{
case 0:
Str(" 低");
break;
case 1:
Str(" 高");
break;
case 2:
Str(" 下");
break;
case 3:
Str(" 上");
break;
default:
Str(" 低");
sTargetType = 0;
}
LCD_SetAdd(24);
Str("输出方式");
switch(sOutType)
{
case 0:
Str(" 低");
break;
case 1:
Str(" 高");
break;
default:
Str(" 低");
sOutType = 0;
}
if(cursel < 4)
LCD_Reverse(cursel);
}
}
};
const char SetRecord[][16] = {{"0 记录零"},
{"1 记录一"},
{"2 记录二"},
{"3 记录三"},
{"4 记录四"},
{"5 记录五"},
{"6 记录六"},
{"7 记录七"},
{"8 记录八"}};
void SaveSet(void)
{
unsigned char sMenu,oldsMenu;
unsigned char i,cursel,oldcur;
oldcur = cursel = 0;
oldsMenu = sMenu = 0;
LCD_Cls();
LCD_SetAdd(0);
Str(" 保存记录 ");
for(i = 0; i < 3; i++)
{
LCD_SetAdd(i * 8 + 8);
Str(SetRecord[sMenu + i]);
}
LCD_Reverse(cursel - sMenu + 1);
while(1)
{
key = GetKey();
switch(key)
{
case KEY_UP:
if(cursel > 0)
{
cursel--;
if(cursel < sMenu)
sMenu--;
}
break;
case KEY_DOWN:
if(cursel < 8)
{
cursel++;
if(cursel > sMenu + 2)
sMenu++;
}
break;
case KEY_ENTER:
EraseRecord(cursel);
WriteRecord(cursel);
return;
case KEY_ESC:
return;
default:
if(key >= '0' && key < '9')
{
EraseRecord(key - '0');
WriteRecord(key - '0');
return;
}
break;
}
if(oldsMenu != sMenu)
{
for(i = 0; i < 3; i++)
{
LCD_SetAdd(i * 8 + 8);
Str(SetRecord[sMenu + i]);
}
oldsMenu = sMenu;
}
if(cursel != oldcur)
{
LCD_Reverse(cursel - sMenu + 1);
oldcur = cursel;
}
}
};
void ReadSet(void)
{
unsigned char sMenu,oldsMenu;
unsigned char i,cursel,oldcur;
oldcur = cursel = 0;
oldsMenu = sMenu = 0;
LCD_Cls();
LCD_SetAdd(0);
Str(" 读取记录 ");
for(i = 0; i < 3; i++)
{
LCD_SetAdd(i * 8 + 8);
Str(SetRecord[sMenu + i]);
}
LCD_Reverse(cursel - sMenu + 1);
while(1)
{
key = GetKey();
switch(key)
{
case KEY_UP:
if(cursel > 0)
{
cursel--;
if(cursel < sMenu)
sMenu--;
}
break;
case KEY_DOWN:
if(cursel < 8)
{
cursel++;
if(cursel > sMenu + 2)
sMenu++;
}
break;
case KEY_ENTER:
ReadRecord(cursel);
return;
case KEY_ESC:
return;
default:
if(key >= '0' && key < '9')
{
ReadRecord(key - '0');
return;
}
break;
}
if(oldsMenu != sMenu)
{
for(i = 0; i < 3; i++)
{
LCD_SetAdd(i * 8 + 8);
Str(SetRecord[sMenu + i]);
}
oldsMenu = sMenu;
}
if(cursel != oldcur)
{
LCD_Reverse(cursel - sMenu + 1);
oldcur = cursel;
}
}
};
void About(void)
{
LCD_SetAdd(0);
Str("脉冲发生器V1.0 ");
LCD_SetAdd(8);
Str("上海东方久乐公司");
LCD_SetAdd(16);
Str("制作 文洪奎 ");
LCD_SetAdd(24);
Str("Tel:021-58973027");
while(!GetKey());
};
struct MenuStruct
{
const char MenuStr[16];
void (* const Fun)();
};
const struct MenuStruct MainMenu[10] = {{"1 读取设置 ",ReadSet},
{"2 点 火 ",Start},
{"3 设置通道一",SetCh1},
{"4 设置通道二",SetCh2},
{"5 系统设置 ",SetSystem},
{"6 保存设置 ",SaveSet},
{"7 关 于 ",About}};
void RootMenu(void)
{
unsigned char sMenu,oldsMenu;
unsigned char i,cursel,oldcur;
oldcur = cursel = 0;
oldsMenu = sMenu = 0;
ReDraw:
LCD_Cls();
for(i = 0; i < 4; i++)
{
LCD_SetAdd(i * 8);
Str(MainMenu[sMenu + i].MenuStr);
}
LCD_Reverse(cursel - sMenu);
while(1)
{
key = GetKey();
switch(key)
{
case KEY_UP:
if(cursel > 0)
{
cursel--;
if(cursel < sMenu)
sMenu--;
}
break;
case KEY_DOWN:
if(cursel < 6)
{
cursel++;
if(cursel > sMenu + 3)
sMenu++;
}
break;
case KEY_ENTER:
MainMenu[cursel].Fun();
goto ReDraw;
break;
default:
if(key > '0' && key < '8')
{
MainMenu[key - '0' - 1].Fun();
goto ReDraw;
}
}
if(oldsMenu != sMenu)
{
for(i = 0; i < 4; i++)
{
LCD_SetAdd(i * 8);
Str(MainMenu[sMenu + i].MenuStr);
}
oldsMenu = sMenu;
}
if(cursel != oldcur)
{
LCD_Reverse(cursel - sMenu);
oldcur = cursel;
}
}
}
void InitPort(void)
{
T1 = 0;
T2 = 0;
DDRA_DDRA5 = 1;
DDRA_DDRA6 = 1;
TI1 = 0; //点火上端
TI2 = 0; //点火上端
DDRA_DDRA3 = 1; //点火上端
DDRA_DDRA4 = 1; //点火上端
DDRC_DDRC3 = 0; //电阻测量
DDRC_DDRC4 = 0; //电阻测量
PTC_PTC5 = 0; //点火下端
PTC_PTC6 = 0; //点火下端
DDRC_DDRC5 = 1; //点火下端
DDRC_DDRC6 = 1; //点火下端
}
void SetCurrent(unsigned int Ch1,unsigned int Ch2)
{
unsigned int temp;
Ch1 = Ch1 / 64;
temp = (Ch1 + mSystem.I1_O) * mSystem.I1_S; // I1_S = 84
PWMDR1 = temp >> 8;
Ch2 = Ch2 / 64;
temp = (Ch2 + mSystem.I2_O) * mSystem.I2_S;
PWMDR2 = temp >> 8;
}
/*
void SetCurrent(unsigned int Ch1,unsigned int Ch2)
{
unsigned int i;
unsigned int vCh1,vCh2;
FIRE_CURRENT1_DDR = 1;
while(GetAD(0) < Ch1)
{
FIRE_CURRENT1 = 1;
}
FIRE_CURRENT1_DDR = 0;
FIRE_CURRENT2_DDR = 1;
while(GetAD(1) < Ch2)
{
FIRE_CURRENT2 = 1;
}
FIRE_CURRENT2_DDR = 0;
while(1)
{
vCh1 = GetAD(0);
vCh2 = GetAD(1);
if(GetAD(0) == Ch1 &)
{
FIRE_CURRENT1_DDR = 0;
}
if(GetAD(0) < Ch1)
{
FIRE_CURRENT1_DDR = 1;
FIRE_CURRENT1 = 1;
}
if(GetAD(0) > Ch1)
{
FIRE_CURRENT1 = 0;
FIRE_CURRENT1_DDR = 1;
}
if(GetAD(1) == Ch2)
{
FIRE_CURRENT2_DDR = 0;
}
if(GetAD(1) < Ch2)
{
FIRE_CURRENT2 = 1;
FIRE_CURRENT2_DDR = 1;
}
if(GetAD(1) > Ch2)
{
FIRE_CURRENT1 = 0;
FIRE_CURRENT1_DDR = 1;
}
}
}
*/
void StartFire(void)
{
T1MOD = 0x00001;
T1SC = 0x030; // 125K = 8MHz / (64 * 255 * 255)
T1MOD = SYSCLK / 10000;
T1SC = 0x070; //允许中断,停止工作,复位TCNT
TI1 = 1;
TI2 = 1;
sT0 = mRecord.sTime0;
sT1 = mRecord.sTime1;
lT0 = mRecord.lTime0 + 2;
lT1 = mRecord.lTime1 + 2;
T1SC_TSTOP = 0; //开始中断
while(lT0 | lT1) //等待点火完成
{
if(GetKey() == KEY_ESC)
{
T1SC_TSTOP = 1;
lT0 = 0;
lT1 = 0;
sT0 = 0;
sT1 = 0;
break;
};
}
T1SC_TSTOP = 1;
nFired = 0x00;
TI1 = 0;
TI2 = 0;
SetCurrent(0,0);
if(mSystem.OutType)
TRG_OUT = 0; //输出触发
else
TRG_OUT = 1;
}
__interrupt void Timer1_Interrupt(void) //10KHz
{
T1SC_TOF = T1SC_TRST; //新中断
if(nFired != 0x0C5)
{ nError = 0x01;
return;
}
if(mSystem.OutType)
TRG_OUT = 1; //输出触发
else
TRG_OUT = 0;
if(sT0 > 0)
{
sT0--;
FIRE1 = 0;
}
else if(lT0 > 0)
{
lT0--;
//点火
FIRE1 = 1;
}
if(lT0 == 0)
{
//结束点火
FIRE1 = 0;
}
if(sT1 > 0)
{
sT1--;
FIRE2 = 0;
}
else if(lT1 > 0)
{
lT1--;
//点火
FIRE2 = 1;
}
if(lT1 == 0)
{
//结束点火
FIRE2 = 0;
}
};
__interrupt void IRQ1_Interrupt(void) //外部触发
{
if(nTrg_In != 0x0C5)
{
nError = 0x02;
return;
}
StartFire();
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -