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