在写单片机软件的时候,很容易遇到,有多个状态同时存在的情况,一个状态的话,用一个变量表示即可,多个状态时,按位表示再好不过
上代码
#include "stdio.h"
typedef enum
{
impedance_prewarn = 0, //阻抗预报警
impedance_warn = 1, //阻抗报警
capacitance_prewarn = 2, //容抗预报警
capacitance_warn = 3, //容抗报警
Temp_warn = 4, //温度报警
voltage_over = 5, //过压
voltage_under = 6, //欠压
current_over = 7, //过流
voltage_miss = 8, //缺相
}ERRORINFO;
uint16_t pStatus ,LastpStatus; //我们可以获取pStatus的值,按位解析当前所有存在的故障
void StatusSave(uint16_t position, uint8_t state);
int main(void)
{
while(1)
{
//假设过压
if(pStatus !=LastpStatus && pStatus !=0 ) //当前状态和上次状态不一样,且当前状态不等于0
{
//如此一来,故障只记录了一次
LastpStatus = pStatus;
StatusSave(voltage_over, 1); //记录故障
}
else
{
if(pStatus ==0)
StatusSave(voltage_over, 0); //清除故障
LastpStatus=0;
}
}
}
void StatusSave(uint16_t position, uint8_t state)//c语言按位运算存储故障记录
{
if(state)
{
pStatus |= 1 << (position);
}
else
{
pStatus &= ~(1 << (position));
}
}
//判断属于哪种故障,用 if(pStatus & (1 << Voltage_Over))