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