⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.#3

📁 一个采用C8051F020芯片实现的流量计控制系统源代码
💻 #3
📖 第 1 页 / 共 5 页
字号:
  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 + -