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

📄 main.c

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

void main(void)
{

    P1_2=1;       //确保上电时LED光耦不动作
    //MCU初始化
    init();

    //读5045(得到5种数据,将在can初始化时使用,实际上显示板仅F0控制器号F2显示方式有用)
    read5states();

    //can初始化
    can_init();

    //数据初始化
    init_data();
    
    P1_2=0;       //取消上电时LED光耦不动作

    while(1){
        //若200ms没有CAN数据则认为应该复位CAN
        if(time_nocan200ms_flg==1){
            time_nocan_count=TIMER_NOCANDATA_NUM; //无CAN数据计数
            time_nocan_flg=0;                     //无CAN数据标志
            time_nocan200ms_flg=0;                //无CAN数据计时到标志  
            P2_7=0;
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        
            P2_7=1;
            can_init();
        }

        if(m_set5045flg==0){
        	write5045();
        	m_set5045flg=1;
        }

        //can接收
	    receivedata();

        //功能设置
        setfunc();

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

        led();

        ReportStop();

        watchdog();

    }
}
//功能设置(F0-F4切换时,设置各种功能)
void setfunc(void)
{
    //"跳线+上呼或下呼按钮按下",进入子功能设置状态
    //"跳线+上呼或下呼按钮未按下+脱离子功能设定超3s",进入父功能设置状态
    if(P1_7==0){                        
        if(P1_6==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  
        m_cFuncCnt++;
        if(m_cFuncCnt>=FUNC_NUM)
            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;
		}else if(m_cFuncCnt==5){
            m_cSubFuncCnt=data5045.cF5;
		}else if(m_cFuncCnt==6){
            m_cSubFuncCnt=data5045.cF6;
		}else if(m_cFuncCnt==7){
            m_cSubFuncCnt=data5045.cF7;
		}

        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=3;
        }else if(m_cFuncCnt==3){
            m_cMaxSubNum=1;
        }else if(m_cFuncCnt==4){
            m_cMaxSubNum=1;
		}else if(m_cFuncCnt==5){
            m_cMaxSubNum=55;
        }else if(m_cFuncCnt==6){
            m_cMaxSubNum=1;
        }
        
        //范围检查
        if(m_cSubFuncCnt>m_cMaxSubNum)
            m_cSubFuncCnt=m_cMaxSubNum;

        if(P1_6==0){                    //功能选择按钮被按下(对应上呼按钮按下,累加)
//            if((m_cSubFuncTimer--)==0){            
                if(m_cSubFuncCnt<m_cMaxSubNum) 
                	m_cSubFuncCnt++;
                else
                	m_cSubFuncCnt=0;
                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;
		}else if(m_cFuncCnt==5){
            data5045.cF5=m_cSubFuncCnt;
			m_set5045flg=0;
		}else if(m_cFuncCnt==6){
            data5045.cF6=m_cSubFuncCnt;
			m_set5045flg=0;
		}else if(m_cFuncCnt==7){
            data5045.cF7=m_cSubFuncCnt;
			m_set5045flg=0;
		}
    }
}

//报站(报站)
void ReportStop(void)
{
	uchar cTemp=0;

    m_cReportData = m_cReportIdx;

    if(m_cReportFlg==1){
        m_cReportingFlg = 1;
        m_cReportFlg=0;         //设置后,立即清标记
        time_report_flg=1;
    }

    if(time_report2s_flg==1){   //报时2s时间到,停止报时
    	m_cReportData=m_cReportData&0x7F;
        m_cReportingFlg=0;
        time_report_count=TIMER_REPORT_NUM;
        time_report_flg=0;
        time_report2s_flg=0;
    }
    
    if(m_cReportingFlg==1){
        m_cReportData = 0x80|m_cReportIdx;
    }else if(m_cReportingFlg==0){
        m_cReportData = m_cReportData&0x7F;
    }
	
	if(data5045.cF7==1){		//报站输出高有效
		cTemp = m_cReportData;
	}else if(data5045.cF7==0){	//报站输出低有效
		cTemp = ~m_cReportData;
	}

//    PF377 = m_cReportData;
	PF377 = cTemp;
}

⌨️ 快捷键说明

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