📄 main.c
字号:
#include "main.h"
#include "port.h"
#include "display.h"
#include "key.h"
#include "ADConvt.h"
#include "Ctrl14013.h"
#include "TIMER2.h"
#include "EmerTime.h"
#include "CtrlCharge.h"
#include "E2Addr.h"
#include "ChanEmerTime.h"
#include "calVol.h"
#include "serialPort.h"
//#define DEBUG //调试开关
//#define DEBUGSP //调试串口开关
//E2PROM初始化的值基准电压(495)、充电时间常数(24)、放电时间常数(4)
__EEPROM_DATA(0xEF, 0x01, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00);
//______________________________本机地址|放大倍数|终止电压
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
__EEPROM_DATA(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
/*************************************中断函数初始化*****************************************
**入口:无
**出口:无
**使能TMR2中断和串口接收中断,其中TMR2匹配中断为高优先级中断,串口接收中断为低优先级中断
********************************************************************************************/
void Interpt_Initial(void)
{
GIEH=0; //禁止所有中断
GIEL=0;
TMR2IF=0; //TMR2与PR2匹配中断标志清0
RCIF=0; //串口接收中断标志清0
TMR2IP=1; //TMR2与PR2匹配中断设为高优先级
RCIP=0; //串口接收中断设为低优先级
IPEN=1; //使能中断优先级
TMR2IE=1; //定时器2中断使能
RCIE=1; //串口接收中断使能
GIEH=1; //中断使能
GIEL=1;
}
/**************************************高优先级中断********************************************
**入口:无
**出口:无
**对高优先级中断进行处理:定时器2匹配中断
**********************************************************************************************/
void interrupt HI_ISR(void)
{
if(TMR2IF==1) //是否是定时器2匹配中断
{
TMR2IF=0;
if(isTo1Sec()) //是否达到1S
{
flag_1Sec=1; //1s标志置1
}
}
}
/**************************************低优先级中断********************************************
**入口:无
**出口:无
**对低优先级中断进行处理:串口接收中断
**********************************************************************************************/
void interrupt low_priority LOW_ISR(void)
{
if(RCIF==1) //是否是串口接收中断
{
recBuf[NumRecData]=RCREG; //存储接收到的数据
NumRecData++; //已接收数据的数目+1
ChkRecEnd();
}
}
/**************************主函数初始化**********************
/*入口:无
/*出口:无
/*占用资源:
/*调用函数:display_initial,readkey_initial,
/***********************************************************/
void main_initial(void)
{
taskNo=task_Display; //当前任务显示
FaceReg=conFaceMinNo;
FaceChnNo=0;
FaceEmerNo=0;
AD_initial(); //AD初始化
display_initial(); //显示初始化
readkey_initial(); //按键初始化
Ctrl14013_Initial(); //D触发器14013初始化
Timer2_Initial(); //定时器2初始化
Interpt_Initial(); //中断初始化
EmerTime_Initial(); //应急时间初始化
CtrlCharge_Initial(); //充放电控制初始化
ChanEmerTime_Initial(); //应急时间初始化
CalVolt_initial(); //计算电压初始化
serialPort_Initial(); //串口初始化
}
/**************************点亮指示*****************************
**入口:无
**出口:无
**根据FaceChnNo更新指示
**************************************************************/
void dispInsLed(void)
{
if(FaceChnNo==0)
{
InsOut0=1;
InsOut1=0;
InsOut2=0;
InsOut3=0;
}
else if(FaceChnNo==1)
{
InsOut0=0;
InsOut1=1;
InsOut2=0;
InsOut3=0;
}
else if(FaceChnNo==2)
{
InsOut0=0;
InsOut1=0;
InsOut2=1;
InsOut3=0;
}
else if(FaceChnNo==3)
{
InsOut0=0;
InsOut1=0;
InsOut2=0;
InsOut3=1;
}
}
/********************************显示指定位小数和指定位位整数*********************
*入口:floatNum-小数位数,uint8 intNum-整数位数,uint16 DispData-显示数据
*返回值:无
*全局变量:uint8 Intpart[3],Decm[2]; //整数部分数组,小数部分数组
*求取显示数据的BCD码,存入Intpart[3],Decm[2]
********************************************************************************/
void displayFloat(uint8 floatNum,uint8 intNum,uint16 DispData)
{
uint8 tmpCtr; //循环控制
uint16 tmpInt;
if(floatNum>2)
{
floatNum=2;
}
if(intNum>3)
{
intNum=3;
}
tmpInt=DispData;
if(floatNum!=0)
{
//计算小数部分
for(tmpCtr=0;tmpCtr<floatNum;tmpCtr++)
{
Decm[tmpCtr]=tmpInt%10;
tmpInt=tmpInt/10;
}
}
//计算整数部分
for(tmpCtr=0;tmpCtr<intNum-1;tmpCtr++)
{
Intpart[tmpCtr]=tmpInt%10;
tmpInt=tmpInt/10;
}
Intpart[intNum-1]=tmpInt;
}
/**************************显示充放电次数***********************
**入口:无
**出口:无
**根据FaceChnNo更新显示缓冲区
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit]; //整数部分数组,小数部分数组
**************************************************************/
void dispChDNum(void)
{
//点亮指示灯
dispInsLed();
//显示充电次数
displayFloat(0,2,CtrlCharge[FaceChnNo].ChargeNum);
dispBuf[0]=TableNum[Intpart[0]];
dispBuf[4]=TableNum[Intpart[1]];
//显示放电次数
displayFloat(0,2,CtrlCharge[FaceChnNo].disChargeNum);
dispBuf[2]=TableNum[Intpart[0]];
dispBuf[1]=TableNum[Intpart[1]];
//显示通道号
dispBuf[3]=TableNum[FaceChnNo];
}
/**************************显示充放电时间***********************
**入口:无
**出口:无
**根据FaceChnNo更新显示缓冲区
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit]; //整数部分数组,小数部分数组
**************************************************************/
void dispChDTime(void)
{
//点亮指示灯
dispInsLed();
//显示充放电次数时间(小时)
displayFloat(0,2,CtrlCharge[FaceChnNo].hour);
dispBuf[0]=TableNum[Intpart[0]];
dispBuf[4]=TableNum[Intpart[1]];
//显示充放电时间(分钟)
displayFloat(0,2,CtrlCharge[FaceChnNo].minute);
dispBuf[2]=TableNum[Intpart[0]];
dispBuf[1]=TableNum[Intpart[1]];
//显示T
dispBuf[3]=TableLetter[8];
}
/**************************显示应急时间***********************
**入口:无
**出口:无
**根据FaceChnNo,FaceEmerNo更新显示缓冲区
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit]; //整数部分数组,小数部分数组
**************************************************************/
void dispEmerTime(void)
{
//点亮指示灯
dispInsLed();
//显示应急时间
displayFloat(0,3,ChanEmerTime[FaceChnNo].EachEmerTime[FaceEmerNo]);
dispBuf[2]=TableNum[Intpart[0]];
dispBuf[1]=TableNum[Intpart[1]];
dispBuf[0]=TableNum[Intpart[2]];
//显示次数
dispBuf[4]=TableNum[FaceEmerNo];
//显示E
dispBuf[3]=TableLetter[4];
}
/**************************显示终止电压***********************
**入口:无
**出口:无
**根据FaceChnNo,FaceEmerNo更新显示缓冲区
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit]; //整数部分数组,小数部分数组
**************************************************************/
void dispEmerVolt(void)
{
//点亮指示灯
dispInsLed();
//显示终止电压
if(Amp==conAmp1)
{
displayFloat(2,1,EmerVolt[FaceChnNo][FaceEmerNo]);
dispBuf[2]=TableNum[Decm[0]];
dispBuf[1]=TableNum[Decm[1]];
dispBuf[0]=TableNumPt[Intpart[0]];
}
else if(Amp==conAmp2)
{
displayFloat(1,2,EmerVolt[FaceChnNo][FaceEmerNo]);
dispBuf[2]=TableNum[Decm[0]];
dispBuf[1]=TableNumPt[Intpart[0]];
dispBuf[0]=TableNum[Intpart[1]];
}
//显示次数
dispBuf[4]=TableNum[FaceEmerNo];
//显示U
dispBuf[3]=TableLetter[9];
}
/**************************显示基准电压***********************
**入口:无
**出口:无
**根据baseVolt更新显示缓冲区
*全局变量:uint8 Intpart[3],Decm[2],dispBuf[con_Disp_Bit]; //整数部分数组,小数部分数组
**************************************************************/
void dispBaseVolt(void)
{
//显示基准电压
displayFloat(2,1,baseVolt);
dispBuf[2]=TableNum[Decm[0]];
dispBuf[1]=TableNum[Decm[1]];
dispBuf[0]=TableNumPt[Intpart[0]];
//显示U
dispBuf[4]=TableLetter[9];
//显示b
dispBuf[3]=TableLetter[1];
}
/**************************显示本机地址***********************
**入口:无
**出口:无
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -