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 + -
显示快捷键?