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

📄 s3f9454.c

📁 三星单片机EEPROM驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//********************************
//产品名称: NEW_KJ09H
//使用MCU: S3F9454
//FOSC = 3.2MHZ
//********************************
#include "ioS3C9454.h"//
#include "iobit.h"      //IO端口位操作定义文件
#include "intrinsics.h"//包含内部函数

//************************************************
//**此处为宏定义替换******
#define uchar unsigned char
#define uint  unsigned int

#define nop (__no_operation())
#define di  (__disable_interrupt())
#define ei  (__enable_interrupt())
//************************************************
//**此处定义程序所用到的全局变量*******
uchar RUNFLAG   = 0;
uchar DISPFLAG  = 0;
uchar ERRFLAG   = 0;                //错误代码标志寄存器
uchar TMR_1SL   = 0;                //定时器1S计数器低位
uchar TMR_1SH   = 0;                //定时器1S计数器高位 
uchar SECOND    = 0;                //定时器秒计数器
uchar IGBTAD_DT = 0;                //IGBT温度检测值 

uchar KEY_CODE  = 0;                //键扫描码
uchar FUNC_LOOP = 0;                //功能执行步定义
uchar CURAD_DT  = 0;                //当前运行电流电压检测值 
uchar HSRAD_DT  = 0;                //炉盘热敏温度检测值 
uchar FIRE_SELE = 0;                //
uchar IM_LOOP   = 0;                //间歇加热模式计数器
uchar DELAY_3S  = 0;                //3S延时计数器
uchar DELAY_2M  = 0;                //2分钟延时计数器 
uchar DELAY_FREE  = 0;              //间歇延时计数器
uchar DELAY_RUN = 0;                //加热延时计数器 
uchar DELAY_PV  = 0;                //电源电压异常时延时计数器 

uchar DELAY_2H  = 0;                //2小时关机定时器 
uchar PVAD_DT   = 0;                //电源电压检测值
uchar TMR_FAST  = 0;                //

uchar DIGITA    = 0;                //
uchar DIGITB    = 0;                //
uchar DIGITC    = 0;                //
uchar DIGITD    = 0;                //
uchar SEG_A     = 0;                //
uchar SEG_B     = 0;                //
uchar SEG_C     = 0;                //
uchar SEG_D     = 0;                //
uchar LED_LOOP  = 0;                //
uchar TMRFLAG   = 0;                //

uchar DELAY_HOTA  = 0;              //
uchar DELAY_HOTB  = 0;              //
uchar DELAY_HOTC  = 0;              //

//*************************************************************************
//**位变量操作宏定义
//系统运行操作标志位定义
#define Set_KeyDown   (RUNFLAG = RUNFLAG | 0x1)
#define Set_NoFz      (RUNFLAG = RUNFLAG | 0x2)
#define Set_ImMode    (RUNFLAG = RUNFLAG | 0x4)
#define Set_NoAd      (RUNFLAG = RUNFLAG | 0x8)
#define Set_HandStart (RUNFLAG = RUNFLAG | 0x10)
#define Set_OnOff     (RUNFLAG = RUNFLAG | 0x20)
#define Set_FastMode  (RUNFLAG = RUNFLAG | 0x40)

#define Clr_KeyDown   (RUNFLAG = RUNFLAG & ~0x1)
#define Clr_NoFz      (RUNFLAG = RUNFLAG & ~0x2)
#define Clr_ImMode    (RUNFLAG = RUNFLAG & ~0x4)
#define Clr_NoAd      (RUNFLAG = RUNFLAG & ~0x8)
#define Clr_HandStart (RUNFLAG = RUNFLAG & ~0x10)
#define Clr_OnOff     (RUNFLAG = RUNFLAG & ~0x20)
#define Clr_FastMode  (RUNFLAG = RUNFLAG & ~0x40)

#define Test_KeyDown  (RUNFLAG & 0x1)
#define Test_NoFz     (RUNFLAG & 0x2)
#define Test_ImMode   (RUNFLAG & 0x4)
#define Test_NoAd     (RUNFLAG & 0x8)
#define Test_HandStart (RUNFLAG & 0x10)
#define Test_OnOff    (RUNFLAG & 0x20)
#define Test_FastMode (RUNFLAG & 0x40)

#define Com_FastMode  (RUNFLAG = RUNFLAG ^ 0x40)

//系统显示标志位定义
#define Set_DesMode   (DISPFLAG = DISPFLAG | 0x1)
#define Set_TmrWait   (DISPFLAG = DISPFLAG | 0x2)
#define Set_FireWait  (DISPFLAG = DISPFLAG | 0x4)
#define Set_PvWait    (DISPFLAG = DISPFLAG | 0x8)
#define Set_DiFireDisp (DISPFLAG = DISPFLAG | 0x10)
#define Set_DiTmrDisp  (DISPFLAG = DISPFLAG | 0x20)
#define Set_DiFireTmr  (DISPFLAG = DISPFLAG | 0x40)
#define Set_TmrMode    (DISPFLAG = DISPFLAG | 0x80)

#define Clr_DesMode   (DISPFLAG = DISPFLAG & ~0x1)
#define Clr_TmrWait   (DISPFLAG = DISPFLAG & ~0x2)
#define Clr_FireWait  (DISPFLAG = DISPFLAG & ~0x4)
#define Clr_PvWait    (DISPFLAG = DISPFLAG & ~0x8)
#define Clr_DiFireDisp (DISPFLAG = DISPFLAG & ~0x10)
#define Clr_DiTmrDisp  (DISPFLAG = DISPFLAG & ~0x20)
#define Clr_DiFireTmr  (DISPFLAG = DISPFLAG & ~0x40)
#define Clr_TmrMode    (DISPFLAG = DISPFLAG & ~0x80)

#define Test_DesMode   (DISPFLAG & 0x1)
#define Test_TmrWait   (DISPFLAG & 0x2)
#define Test_FireWait  (DISPFLAG & 0x4)
#define Test_PvWait    (DISPFLAG & 0x8)
#define Test_DiFireDisp (DISPFLAG & 0x10)
#define Test_DiTmrDisp  (DISPFLAG & 0x20)
#define Test_DiFireTmr  (DISPFLAG & 0x40)
#define Test_TmrMode    (DISPFLAG & 0x80)

//系统定时操作标志位定义
#define Set_HalfSedA    (TMRFLAG = TMRFLAG | 0x1)
#define Set_HalfSedB    (TMRFLAG = TMRFLAG | 0x2)
#define Set_HalfSedC    (TMRFLAG = TMRFLAG | 0x4)
#define Set_OneSedA    (TMRFLAG = TMRFLAG | 0x8)
#define Set_OneSedB    (TMRFLAG = TMRFLAG | 0x10)
#define Set_OneSedC    (TMRFLAG = TMRFLAG | 0x20)
#define Set_OneSedD    (TMRFLAG = TMRFLAG | 0x40)

#define Clr_HalfSedA    (TMRFLAG = TMRFLAG & ~0x1)
#define Clr_HalfSedB    (TMRFLAG = TMRFLAG & ~0x2)
#define Clr_HalfSedC    (TMRFLAG = TMRFLAG & ~0x4)
#define Clr_OneSedA    (TMRFLAG = TMRFLAG & ~0x8)
#define Clr_OneSedB    (TMRFLAG = TMRFLAG & ~0x10)
#define Clr_OneSedC    (TMRFLAG = TMRFLAG & ~0x20)
#define Clr_OneSedD    (TMRFLAG = TMRFLAG & ~0x40)

#define Test_HalfSedA    (TMRFLAG & 0x1)
#define Test_HalfSedB    TMRFLAG & 0x2)
#define Test_HalfSedC    (TMRFLAG & 0x4)
#define Test_OneSedA    (TMRFLAG & 0x8)
#define Test_OneSedB    (TMRFLAG & 0x10)
#define Test_OneSedC    (TMRFLAG & 0x20)
#define Test_OneSedD    (TMRFLAG & 0x40)

//P0端口功能定义
#define Set_AutoLed   Set_P00 
#define Set_HandLed   Set_P01

#define Test_AutoLed  Test_P00
#define Test_HandLed  Test_P01

#define Clr_AutoLed   Clr_P00
#define Clr_HandLed   Clr_P01   

#define Com_AutoLed   Com_P00
#define Com_HandLed   Com_P01

//P1端口功能定义
#define Set_164sdt   Set_P10
#define Set_164sck   Set_P11

#define Clr_164sdt   Clr_P10
#define Clr_164sck   Clr_P11


#define Set_FansPfd   Set_P20
#define Set_LedACtrl   Set_P21
#define Set_LedBCtrl   Set_P22
#define Set_LedCCtrl   Set_P23
#define Set_LedDCtrl   Set_P24
#define Set_FastLed    Set_P25

#define Clr_FansPfd   Clr_P20
#define Clr_LedACtrl   Clr_P21
#define Clr_LedBCtrl   Clr_P22
#define Clr_LedCCtrl   Clr_P23
#define Clr_LedDCtrl   Clr_P24
#define Clr_FastLed    Clr_P25

#define Com_FansPfd   Com_P20
#define Com_FastLed   Com_P25

#define Test_FansPfd  Test_P20


//部分通用宏操作定义
#define Clr_WatchDog     (BTCON = BTCON | 0x2)
#define Test_ADOK  (ADCON & 0x8)
//*************************************************************************
//***程序所用函数声明*****
//***凡程序中所用到的函数请先在这里声明***
__interrupt  void  int_9454();

extern  void  beep();
void    chip_init();

void    TmrCheck();
void    AutoTea();
void    PwmCtrl();
void    ImCheck();
void    ConvertCode();
void    DigitConvert();
void    ErrCodeConvert();
void    KeyScan();
uchar   KeyTest();
void    FzCheck();
void    Current_Check();
void    Delay(unsigned int);
void    V18Check();
void    HsrCheck();
void    IgbtCheck();
void    PvCheck();
void    Beep(uchar);
void    LedScan();
void    SendTo164(uchar);
//*************************************************************************
//**定义9454的SMART OPTION值****
//**003CH,must be initialized to 0
//**003DH,must be initialized to 0
//**003EH,enable LVR(2.3V)
//**003FH,internal RC(3.2MHZ in Vdd=5V)
//*************************************
__code  const  volatile  uchar SmartOption[4] @0x003c = {0x0,0x0,0xe7,0x03};
//*************************************************************************
//出错代码值定义
#define ERC_PVH 0x1
#define ERC_PVL 0x2
#define ERC_IGBT_OPEN 0x3
#define ERC_IGBT_HOT  0x4
#define ERC_HSR_OPEN  0x5
#define ERC_HSR_HOT   0x6

#define FAST_KEY  0x1
#define AUTO_KEY  0x2
#define HAND_KEY  0x3
#define OFF_KEY   0x4
#define NO_KEY    0xff
#define FUNC_OK   0x80

//*************************************************************************
//数码管显示代码定义(在ROM=0X40)
__code  const volatile uchar DigitCode[12] @0x0040 = 
{
  0x03,   //'0'
  0x9f,   //'1'
  0x25,   //'2'
  0x0d,   //'3'
  0x99,   //'4'
  0x49,   //'5'
  0x41,   //'6'
  0x1f,   //'7'
  0x01,   //'8'
  0x09,   //'9'
  0xff,   //'A'
  0x61,   //'E'
};

//**************************************************************************
//========================主程序控制===========================
void main(void)
{
  //***填充系统SMART OPTION***/
  uchar buffer = SmartOption[0];
  
  asm("LD R0,#1");
  asm("LD RUNFLAG,R0");
  asm("LD P0,R0");
  
  //***初始化过程***//
  chip_init();
  
main_start:
  //***主循环开始***//
  ei;
  Clr_OnOff;
  Clr_AutoLed;
  Clr_HandLed;
  Clr_FastLed;
  
  TMRFLAG = 0;
  DISPFLAG = 0;
  DELAY_2M = 0;
  KEY_CODE = 0;
  PWMDATA = 0;
  asm("and RUNFLAG,#0x1");
  ConvertCode();
  if  (ERRFLAG)
  {
    Beep(4);
    Delay(50);
    Beep(4);
    Delay(50);
    Beep(4);
    Delay(50);
    Beep(4);
  }
  else
  {
    Beep(0xf);
  }
  while(!Test_OnOff)
  {
    asm("push ERRFLAG");
    IgbtCheck();
    asm("pop ERRFLAG");
    if  (IGBTAD_DT <= 0x28)
        Clr_FansPfd;
    else if  (IGBTAD_DT > 0x66)
        Set_FansPfd;
    KeyScan();
  }
 
  //启动初始化
  DELAY_2H = 0;
  DELAY_2M = 0;
  FIRE_SELE = 0x2;
  //***工作循环开始***//
  while(Test_OnOff)
  {
    //按键检查//
    ERRFLAG = 0;
    KeyScan();
    if  (!Test_OnOff)
        break;
    //电源电压及18V电压检查//
    if  (Test_PvWait)
        goto tmr_check;
    V18Check();
    if  (ERRFLAG) 
    {   
        DELAY_PV = 0x3;
        goto  wait_pv;
    }
    else
    {
      PvCheck();
      if  (!ERRFLAG)
          goto  chk_hsr;
      DELAY_PV = 0;
    }
    //如果电压出错,则等待2-3S//
wait_pv:
    ERRFLAG = 0;
    Set_NoFz;
    Set_NoAd;
    Clr_ImMode;
    Set_PvWait;
    PWMDATA = 0;
    goto  tmr_check;
    //炉盘热敏检查//
chk_hsr:
    HsrCheck();
    if  (ERRFLAG)
        break;
    //IGBT热敏检查//
    IgbtCheck();
    if  (ERRFLAG)
        break;
    //间断加热工作检查//
    ImCheck();
    //加锅状态检查//
    FzCheck();
    if  (!Test_OnOff)
        break;
    //功率控制输出检查//
    PwmCtrl();
    //检查当前工作状态//
    if  (Test_FastMode)
    {
      //如果选择了快速加热模式//
      FIRE_SELE = 0x1;
      if  ((KEY_CODE == AUTO_KEY)&&(TMR_FAST > 0x78))
      {
          Clr_FastMode;
          Clr_FastLed;
          FIRE_SELE = 0x2;
      }  
      else if ((KEY_CODE == HAND_KEY)&&(TMR_FAST > 0xf0))
      {
        Clr_FastMode;
        Clr_FastLed;
        FIRE_SELE = 0x2;
      }
    }
    //检查自动泡茶状态//
    if  (KEY_CODE == AUTO_KEY)
    {
      AutoTea();
    }  
tmr_check:
    //显示代码转换及定时运行检查//
    ConvertCode();
    TmrCheck();
  }
  goto  main_start;
}
//******************************************************************
//****启动时IO初始化子过程******
void  chip_init()
{
    Clr_KeyDown;
    BTCON = 0xa3;         //Watch-dog disable
    CLKCON  = 0x18;       //selet non-divided CPU clock
    P0PND   = 0x0;        //P0/INT disable
    P0CONH  = 0xdf;       //P0.7 is as A/D convert port
                          //P0.6 is PWM output
                          //P0.5 is as A/D convert port  
                          //P0.4 is as A/D convert port
    P0CONL  = 0xfa;       //P0.3 is as A/D convert port 
                          //P0.2 is as A/D convert port  
                          //P0.0,P0.1 is as push-pull output port 
    P0 = 0x0;                             			
    P1CON = 0xa;          //P1.0 is as push-pull output port  
                          //P1.1 is as push-pull output port 
    P1 = 0x0;
   
    P2CONH = 0x2a;        //P2.0-P2.5 is as push-pull output
    P2CONL = 0xaa;        //P2.6 is as A/D input
    P2 = 0x1e;    
    
    PWMDATA = 0x0; 
    PWMCON = 0x5c;        //PWM input clock is fosc/8,enable PWM output
                          //reload from 6 bit coun
    T0DATA = 0x32;
    T0CON =0x4a;          //TMR0 start count,f=fosc/256
                          //enable TMR0 interrupt/4ms	
    P2 = 0xff;
   
    SEG_A = 0xff;
    SEG_B = 0xff;
    SEG_C = 0xff;
    SEG_D = 0xff;
    Delay(500);
       
    P2 = 0x0;	
    PvCheck();
    if  (ERRFLAG)
    {
      goto  init_back; 
    }
    IgbtCheck();
    if  (!ERRFLAG)
    {
      goto  hsr_chk;
    }
    Set_FansPfd;
    goto  init_back;
hsr_chk: 
    HsrCheck();    
    //***初始化出口***//
init_back:

    return;
}
//**********************************************************************
//功率控制PWM输出子过程
void  PwmCtrl()
{
    uchar set;
    
    ////////////////
    if  ((Test_NoFz)||(Test_NoAd))      //如果当前未加锅或处于禁止控制状态,则不予处理
        goto  pwm_back;
    di;
    
    switch(FIRE_SELE)
    {
      case  1:
        set = 0xff;
        break;
      case  2:
        set = 0xba;
        break;
      default:
        set = 0x90;
        break;
    }
    if  (PWMDATA > set)
    {
        if  (PWMDATA > 0x2)
            PWMDATA--;
    }
    else if (PWMDATA < set)
    {
        if  (PWMDATA < 0xfc)
            PWMDATA++;
    }
pwm_back:
    ei;
    return;
}
//**********************************************************************
//定时运行检查子过程
void  TmrCheck()
{
    if  (!Test_OneSedB)
        goto  tmr_back;
    Clr_OneSedB;
    
    di;
    if  (!Test_PvWait)
    {
        if  (DELAY_2H < 0x78)
            goto tmr_back;
        Clr_OnOff;
        goto  tmr_back;     
    }    
    DELAY_PV++;
    if  (DELAY_PV < 0x5)
        goto  tmr_back;
    PvCheck();
    if  (!ERRFLAG)
        V18Check();
    Clr_OnOff;
    if  (!ERRFLAG)
    {
        Set_OnOff;
        Clr_PvWait;
    }
tmr_back:
    ei;
    return;      
}
//*************************************************************************
//间断加热模式控制子过程
void  ImCheck()
{
    Clr_WatchDog;
    if  ((Test_NoFz)||(!Test_ImMode)||(!Test_OneSedD))
        goto  im_back;
    di;
    if  (IM_LOOP--)
        goto  im_back;
    if  (!Test_NoAd)
    {
        Clr_NoAd;
        Set_NoFz;
        DELAY_3S = 0xf0;
        IM_LOOP = DELAY_RUN;
        goto  im_back;  
    }    
    else
    {
        Set_NoAd;
        PWMDATA = 0;
        IM_LOOP = DELAY_FREE;
    }
im_back:
    ei;
    return;   
}
//*************************************************************************
//整机显示转换子过程
void  ConvertCode()
{
    Clr_WatchDog;
    di;
    
    if  (!Test_OnOff)
    {
      if  (ERRFLAG)
          ErrCodeConvert();
      else
      {
        SEG_A = 0xff;
        SEG_B = 0xff;
        SEG_C = 0xff;
        SEG_D = 0xff;
      }
      goto  cvt_back;
    } 
    DIGITA = 0xa;
    DIGITC = 0;
    DIGITD = 0;  
    switch(FIRE_SELE)
    {
      case  1:
        DIGITA = 0x1;
        DIGITB = 0x2; 
        break;
      case  2:
        DIGITB = 0x9;
        break;
      case  3:
        DIGITB = 0x6;
        break;
      case  4:
        DIGITB = 0x2;
        break;
      default:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -