⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ports.c

📁 简易风盘控器程序 AVR GCC MEGA8
💻 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 + -