?? flowunit.c
字號:
ReadBytes(ADDR_LEAK_AREA2, 5, gnSegBuf[1]);
break;
case pnLeakCoef2: // 顯示第2段流量系數參數值(2008.06.20)
ReadBytes(ADDR_LEAK_COEF2, 5, gnSegBuf[1]);
break;
case pnLeakArea3: // 顯示第3段流量修正的最大流量值(2008.06.20)
ReadBytes(ADDR_LEAK_AREA3, 5, gnSegBuf[1]);
break;
case pnLeakCoef3: // 顯示第3段流量系數參數值(2008.06.20)
ReadBytes(ADDR_LEAK_COEF3, 5, gnSegBuf[1]);
break;
case pnLeakArea4: // 顯示第4段流量修正的最大流量值(2008.06.20)
ReadBytes(ADDR_LEAK_AREA4, 5, gnSegBuf[1]);
break;
case pnLeakCoef4: // 顯示第4段流量系數參數值(2008.06.20)
ReadBytes(ADDR_LEAK_COEF4, 5, gnSegBuf[1]);
break;
}
gbBufUsed = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: Decode
** 功能描述: 將給定的一個32位無符號整型數據轉換為5個數字,并存入指定的緩沖區中。
** 輸 入: nData>>>>>>>>>>>>>>要轉換的32位無符號整型數據。
** 輸 出: nBuf[]>>>>>>>>>>>>>代表轉換后的數字序列緩沖區。
** 全局變量: 無
** 全局常量:無
** 調用模塊: 無
** 其它說明:函數將一個32位無符號整型數據轉換為5個數字(0~9),并存入指定的緩沖區中。
**
** 作 者: 羅建
** 日 期: 2007年02月12日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Decode(INT32U nData, INT8U nBuf[])
{
INT8U i,j;
for (j=4;j>0;j--)
{
for (i=0;i<10;i++)
{
if (nData >= TAB_COEF[j])
nData -= TAB_COEF[j];
else
{
nBuf[j] = i;
break;
}
}
}
nBuf[0] = nData;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: Encode
** 功能描述: 將給定緩沖區中的5個數字轉換為一個32位無符號整型數據。
** 輸 入: nBuf[]>>>>>>>>>>>>>代表要轉換的數字序列緩沖區。
** 輸 出: nData>>>>>>>>>>>>>>轉換后的32位無符號整型數據,以引用方式輸出。
** 全局變量: 無
** 全局常量:無
** 調用模塊: 無
** 其它說明:函數將給定緩沖區中的5個數字轉換為一個32位無符號整型數據。
**
** 作 者: 羅建
** 日 期: 2007年02月13日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Encode(INT32U *nData, INT8U nBuf[])
{
INT8U i;
*nData = nBuf[0];
for (i=1;i<5;i++)
{
if (nBuf[i] != NONE)
*nData += nBuf[i] * TAB_COEF[i];
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: HideInvalidZero
** 功能描述: 消隱指定緩沖區中的個位以上的各位無效0。
** 輸 入: nBufID>>>>>>>>>>>>>代表存放1#或2#LED顯示內容的緩沖區數組索引。
** 輸 出: 無
** 全局變量: gnPressDot>>>>>>>>>代表壓力測量值小數點的位置,0表示無小數點,1表示1位小數點,以此類推;
** gnLeakDot>>>>>>>>>>代表流量測量值小數點的位置,0表示無小數點,1表示1位小數點,以此類推;
** gnSegBuf[][]>>>>>>>代表兩組段選緩沖區在SEG_CODE段選碼數組中的數字索引。
** 全局常量:無
** 調用模塊: 無
** 其它說明:函數搜索指定緩沖區中的無效0,并用消隱代碼替換。
**
** 作 者: 羅建
** 日 期: 2007年02月11日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年03月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void HideInvalidZero(INT8U nBufID)
{
INT8U i,j;
j = (nBufID == 0)? gnPressDot:gnLeakDot; // 壓力至少顯示兩位數值,流量至少顯示三位數值
for (i=4;i>j;i--) // 消隱測量值高位無效0
{
if (gnSegBuf[nBufID][i] == 0)
gnSegBuf[nBufID][i] = NONE;
else
break;
}
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: GetPressBuf
** 功能描述: 將給定的整型量壓力測量值分解為萬位、千位、百位、十位和個位數字后存放到壓力顯示緩沖區中。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbWarned>>>>>>>>>>>在待機狀態,指示壓力測量值是否超出設定區間范圍,0~否,1~是;
** gbStarted>>>>>>>>>>指示<啟動鍵>是否按下,0~未按下,1~按下;
** gnMaxPress>>>>>>>>>代表用戶設置的壓力上限(從EEPROM中讀取的);
** gnMinPress>>>>>>>>>代表用戶設置的壓力下限(從EEPROM中讀取的);
** gnPress>>>>>>>>>>>>代表當前測量的壓力值,其單位為10kPa;
** gnSegBuf[0][]>>>>>>壓力顯示緩沖區,保存轉換后的萬位、千位、百位、十位和個位壓力值數字。
** 全局常量:無
** 調用模塊: Decode()>>>>>>>>>>>將一個32位無符號整型數據轉換為5個數字(0~9),并存入指定的緩沖區中;
** HideInvalidZero()>>消隱指定緩沖區中的個位以上的各位無效0。
** 其它說明:本函數采用關閉INT1外中斷來解決顯示與儲存的沖突。有關更詳細的說明請參見INT1_ISR中斷服務程序。
**
** 作 者: 羅建
** 日 期: 2007年02月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年03月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetPressBuf(void)
{
INT32U nPress;
EX1 = FALSE; // 為防止讀數時發生INT1外中斷導致沖突,先禁用EX1
nPress = gnPress; // 讀取全局變量
EX1 = TRUE; // 恢復響應INT1外中斷
if (!gbStarted) // 在待機狀態下,檢查壓力值是否超出了設定的區間范圍,超出則點亮WARN燈
{
if (nPress < 150) // 在待機狀態下,壓力顯示值等于實測值減去15kPa(這里擴大了10倍)
nPress = 0;
else
nPress -= 150;
if ((nPress > gnMaxPress) || (nPress < gnMinPress))
gbWarned = TRUE;
else
gbWarned = FALSE;
}
else
{
if (nPress > gnPressZero) // 實測值大于壓力零點值,則顯示零點值,否則仍顯示實測值
nPress = gnPressZero;
}
gbBufUsed = TRUE;
Decode(nPress, gnSegBuf[0]); // 將壓力測量值分解為獨立的數字表示,以便于顯示
HideInvalidZero(0); // 消隱gnSegBuf[0]中的無效0
gbBufUsed = FALSE;
}
// ------------------------------------------------------------------------------------------------------
/********************************************************************************************************
** 函數名稱: GetLeakBuf
** 功能描述: 將給定的雙字節流量測量值分解為萬位、千位、百位、十位和個位數字后存放到流量顯示緩沖區中。
** 輸 入: 無
** 輸 出: 無
** 全局變量: gbLeakOver>>>>>>>>>指示當前測量值是否大于50.00Ln/min;
** gbStarted>>>>>>>>>>指示<啟動鍵>是否按下,0~未按下,1~按下;
** gbPassed>>>>>>>>>>>在測試期間,指示流量測量值是否超出設定區間范圍,0~否,1~是;
** gbFilling>>>>>>>>>>指示當前是否工作于充氣狀態,0~否,1~是;
** gnMaxLeak>>>>>>>>>>代表用戶設置的流量上限(從EEPROM中讀取的);
** gnMinLeak>>>>>>>>>>代表用戶設置的流量下限(從EEPROM中讀取的);
** gnLeak>>>>>>>>>>>>>代表當前測量的流量值,其單位為100Ln/min;
** gnSegBuf[1][]>>>>>>流量顯示緩沖區,保存轉換后的萬位、千位、百位、十位和個位流量值數字。
** 全局常量:FIX_CODE[6][]>>>>>>代表固定顯示的字符數組的LED段選碼在SEG_CODE數組中的索引。
** 調用模塊: Decode()>>>>>>>>>>>將一個32位無符號整型數據轉換為5個數字(0~9),并存入指定的緩沖區中;
** HideInvalidZero()>>消隱指定緩沖區中的個位以上的各位無效0。
** 其它說明:本函數采用關閉串口中斷來解決顯示與儲存的沖突。有關更詳細的說明請參見SER_ISR中斷服務程序。
**
** 作 者: 羅建
** 日 期: 2007年02月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年03月16日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年03月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年03月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 羅建
** 日 期: 2007年05月28日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GetLeakBuf(void)
{
INT8U i;
INT32U nLeak;
if (gbLeakOver && gbStarted) // 如果出現流量溢出的現象,則保持直到用戶按下STOP鍵
return;
if (gbTestOver && gbStarted) // 如果檢測完成,則保持顯示直到用戶按下STOP鍵(2007.03.16)
return;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -