📄 main.#3
字号:
if (gbFilling) // 如果正在执行充气操作,则对充气时间进行递减
{
if (--gnCurrTime == 0) // 如果充气时间减为全0,则进入测试状态
{
gbFilling = FALSE;
gbTesting = TRUE;
gnCurrTime = gnTestTime; // 准备测试时间
}
}
else if (gbTesting) // 如果正在执行测试操作,则对测试时间进行递减
{
if (--gnCurrTime == 0) // 如果测试时间减为全0,则测试结束,关闭电磁阀并保持当前显示状态不变
{
gbTesting = FALSE;
gbTestOver= TRUE; // 指示检测已完成
DRV_VALVE = CLOSE; // 关闭电磁阀
if ((gnLeakGet > gnLeakMax) || (gnLeakGet < gnLeakMin))
{ // 测试结束后,如果气体流量超过了设定的流量范围,则FAIL灯亮,否则PASS灯亮
DRV_FAIL = OPEN;
LED_FAIL = OPEN;
DRV_PASS = CLOSE;
LED_PASS = CLOSE;
}
else
{
DRV_PASS = OPEN;
LED_PASS = OPEN;
DRV_FAIL = CLOSE;
LED_FAIL = CLOSE;
}
}
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneDisplay
** 功能描述: 在1#-LED和2#-LED上显示缓冲区中的数值,并根据需要加入小数点显示。
** 输 入: nLedID>>>>>LED位选码数组LedCode的索引(0~5,前5位对应于1#-LED和2#-LED,最后一位对应于3#、4#
** 和5#-LED)。
** 输 出: 无
** 全局变量: gbParamSel>>>>>>>>>指示当前是否工作在参数选择状态,0~不是,1~是;
** gbParamSet>>>>>>>>>指示当前是否工作在参数修改状态,0~不是,1~是;
** gbCanFlash>>>>>>>>>指示当前是否要执行闪烁操作(实际是消隐),0~不执行,1~执行;
** gnParamID>>>>>>>>>>代表参数组中当前选择的参数序号(从0开始编号,取值0~PARAMS_NUMS-1);
** gnSegBuf[][]>>>>>>>代表两组段选缓冲区在SEG_CODE段选码数组中的数字索引。
** 全局常量:SEG_CODE[]>>>>>>>>>不带小数点的字符的LED段选码(共阳LED,段输出低电平有效);
** LED_CODE[]>>>>>>>>>1#和2#LED的位选选通码(共阳LED,但因后级有反相,故输出低电平有效);
** ADD_DOT>>>>>>>>>>>>将该常量与要显示的LED内容相与,可在当前LED上显示小数点。
** 调用模块: Delay()>>>>>>>>>>>>延时一定的时间。
** 其它说明:LED的位选直接由P0口的Q1~Q6输出。
** 8位段选码数据的传送按先高位后低位的顺序进行(用左移实现),两个74HC595的数据同步传送。
** 另外,根据系统的工作状态来确定是否显示小数点及小数点的显示位置,具体判断如下:
** 1、工作状态==参数选择(gbParamSel=TRUE)
** 1)对于1#LED,显示参数名称,不显示小数点;
** 2)对于2#LED,显示参数值,要根据参数的类型来确定小数点的位置,即:
** a)对于参数:充气时间、测试时间、压力设定上限和压力设定下限(gnParamID=0~3),只保留一位小
** 数,因此只在nLedID=1时显示小数点;
** b)对于参数:流量设定上限和流量设定下限(gnParamID>3),只保留两位小数,因此只在nLedID=2
** 时显示小数点。
**
** 2、工作状态==待机或测试(gbParamSel=FALSE)
** 1)对于1#LED,显示压力测量值,显示一位小数,因此只在nLedID=1时显示小数点;
** 2)对于2#LED,显示流量测量值,显示两位小数,因此只在nLedID=2时显示小数点。
**
** 作 者: 罗建
** 日 期: 2007年02月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月10日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日 期: 2007年03月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneDisplay(void)
{
INT8U i,nData1,nData2, nData3;
// 先发送扫描码(即位选码),再发送第2组LED(LED3和LED4)段选码,最后发送第1组LED(LED1和LED2)段选码
// 先准备扫描码和LED段选码
nData3 = SCAN_CODE[gnScanID]; // 暂存流量显示值的LED段选码
if (gbCanFlash && gbParamSet && (gnCursorID == gnScanID))
nData2 = NOT_DIS; // LED闪烁
else
nData2 = SEG_CODE[gnDisBuf[1][gnScanID]]; // LED正常显示
nData1 = SEG_CODE[gnDisBuf[0][gnScanID]]; // 暂存压力显示值的LED段选码
if (!gbLogo)
{
if (gbParamSel) // 当前处于参数选择(或参数修改)状态(2007.03.23)
{
if (((gnScanID == 1) && (gnParamID < pnMaxLeak)) || ((gnScanID == 2) && (gnParamID > pnMinPress)))
nData2 &= ADD_DOT;
}
else // 当前处于待机或测试状态
{
if (gnScanID == gnPressDot)
nData1 &= ADD_DOT; // 压力测量值为一位小数
if ((gnScanID == gnLeakDot) && !gbLeakOver)// 流量测量值为二位小数(2007.03.23)
nData2 &= ADD_DOT;
}
}
// 将准备好的扫描码和LED段选码送入74HC595中
DIS_RCK = LEVEL_LOW; // 准备数据锁存时序
for (i=0;i<8;i++) // 将8位数据按先高后低顺序移至74HC595
{
DIS_SCK = LEVEL_LOW; // 准备时钟移位时序
DIS_SER = (nData3 & 0x80)? 1:0; // 将扫描码(LED位选码)的最高位输出到SER引脚上
nData3 <<= 1; // 准备下一位要输出的数据位
DIS_SCK = LEVEL_HIGH; // 形成一个上升沿,将准备好的1位数据移入74HC595中
}
for (i=0;i<8;i++) // 将8位数据nData按先高后低顺序移至74HC595
{
DIS_SCK = LEVEL_LOW; // 准备时钟移位时序
DIS_SER = (nData2 & 0x80)? 1:0; // 将第2组段选码(流量显示值)的最高位输出到SER引脚上
nData2 <<= 1; // 准备下一位要输出的数据位
DIS_SCK = LEVEL_HIGH; // 形成一个上升沿,将准备好的1位数据移入74HC595中
}
for (i=0;i<8;i++) // 将8位数据nData按先高后低顺序移至74HC595
{
DIS_SCK = LEVEL_LOW; // 准备时钟移位时序
DIS_SER = (nData1 & 0x80)? 1:0; // 将第1组段选码(压力显示值)的最高位输出到SER引脚上
nData1 <<= 1; // 准备下一位要输出的数据位
DIS_SCK = LEVEL_HIGH; // 形成一个上升沿,将准备好的1位数据移入74HC595中
}
DIS_RCK = LEVEL_HIGH; // 将准备好的3组数据全部锁存到74HC595中
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneKey
** 功能描述: 检测哪个键有按下,如有键按下则进行相应的处理。
** 输 入: 无
** 输 出: 无
** 全局变量: 略
** 全局常量:无
** 调用模块: 无
** 设 计 者:罗建 日 期:2007年12月09日
** 版 本:V1.00,原始版本
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneKey(void)
{
// 根据上一次按键检测结果进行键处理
switch (gnKeyID) // 以下是键处理散转代码(包含了优先级顺序)
{
case ktStartKey: DoneStartKey(); break; // 处理启动键
case ktStopKey: DoneStopKey(); break; // 处理停止键
case ktFuncKey: DoneFuncKey(); break; // 处理功能键
case ktSetKey: DoneSetKey(); break; // 处理设置键
case ktUpKey: DoneUpKey(); break; // 处理上翻键
case ktDownKey: DoneDownKey(); break; // 处理下翻键
case ktLeftKey: DoneLeftKey(); break; // 处理左移键
case ktRightKey: DoneRightKey(); break; // 处理右移键
}
gnKeyID = 0; // (2007.03.25)
// 检查是否有键按下
if (!gbCanGetKey) // 检测用户按键情况
{
if (gnCntGetKey-- == 0) // 实现按键检测延时
gbCanGetKey = TRUE;
}
else // 可以检测按键
{
if (!KEY_START) // 远程启动键按下
gnKeyID = ktStartKey;
else if (!KEY_STOP) // 远程停止键按下
gnKeyID = ktStopKey;
else
{
if (!KEY1)
gnKeyID = (gnScanID<<1) + 1;
else if (!KEY2)
gnKeyID = (gnScanID+1)<<1;
}
if (gnKeyID != 0) // 如果检测到有键按下,则准备进行按键检测延时
{
gnGetKeyCnt = KEY_WAIT; // 准备进行按键检测延时
gbCanGetKey = FALSE; // 暂停下一次键检测
}
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneFuncKey
** 功能描述: 处理功能键,进入或退出参数选择工作状态。
** 输 入: 无
** 输 出: 无
** 全局变量: gbStarted>>>>>>>>>>指示当前启动键是否按下,0~否,1~是;
** gbLogo>>>>>>>>>>>>>仪表在上电时,该标志为TRUE,指示当前正在显示LOGO标志;
** gbParamSel>>>>>>>>>指示当前是否工作在参数选择状态,0~不是,1~是;
** gbParamSet>>>>>>>>>指示当前是否工作在参数修改状态,0~不是,1~是;
** gnParamID>>>>>>>>>>代表当前用户选择的参数在参数组中的序号,取值0~PARAMS_NUMS-1。
** 全局常量:无
** 调用模块: LoadParam()>>>>>>>>载入并显示指定参数的符号名称及参数值。
** 其它说明:本函数仅在启动按未按下情况下执行。如果功能键先前未按下,则进入参数选择工作状态,并调出第一个
** 参数名称及其值,同时关闭串口中断和INT1外部中断;如果功能键先前已经按下,则退出参数选择状态,
** 并且不保存用户可能已经修改的参数值,同时打开串口中断和INT1外部中断。
**
** 作 者: 罗建
** 日 期: 2007年02月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void DoneFuncKey(void)
{
if (gbStarted || gbLogo) // 在启动键按下后或在显示LOGO标志时不能执行功能键处理程序
return;
gnParamID = pnFillTime; // 设置第一个参数的序号
gbParamSel = !gbParamSel; // 进入或退出参数选择状态
gbParamSet = FALSE; // 清除参数修改标志(尚未进入参数修改状态)
// if (gbParamSel) // 已进入参数选择状态,载入第一个参数的符号名称及参数值
// LoadParam();
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DoneSetKey
** 功能描述: 处理设置键。当在许可范围内按下设置键后,即可对当前参数进行修改(上下键)或移位(左右键)。
** 输 入: 无
** 输 出: 无
** 全局变量: gbParamSel>>>>>>>>>指示当前是否工作在参数选择状态,0~不是,1~是;
** gbParamSet>>>>>>>>>指示当前是否工作在参数修改状态,0~不是,1~是;
** gnParamID>>>>>>>>>>代表当前用户选择的参数在参数组中的序号,取值0~PARAMS_NUMS-1;
** gnCursorID>>>>>>>>>代表当前选择的修改位(闪烁位)的序号,取值0~4;
** gnSegBuf[1][]>>>>>>代表两组段选缓冲
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -