📄 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 + -