flowunit.c

来自「采用STC89C54RD实现的一个完整的流量计控制系统源代码」· C语言 代码 · 共 1,142 行 · 第 1/5 页

C
1,142
字号
** Function:功能键,其作用如下:
**           (1)在待机状态,按一下该键即进入参数选择状态,此时系统加载第一个参数,并在1#-LED上显示参数
**           的名称,在2#-LED上显示参数的值。
**           (2)在参数选择状态,按一下该键即返回待机状态。
**           (3)在参数修改状态,按一下该键即返回待机状态,同时放弃用户对当前参数的修改。
**           (4)在检测状态,该键无效。
**
** SET:     设置键,其作用如下:
**           (1)在待机状态,该键无效。
**           (2)在参数选择状态,按一下该键即进入参数修改状态,此时,系统使2#-LED上的最右边LED闪烁(闪烁
**           频率:1Hz),表示用户可以修改该LED显示值。
**           (3)在参数修改状态,按一下该键即返回参数选择状态,此时,系统停止2#-LED的闪烁,同时在EEPROM中
**           存储修改后的参数值。
**           (4)在检测状态,该键无效。
**
** Up:      上移键,其作用如下:
**           (1)在待机状态,该键无效。
**           (2)在参数选择状态,按一下该键将从EEPROM中调出上一个参数值(在1#-LED中显示参数名称,2#-LED中
**           显示参数值)。
**           (3)在参数修改状态,按一下该键将使被修改位(闪烁位)加1,有连加进位功能(即当前位加1后大于
**           9则向上一位进一,同时清零当前位)。
**           (4)在检测状态,该键无效。
**
** Down:    下移键,其作用如下:
**           (1)在待机状态,该键无效。
**           (2)在参数选择状态,按一下该键将从EEPROM中调出下一个参数值(在1#-LED中显示参数名称,2#-LED中
**           显示参数值)。
**           (3)在参数修改状态,按一下该键将使被修改位(闪烁位)减1,有连减借位功能(即不够减就向上一
**           位借一,同时置当前位的值为9)。
**           (4)在检测状态,该键无效。
**
** Left:    左移键,其作用如下:
**           (1)在待机状态,该键无效。
**           (2)在参数选择状态,该键无效。
**           (3)在参数修改状态,按一下该键将使被修改位(闪烁位)向左移1位,有到头回绕功能(即移到最左位
**           后回绕到最右位)。
**           (4)在检测状态,该键无效。
**
** Right:   右移键,其作用如下:
**           (1)在待机状态,该键无效。
**           (2)在参数选择状态,该键无效。
**           (3)在参数修改状态,按一下该键将使被修改位(闪烁位)向右移1位,有到头回绕功能(即移到最右位
**           后回绕到最左位)。
**           (4)在检测状态,该键无效。
**
** START:   启动键,其作用如下:
**           (1)在待机状态,如果无压力告警,则按一下该键即进入充气状态,否则该键无效。
**           (2)在参数选择状态,该键无效。
**           (3)在参数修改状态,该键无效。
**           (4)在检测状态,该键无效。
**
** STOP:    停止键,其作用如下:
**           (1)在待机状态,该键无效。
**           (2)在参数选择状态,该键无效。
**           (3)在参数修改状态,该键无效。
**           (4)在检测状态,按一下该键即返回待机状态,同时关闭电磁阀。
********************************************************************************************************/
/************************************************
** 不带小数点的字符的LED段选码(共阳LED,段输出低
** 电平有效) 。在LED数码管上显示的数值直接参与计
** 算或保存到24C02中,或从24C02中读取到内存中,但
** 在送LED显示前,需将这些数值编码为可被LED正确识
** 别的代码,可以直接编码,也可从SEG_CODE[]数组中
** 选取对应的数字或符号编码。
************************************************/
INT8U code SEG_CODE[] = 
    {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,    /* 0..9 */
     0x88,0x83,0xC6,0xA1,0x86,0x8E,                        /* A..F */
     0xFF,0x89,0x8B,0xCF,0xC7,0xAB,0xA3,0x8C,0x98,0xAF,    /*  ..r */
     0x92,0x87,0xE3,0x91,0xBF,                             /* S..- */
     0xFE,0xFD,0xFB,0xFC,0xFA,0xF9,0xF8                    /* a亮..abc亮 */
    };

/************************************************ 
** 不进行闪烁的LED位选码(共阳LED,位输出反相,低
** 电平有效)。扫描时,从低到高顺序进行。
************************************************/
INT8U code LED_CODE[] = {0x3E,0x3D,0x3B,0x37,0x2F,0x1F};

/************************************************
** 固定显示的字符数组的LED段选码在SEG_CODE数组中
** 的索引(共阳LED,段输出低电平有效)。为与实际的
** LED排序相一致,字符索引按反序排列。
************************************************/
INT8U code FIX_CODE[][5] = 
    {{0x14,0x14,0x13,0x0F,0x10},                           /* ID:0,  FiLL,即FILL */
     {0x1B,0x1A,0x0E,0x1B,0x10},                           /* ID:1,  tESt,即TEST */
     {0x17,0x1C,0x0E,0x19,0x17},                           /* ID:2, PrEuP,即PREUP */
     {0x15,0x0D,0x0E,0x19,0x17},                           /* ID:3, PrEdn,即PREDN */
     {0x17,0x1C,0x0A,0x0E,0x14},                           /* ID:4, LEAuP,即LEAUP */
     {0x15,0x0D,0x0A,0x0E,0x14},                           /* ID:5, LEAdn,即LEADN */
     {0x01,0x0A,0x0E,0x19,0x0A},                           /* ID:6, ArEA1,即AREA1(2008.06.20) */
     {0x01,0x0F,0x0E,0x16,0x0C},                           /* ID:7, CoEF1,即COEF1(2008.06.20) */
     {0x02,0x0A,0x0E,0x19,0x0A},                           /* ID:8, ArEA2,即AREA2(2008.06.20) */
     {0x02,0x0F,0x0E,0x16,0x0C},                           /* ID:9, CoEF2,即COEF2(2008.06.20) */
     {0x03,0x0A,0x0E,0x19,0x0A},                           /* ID:10,ArEA3,即AREA3(2008.06.20) */
     {0x03,0x0F,0x0E,0x16,0x0C},                           /* ID:11,CoEF3,即COEF3(2008.06.20) */
     {0x04,0x0A,0x0E,0x19,0x0A},                           /* ID:12,ArEA4,即AREA4(2008.06.20) */
     {0x04,0x0F,0x0E,0x16,0x0C},                           /* ID:13,CoEF4,即COEF4(2008.06.20) */
     {0x19,0x0E,0x1C,0x16,0x10},                           /* ID:14, ouEr,即OVER */   
     {0x15,0x0E,0x0D,0x13,0x19},                           /* ID:15,ridEn,即RIDEN(2007.03.16) */  
     {0x00,0x05,0x0A,0x10,0x10}                            /* ID:16,  A50,即A50  (2007.03.16)*/   
    };

/************************************************
** 为了加快Decode算法的计算速度,在存储器中生成一
** 个0~10000、按10倍递增的数组序列。
************************************************/
INT32U code TAB_COEF[] = {0, 10, 100, 1000, 10000};
/*******************************************************************************************************/

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: DecBuf
** 功能描述: 对指定缓冲区内容及开始索引处的数字进行递减操作,并返回缓冲区是否为全0的状态报告。
** 输  入: nStartID>>>>>>>>>>>代表要开始递减的缓冲区数组的索引;
**           nBuf[]>>>>>>>>>>>>>代表要递减的缓冲区数组。
** 输  出: 布尔值>>>>>>>>>>>>>0表示缓冲区内容不全为0,1表示缓冲区内容全为0。
** 全局变量: 无
** 全局常量:无
** 调用模块: 无
** 其它说明:函数返回位变量值。当缓冲区数组的内容递减为全0时,返回TRUE,否则返回FALSE。消隐位也被认为是0。
**
** 作  者: 罗建
** 日  期: 2007年02月11日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日   期: 2007年03月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日  期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit DecBuf(INT8U nBuf[], INT8U nStartID)
{
  bit   bAllZero;
  INT8U i;

  bAllZero = TRUE;                               // 检查比当前修改位高(含当前位)的所有位是否均为0
  for (i=nStartID;i<5;i++)                       // 消隐位也当作0看待(即不再参与后续的减1操作)
  {
    if ((nBuf[i] != 0) && (nBuf[i] != NONE))
    {
      bAllZero = FALSE;
      break;
    }
  }
  if (bAllZero)                                  // 比当前修改位高(含当前位)的所有位均为0,不再执行减1操作
  {
    for (i=0;i<nStartID;i++)                     // 检查比当前修改位低的各位是否均为0,是则返回TRUE,表示
    {                                            // 缓冲区中的数字均为0;否则返回FALSE,说明缓冲区中还有
      if ((nBuf[i] != 0) && (nBuf[i] != NONE))   // 不为0的数字存在
        return FALSE;
    }
    return TRUE;
  }
  gbBufUsed = TRUE;
  for (i=nStartID;i<5;i++)                       // 执行连续借位操作(如果有的话)
  {
    if (--nBuf[i] > 9)
      nBuf[i] = 9;
    else
      break;
  }
  gbBufUsed = FALSE;
  return FALSE;
}

// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函数名称: LoadParam
** 功能描述: 根据当前用户选择的参数编号,在1#-LED的显示缓冲区中载入参数的符号名称,并从EEPROM中读取参数值
**           到2#-LED的显示缓冲区中。
** 输  入: 无
** 输  出: 无
** 全局变量: gnParamID>>>>>>>>>>代表当前用户选择的参数在参数组中的序号,取值0~PARAMS_NUMS-1;
**           gnSegBuf[][]>>>>>>>代表两组段选缓冲区在SEG_CODE段选码数组中的数字索引。
** 全局常量:FIX_CODE[][]>>>>>>>代表固定显示的字符数组的LED段选码在SEG_CODE数组中的索引。
** 调用模块: ReadBytes()>>>>>>>>用于从STC89C54RD+单片机EEPROM读取连续K个字节数据到指定缓冲区中。
** 其它说明:函数根据当前用户选择的参数编号,在1#-LED的显示缓冲区中载入参数的符号名称,并从EEPROM中读取参
**           数值到2#-LED的显示缓冲区中。
**
** 作  者: 罗建
** 日  期: 2007年02月12日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日  期: 2007年03月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日   期: 2007年03月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 罗建
** 日  期: 2008年06月20日,增加了流量分段修正系数的载入。
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void LoadParam(void)
{
  INT8U i;

  gbBufUsed = TRUE;
  for (i=0;i<5;i++)                              // 显示第gnParamID个参数的符号名称和值
    gnSegBuf[0][i] = FIX_CODE[gnParamID][i];
  switch (gnParamID)
  {
    case pnFillTime:                             // 显示充气时间参数值
	  ReadBytes(ADDR_FILL_TIME, 5, gnSegBuf[1]);
	  break;
	case pnTestTime:                             // 显示测试时间参数值
	  ReadBytes(ADDR_TEST_TIME, 5, gnSegBuf[1]);
	  break;
	case pnMaxPress:                             // 显示压力上限参数值
	  ReadBytes(ADDR_MAX_PRESS, 5, gnSegBuf[1]);
	  break;
	case pnMinPress:                             // 显示压力下限参数值
	  ReadBytes(ADDR_MIN_PRESS, 5, gnSegBuf[1]);
	  break;
	case pnMaxLeak:                              // 显示流量上限参数值
	  ReadBytes(ADDR_MAX_LEAK, 5, gnSegBuf[1]);
	  break;
	case pnMinLeak:                              // 显示流量下限参数值
	  ReadBytes(ADDR_MIN_LEAK, 5, gnSegBuf[1]);
      break;
    case pnLeakArea1:                            // 显示第1段流量修正的最大流量值(2008.06.20)
      ReadBytes(ADDR_LEAK_AREA1, 5, gnSegBuf[1]);
	  break;
	case pnLeakCoef1:                            // 显示第1段流量系数参数值(2008.06.20)
	  ReadBytes(ADDR_LEAK_COEF1, 5, gnSegBuf[1]);
	  break;
    case pnLeakArea2:                            // 显示第2段流量修正的最大流量值(2008.06.20)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?