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

📄 main.c

📁 一整套电梯控制器源程序
💻 C
字号:
#include "public.h"

void main(void)
{
    //MCU初始化
//    P3_1=1;
    init();

    //读5045(得到的5种数据,将在can初始化时使用)
    read5states();

    //can初始化
    can_init();

    //数据初始化
    init_data();
//    P3_1=0;
    while(1){
        
        if(m_set5045flg==0){
        	write5045();
        	m_set5045flg=1;
        }

		if(time_nocan_flg==1){
			can_init();
    		time_nocan_count=TIMER_400ms;
			time_nocan_flg=0;
		}

        //can发送接收
        receivedata();
        senddata();

        //功能设置
        setfunc();

        //显示当前应该显示的内容
        display();

        led();
		
        advanceoutput();
//		m_cMakeNewFlg=0;

        watchdog();

    }
}

//功能设置(F0-F4切换时,设置各种功能)
void setfunc(void)
{
    //"跳线+上呼或下呼按钮按下",进入子功能设置状态
    //"跳线+上呼或下呼按钮未按下+脱离子功能设定超3s",进入父功能设置状态
    if(P1_7==0){                        
        if(P1_0==0){                //上呼按钮按下
            m_cSettingFuncFlg=0;
            m_cSettingSubFuncFlg=1;
            m_cSubToParLess2sFlg=1;
        }else if(P1_2==0){          //下呼按钮按下
            m_cSettingFuncFlg=0;
            m_cSettingSubFuncFlg=1;
            m_cSubToParLess2sFlg=1;
        }else if(m_cSubToParLess2sFlg==1){
            m_cSettingFuncFlg=0;
            m_cSettingSubFuncFlg=1; 
        }else if(m_cSubToParLess2sFlg==0){
            m_cSettingFuncFlg=1;
            m_cSettingSubFuncFlg=0;
        }
    }


    if(P1_7==0)                         //功能切换
    if((m_cSettingFuncFlg==1) && (m_cSettingSubFuncFlg==0))
    if(m_cNewFuncFlg==1){
//  if((m_cFuncTimer--)==0){    			//2004.08.31  14:21 LHM     
        if(m_cFuncCnt!=4) 
        	m_cFuncCnt++;
        else
        	m_cFuncCnt=0;

        if(m_cFuncCnt==0){
            m_cSubFuncCnt=data5045.cF0;
        }else if(m_cFuncCnt==1){
            m_cSubFuncCnt=data5045.cF1;
        }else if(m_cFuncCnt==2){
            m_cSubFuncCnt=data5045.cF2;
        }else if(m_cFuncCnt==3){
            m_cSubFuncCnt=data5045.cF3;
        }else if(m_cFuncCnt==4){
            m_cSubFuncCnt=data5045.cF4;
		}
        m_cNewFuncFlg=0;
        m_cFuncTimer=TIMER_FUNC_NUM;
    }  

    if(P1_7==0)                         //子功能切换
    if((m_cSettingFuncFlg==0) && (m_cSettingSubFuncFlg==1))
    if(m_cNewSubFuncFlg==1){
        //最大取值
        if(m_cFuncCnt==0){
            m_cMaxSubNum=7;
        }else if(m_cFuncCnt==1){
//          m_cMaxSubNum=47;
            m_cMaxSubNum=m_RecData.cMaxFloor;
        }else if(m_cFuncCnt==2){
            m_cMaxSubNum=2;
        }else if(m_cFuncCnt==3){
            m_cMaxSubNum=1;
        }else if(m_cFuncCnt==4){
            m_cMaxSubNum=1;
		}
        
        //范围检查
        if(m_cSubFuncCnt>m_cMaxSubNum)
            m_cSubFuncCnt=m_cMaxSubNum;

        if(P1_0==0){                    //上呼按钮按下
//            if((m_cSubFuncTimer--)==0){            
                if(m_cSubFuncCnt<m_cMaxSubNum) 
                	m_cSubFuncCnt++;
                else
                	m_cSubFuncCnt=0;
                m_cNewSubFuncFlg=0;
                m_cSubFuncTimer=TIMER_SUBFUNC_NUM;
//            } 
        }else if(P1_2==0){              //下呼按钮按下
//            if((m_cSubFuncTimer--)==0){            
                if(m_cSubFuncCnt!=0) 
                	m_cSubFuncCnt--;
                else
                	m_cSubFuncCnt=m_cMaxSubNum;
                m_cNewSubFuncFlg=0;
                m_cSubFuncTimer=TIMER_SUBFUNC_NUM;
//            }  
        } 

        if(m_cFuncCnt==0){
            data5045.cF0=m_cSubFuncCnt;
			m_set5045flg=0;
            /*在给SJA1000进行初始化时,发现有这样一个问题,当SJA1000工作之后,就没办法将其进行初始化了。
              除非将其硬件复位。为了改正这个状况,现在的解决办法是,当设置发生变化时,进行写5045操作:s5045();
              在写操作后,将sja1000复位管脚复位,然后重新调用sja1000初始化程序。
              此时将重新进行SJA1000的初始化工作
              最初执行的操作为:在重新写设置数据到4045后,执行死循环.此时将导致CPU复位.程序将重新的开始,但现在
              可通过对sja1000的复位脚进行操作对其硬件复位。
            */      
			/*    
            P2_7=0;                
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            P2_7=1;
			*/
            can_init();
        }else if(m_cFuncCnt==1){
            data5045.cF1=m_cSubFuncCnt;
            m_set5045flg=0;
			/*
            P2_7=0;                
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            P2_7=1;
			*/
            can_init();
        }else if(m_cFuncCnt==2){
            data5045.cF2=m_cSubFuncCnt;
			m_set5045flg=0;
        }else if(m_cFuncCnt==3){
            data5045.cF3=m_cSubFuncCnt;
			m_set5045flg=0;
        }else if(m_cFuncCnt==4){
            data5045.cF4=m_cSubFuncCnt;
			m_set5045flg=0;
		}
    }
}

/*
        time_stop_count=TIMER_STOP_NUM;             //到站动作计数
        time_stop_flg=0;                            //到站动作标志
        time_stop2s_flg=0;                          //到站动作计时到标志
*/
void advanceoutput(void)
{
    uchar cOutput=0xFF;

    //消防基站
    if(m_cFireBaseFlg==1){
        cOutput=cOutput&0xF7;
    }else{
        cOutput=cOutput&0xFF;
    }

    //到站动作(点灯,鸣钟)
    if(m_cStopFlg==1){
        //到站动作开始
        if(m_RecData.cDirect==0){        //下
            cOutput=cOutput&0xF9;
        }else if(m_RecData.cDirect==1){ //上
            cOutput=cOutput&0xFA;
        }else if(m_RecData.cDirect==0xFF){  //无(确保无到站动作即可)
            cOutput=cOutput&0xFF;
        }
//      m_cStopFlg=0;
        time_stop_flg=1;
    }else{
        //确保无到站动作
        cOutput=cOutput&0xFF;
    }
    
    if(time_stop2s_flg==1){ //2秒时间到
        cOutput=cOutput&0xFF;
        m_cStopFlg=0;                               //取消
        time_stop_count=TIMER_STOP_NUM;             //到站动作计数
        time_stop_flg=0;                            //到站动作标志
        time_stop2s_flg=0;                          //到站动作计时到标志
    }

    PD377=cOutput;
}

⌨️ 快捷键说明

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