?? ports.c
字號:
/**************** (c) 2005 佛山菱電 *****************************************
PROJECT : 簡易風盤控制器
COMPILER : VR ICC for m48
MODULE : ports.c
VERSION : 1.0.0
DATE : 2005/12/12
AUTHOR : 朱坤
DESCRIPTION : I/O routines
MODIFICATIONS :
定義組合鍵:Mode + Fan,
同時按下,進入參數模式 - 關機時,進入參數修改模式,開機時進入參數查詢模式
******************************************************************************/
#include <avr/io.h>
#include <avr/wdt.h>
#include "lib.h"
#include "version.h"
#include "lcd.h"
#include "ports.h"
u8 Key_State; /* status of key panel */
#define KEY_IDLE ((u8)0)
#define KEY_IDLE_NEXT ((u8)1)
#define KEY_PUSHED ((u8)2)
#define KEY_NEXT ((u8)3)
u8 DebounceButton; /* 按鍵反彈延時 100mS On 4mS */
u8 LtdSwOnCntr; /* 房卡檢測計數 */
u8 ChkLtdSwCntr; /* 房卡檢測計時 */
u8 SWBuf; /* 按鍵緩沖 */
u8 SWTime; /* 按鍵激活 LCD 顯示時間 */
u8 SWState; /* 按鍵狀態 */
u8 SWRptBuf; /* 重復按鍵 */
u8 SWKeyHoldTm; /* 保持按鍵時間 */
/*-----------------------------------------------------------------------------
ROUTINE NAME : PORTS_Init
INPUT/OUTPUT : None
DESCRIPTION : Configure the ports
COMMENTS :
-----------------------------------------------------------------------------*/
void PORTS_Init(void)
{
MCUCR &= ~(1<<PUD); /* 允許 I/O 上拉 */
PCMSK0 = (u8)0x00; /* 禁止所有 Pin Change 中斷 */
PCMSK1 = (u8)0x00;
PCMSK2 = (u8)0x00;
PCICR = (u8)0x00; /* 不允許 Int0/1 中斷 */
EIMSK = (u8)0x00;
//PCIFR = (u8)0x0ff;
//EIFR = (u8)0x0ff;
PORTB = PORTBSET;
PORTC = PORTCSET;
PORTD = PORTDSET;
#ifdef EnPGFENGJI
PRR = (u8)((1<<PRTWI)|(1<<PRSPI)|(1<<PRUSART0)|(1<<PRADC));
#else
PRR = (u8)((1<<PRTWI)|(1<<PRSPI)|(1<<PRUSART0)|(1<<PRTIM1)|(1<<PRADC));
#endif
#if 0
SWState = KEY_IDLE;
ChkLtdSwCntr = LtdSwOnCntr = 0;
#endif
}
void PORTS_Ref(void)
{
DDRB = DDRBSET; //
DDRC = DDRCSET; //
DDRD = DDRDSET; //
}
/*-----------------------------------------------------------------------------
ROUTINE NAME : Get_JP
INPUT/OUTPUT :
顯示緩沖區 DispBuf 需顯示的內容
DESCRIPTION :
1、讀入配置開關值
2、讀入房卡開關狀態
3、讀顯示板鍵值
4、顯示緩沖區的內容
COMMENTS :
本過程,每4mS被調用一次
-----------------------------------------------------------------------------*/
void Get_JP(void)
{
u8 i;
u8 j;
u8 k;
if (GetJP(JP5) == 0){ /* JP5 */
ClrBit(SysConfig,fEnMemo); /* JP5 短接,無掉電記憶 */
} else {
SetBit(SysConfig,fEnMemo); /* JP5 斷開,掉電記憶 */
}
if (!ValBit(RunMode,fSysOn)){ /* 運行時不允許修改地址 */
i = 0; /* 讀入本機地址 */
k = GetSW();
for (j = 0; j < 10; j++){
if (k == GetSW()) i++;
}
if ((i > 5) && (k != 0) && (k != 0x0f)){
if (NeijiNo != k){
NeijiNo = k; /* 地址改變,則清除地址沖突標志 */
ClrBit(Errorflg,fRsAddrErr); /* 1:內機地址沖突 */
ClrBit(Errorflg,fSComErr); /* 1:外機通信故障 */
ScAddrErrCnt = 0;
ScMonCnt = 0;
}
}
}
#ifdef JPFC
/* 房卡監測輸入, 斷開:不允許系統開機 */
if (GetJPFC(JPFC) == 0) ++LtdSwOnCntr;
if (++ChkLtdSwCntr > 100){
if ( LtdSwOnCntr > 15){
ClrBit(Errorflg,fLtdSwSt); /* 房卡狀態 1:斷開 */
ClrBit(RunMode,fLtdSwOn);
} else {
SetBit(Errorflg,fLtdSwSt); /* 房卡狀態 1:斷開 */
SetBit(RunMode,fLtdSwOn);
}
ChkLtdSwCntr = LtdSwOnCntr = 0;
}
#else /* 阻止房卡檢測 */
//ClrBit(Errorflg,fLtdSwSt);
ClrBit(RunMode,fLtdSwOn);
#endif
}
/*-----------------------------------------------------------------------------
ROUTINE Name : Key_Scan
Description :
本過程,每4mS被調用一次
-----------------------------------------------------------------------------*/
void Key_Scan(void)
{
//u8 i;
u8 tmpSWBuf;
/* 按鍵反彈延時 */
if (DebounceButton != 0) DebounceButton--;
tmpSWBuf = GetKey();
if (tmpSWBuf != SWBuf){
DebounceButton = 25; /* 100mS(On 4mS) */
SWBuf = tmpSWBuf;
#ifdef MONITOR
SWKeyHoldTm = 0; /* 清除鍵保持時間 */
#endif
} else if (DebounceButton == 0){
if (SWBuf == SWALL){ /* 所有鍵都釋放 */
#ifdef MONITOR
if (SWState == KEY_IDLE_NEXT){ /* 有鍵按下 */
if (SWRptBuf == vFanKey){ /* FAN */
SetBuzCntr(BuzCntrShort); /* 蜂鳴器短鳴一聲*/
/* A(0) -> Lo(1) -> Mi(2) -> Hi(3) */
FanStatus = (u8)((FanStatus & ~FANMASK_S)|((FanStatus + 1) & 0x03));
} else if (SWRptBuf == vModeKey){ /* MODE */
SetBuzCntr(BuzCntrShort); /* 蜂鳴器短鳴一聲*/
if ((RunMode & 0x03) > 1){
SetMode(MODEHEAT);
} else {
SetMode(MODECOOL);
}
}
}
#endif
SWState = KEY_IDLE; /* 所有鍵都釋放 */
} else {
BkgLamp = BkgLampSET; /* 背光開時間 */
SWTime = BkgLampSET; /* 顯示延時與背光開時間相同 */
SWRptBuf = SWBuf; /* 允許重復 */
if (SWState == KEY_IDLE){ /* 處理鍵 */
SWState = KEY_PUSHED; /* 下一個處理狀態 */
DebounceButton = 255; /* 1s */
if (SWBuf == vUpKey){ /* TEMP+ */
SetBuzCntr(BuzCntrShort); /* 蜂鳴器短鳴一聲*/
Upward();
} else if (SWBuf == vDownKey){ /* TEMP- */
SetBuzCntr(BuzCntrShort); /* 蜂鳴器短鳴一聲*/
Downward();
} else if (SWBuf == vOnOffKey){ /* On/Off */
if (ValBit(RunMode,fSysOnOff)){
TurnSysOff();
} else {
TurnSysOn();
}
SetBuzCntr(BuzCntrShort); /* 蜂鳴器短鳴一聲*/
SWState = KEY_NEXT;
#ifndef MONITOR
} else if (SWBuf == vFanKey){
/* A(0) -> Lo(1) -> Mi(2) -> Hi(3) */
FanStatus = (u8)((FanStatus & ~FANMASK_S)|((FanStatus + 1) & 0x03));
SetBuzCntr(BuzCntrShort); /* 蜂鳴器短鳴一聲*/
SWState = KEY_NEXT;
} else if (SWBuf == vModeKey){
if ((RunMode & 0x03) > 1){
SetMode(MODEHEAT);
} else {
SetMode(MODECOOL);
}
SetBuzCntr(BuzCntrShort); /* 蜂鳴器短鳴一聲*/
SWState = KEY_NEXT;
}
#else
} else {
SWState = KEY_IDLE_NEXT; /* 下一個處理狀態 */
}
#endif
} else if (SWState == KEY_PUSHED){ /* 處理允許重復的鍵 */
DebounceButton = 50; /* 重復時間 */
if (SWBuf == vUpKey){ /* TEMP+ */
Upward();
} else if (SWBuf == vDownKey){ /* TEMP- */
Downward();
} else {
SWState = KEY_NEXT;
}
#ifdef MONITOR
} else if (SWState == KEY_IDLE_NEXT){
if ((SWBuf == vModeFanKey) &&
(SWKeyHoldTm > HoldKeyTmSet)){ /* 超過 3s, 進入參數模式 */
SWState = KEY_NEXT;
CanShuNo = 0;
CanShuNoTm = CanShuNoTmSet; /* 顯示時間 */
LCDState = 3; /* 參數查詢模式 */
if (ValBit(RunMode,fSysOnOff)) LCDState--; /* 參數修改模式 */
}
#endif
}
}
}
}
void Downward(void)
{
#ifdef MONITOR
LCDTimeCount = 120; /* 120 秒 */
if (LCDState == 2){
if (CanShuNoTm != 0){
if (CanShuNo-- == 0) CanShuNo = 11;
CanShuNoTm = CanShuNoTmSet; /* 顯示時間 */
} else {
--XianShiCanShu[CanShuNo];
}
} else if (LCDState == 3){
if (CanShuNoTm != 0){
if (CanShuNo-- == 0) CanShuNo = 17;
CanShuNoTm = CanShuNoTmSet; /* 顯示時間 */
} else {
--WaiJiShuJu[CanShuNo];
}
} else {
#endif
LCDTimeCount = 5; /* 5 秒 */
LCDState = 1;
if (SetupTp > SetupTpMIN) SetupTp--;
#ifdef MONITOR
}
#endif
}
void Upward(void)
{
#ifdef MONITOR
LCDTimeCount = 120; /* 120 秒 */
if (LCDState == 2){
if (CanShuNoTm != 0){
if (++CanShuNo > 11) CanShuNo = 0;
CanShuNoTm = CanShuNoTmSet; /* 顯示時間 */
} else {
++XianShiCanShu[CanShuNo];
}
} else if (LCDState == 3){
if (CanShuNoTm != 0){
if (++CanShuNo > 17) CanShuNo = 0;
CanShuNoTm = CanShuNoTmSet; /* 顯示時間 */
} else {
++WaiJiShuJu[CanShuNo];
}
} else {
#endif
LCDTimeCount = 5; /* 5 秒 */
LCDState = 1;
if (SetupTp < SetupTpMAX) SetupTp++;
#ifdef MONITOR
}
#endif
}
/*** (c) 2005 佛山菱電 **************************** END OF FILE *************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -