output.c
来自「电表解决方案概要power_meter_r8c2g_source_code」· C语言 代码 · 共 1,132 行 · 第 1/2 页
C
1,132 行
unsigned int total_time = 0;
unsigned char left_time = 0;
unsigned int pass_time = 0;
for (i = 0; i < table_colum; i++)
{
if ((i == 1)&&(program_buff != Special_PGM)) /* 处理浸泡时间 */
{
total_time += main_soak_time * 60;
if (i == operation_counter)
pass_time = (total_time - process_left_time);
continue;
}
if ((i == 2)&&(program_buff != Special_PGM)) /* 处理洗涤时间 */
{
total_time += main_wash_time * 60;
if (i == operation_counter)
pass_time = (total_time - process_left_time);
continue;
}
if ((i == (table_colum - 3))&&(program_buff != Special_PGM)) /* 处理脱水时间 */
{
if (spin_time_buff == 6)
total_time += table_adr[i] * 60;
if (spin_time_buff != 6)
total_time += spin_time_buff * 60;
if (i == operation_counter)
pass_time = (total_time - process_left_time);
continue;
}
if (i == operation_counter) /* 处理当前运行过程剩余时间 */
{
total_time += table_adr[i];
if ((i==0)&&(first_count_flag == 1))
{
first_count_flag = 0;
process_left_time = 120;
if (program_buff == Special_PGM)
process_left_time = 5;
pass_time = (total_time - process_left_time);
continue;
}
pass_time = (total_time - process_left_time); /* 计算已运行时间 */
if (program_buff == Special_PGM)
{
pass_time = (total_time - process_left_time/60);
if ((process_left_time % 60) > 30)
pass_time -= 1;
}
continue;
}
total_time += table_adr[i]; /* 计算程序运行需要的总时间 */
// if (i == (table_colum-1))
// {
// left_time = (total_time - pass_time)/60;
// }
}
if (program_buff == Special_PGM)
{
left_time = total_time - pass_time;
process_left_time = 300;
}
else
{
left_time = (total_time - pass_time)/60; /* 计算剩余时间 */
if ((left_time % 60) > 30)
left_time += 1; /* 剩余时间误差修正 */
}
return left_time; /* 返回剩余时间 */
}
/**************************************************************
void eeprom_write(void),
将系统掉电时状态保存到 EEPROM 的写入程序
**************************************************************/
void eeprom_write(void)
{
static unsigned char i=0;
static unsigned char j=0;
IicPack IicData_w;
IicData_w.iic_DeviceAddress = 0xa0; /* 设置 EEPROM 设备地址 */
IicData_w.iic_MemoryAddress = 0x00; /* 设置 EEPROM 读写起始地址 */
// IicData_w.iic_Data = WriteData;
IicData_w.iic_Data = RAM_TOP_2; /* 设置状态保护 RAM 地址 */
IicData_w.iic_NumberOfByte = 8; /* 设置一次读写字节数 */
for (j = 0; j <= 30; j++) /* 数据循环写入,根据数据多少决定循环次数 */
{
if (j == 30)
{
IicData_w.iic_NumberOfByte = 5;
initIicBus();
IicBusWrite(&IicData_w);
break;
}
initIicBus();
IicBusWrite(&IicData_w);
asm("nop");
IicData_w.iic_MemoryAddress += 8;
// IicData_w.iic_Data += 8;
epprom_4ms_buff = 1;
while (epprom_4ms_buff)
{
asm("nop");
}
}
asm("nop");
asm("nop");
asm("nop");
}
/*******************************************************************
void eeprom_read(void),
将系统掉电时状态恢复到R8C MCU RAM中,使程序运行在系统掉电时的状态
*******************************************************************/
void eeprom_read(void)
{
static unsigned char i=0;
static unsigned char j=0;
IicPack IicData_w;
IicPack IicData_r;
IicData_r.iic_DeviceAddress = 0xa0; /* 设置 EEPROM 设备地址 */
IicData_r.iic_MemoryAddress = 0x40; /* 设置 EEPROM 读写起始地址 */
// IicData_r.iic_Data = ReadData;
IicData_r.iic_Data = RAM_TOP_1; /* 设置状态保护 RAM 地址 */
IicData_r.iic_NumberOfByte = 0x08; /* 设置一次读写字节数 */
initIicBus();
IicBusRead(&IicData_r); /* 读掉电保护字节,用于判断是否运行掉电记忆程序 */
asm("nop");
asm("nop");
asm("nop");
if(Rec_Byte == 1) /* 掉电保护字节有效,运行掉电记忆程序 */
{
IicData_r.iic_DeviceAddress = 0xa0;
IicData_r.iic_MemoryAddress = 0x00;
IicData_r.iic_Data = RAM_TOP;
IicData_r.iic_NumberOfByte = 0xF5;
initIicBus();
IicBusRead(&IicData_r); /* 将掉电时系统保护的数据写到 MCU RAM 中 */
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
Rec_Byte = 0; /* 清掉电保护字节 */
IicData_w.iic_DeviceAddress = 0xa0;
IicData_w.iic_MemoryAddress = 0x40;
IicData_w.iic_Data = RAM_TOP_1;
IicData_w.iic_NumberOfByte = 8;
initIicBus();
IicBusWrite(&IicData_w); /* 将 EEPROM 里面对应地址的掉电保护字节清0 */
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
recover_flag = 1; /* 置掉电记忆标志 */
}
}
/********************************************************
Name : initIicBus
Parameters : None
Returns : None
Description : initialize I2C-BUS port
********************************************************/
void initIicBus(void)
{
iic_sda_d = 0; /* SDA input ("H" state) */
iic_scl_d = 0; /* SCL input ("H" state) */
}
//-----------------------------------------------------------------
/********************************************************
Name : IicBusRead
Parameters : structure IicPack pointer
Returns : Acknowledge
Description : Sequential Ramdom Read Cycle (I2C-BUS)
********************************************************/
unsigned char IicBusRead(IicPack *IicData)
{
unsigned char i,ret; /* Ramdom Read Cycle / Sequential Ramdom Read Cycle */
IicData->iic_DeviceAddress &= 0xFE; /* WRITE Setting DeviceAddress */
StartCondition(); /* Start Condition */
while (1)
{
if ((ret=ByteWrite(IicData->iic_DeviceAddress)) == NOACK) /* WRITE DeviceAddress */
break;
/* NoAck Detect */
if ((ret=ByteWrite(IicData->iic_MemoryAddress)) == NOACK)
/* WRITE MemoryAddress */
break; /* NoAck Detect */
IicData->iic_DeviceAddress |= 0x01; /* READ Setting DeviceAddress */
StartCondition(); /* ReStart Condition */
if ((ret=ByteWrite(IicData->iic_DeviceAddress)) == NOACK)
/* DeviceAddress WRITE */
break;
/* NoAck Detect */
for (i=1; i<IicData->iic_NumberOfByte; i++)
{ /* specified bytes as loop */
ByteRead (IicData->iic_Data, ACK); /* Read data (Ack output) */
IicData->iic_Data++; /* */
}
ByteRead (IicData->iic_Data, NOACK); /* Read data (NoAck output) */
break;
}
StopCondition(); /* Stop Condition */
return(ret);
}
//-------------------------------------------------------------------------
/********************************************************
Name : IicBusWrite
Parameters : structure IicPack pointer
Returns : Acknowledge
Description : Byte Write or Page Write Cycle (I2C-BUS)
********************************************************/
unsigned char IicBusWrite(IicPack *IicData)
{
unsigned char i,ret;
/* Byte Write / Page Write */
IicData->iic_DeviceAddress &= 0xFE; /* WRITE Setting DeviceAddress */
StartCondition(); /* Start Condition */
while (1)
{
if ((ret=ByteWrite(IicData->iic_DeviceAddress)) == NOACK)
/* WRITE DeviceAddress */
break; /* NoAck Detect */
if ((ret=ByteWrite(IicData->iic_MemoryAddress)) == NOACK)
/* WRITE MemoryAddress */
break; /* NoAck Detect */
for (i=0; i<IicData->iic_NumberOfByte; i++) /* specified bytes as loop */
{
if ((ret=ByteWrite(*(IicData->iic_Data))) == NOACK) /* Write Data */
break; /* NoAck Detect */
IicData->iic_Data++; /* */
}
break;
}
StopCondition(); /* Stop Condition */
return(ret);
}
//-------------------------------------------------------------------------
/********************************************************
Name : StartCondition
Parameters : None
Returns : None
Description : Output Start Condition (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
void StartCondition(void)
{
iic_scl = 0; /* SCL="L" */
iic_scl_d = 1; /* SCL output */
_WaitTime1us(); /* wait *1 */
iic_sda_d = 0; /* SDA="H" */
_WaitTime1us(); /* wait */
_WaitTime1us(); /* wait *! */
iic_scl = 1; /* SCL="H" */
_Wait_tSU_STA; /* wait */
iic_sda = 0; /* SDA="L" */
iic_sda_d = 1; /* SDA output */
_Wait_tHD_STA; /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 0; /* SCL="L" */
}
/********************************************************
Name : StopCondition
Parameters : None
Returns : None
Description : Output Stop Condition (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
void StopCondition(void)
{
iic_scl = 0; /* SCL="L" */
iic_scl_d = 1; /* SCL output */
_WaitTime1us(); /* wait *1 */
iic_sda = 0; /* SDA="L" */
iic_sda_d = 1; /* SDA output */
_WaitTime1us(); /* wait *1 */
iic_scl = 1; /* SCL="H" */
_Wait_tSU_STO; /* wait */
iic_sda_d = 0; /* SDA="H" */
_WaitTime1us(); /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 0; /* SCL="L" */
}
//--------------------------------------------------------
/********************************************************
Name : ByteWrite
Parameters : Write data
Returns : Acknowledge
Description : byte data Output (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
unsigned char ByteWrite(unsigned char iic_writeData)
{
unsigned char maskData = 0x80; /* MSB first */
unsigned char ret = ACK; /* Ack/NoAck */
while (maskData)
{ /* 8times as loop */
iic_sda = 0; /* initialize port-latch */
if (iic_writeData & maskData)
{ /* "H" output ? */
iic_sda_d = 0; /* Yes SDA="H" */
}
else
{
iic_sda_d = 1; /* No SDA="L" */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
}
_Wait_tSU_DAT; /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 1; /* SCL="H" */
_Wait_tHIGH; /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 0; /* SCL="L" */
maskData >>= 1; /* change mask data */
_WaitTime1us(); /* wait *1 */
}
iic_sda_d = 0; /* SDA input */
_Wait_tAA; /* wait */
_WaitTime2us(); /* wait *1 */
iic_scl = 1; /* SCL="H" */
if (iic_sda)
ret=NOACK; /* NoAck Detect */
_Wait_tHIGH; /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 0; /* SCL="L" */
_Wait_tHD_DAT; /* wait */
return(ret);
}
//----------------------------------------------------------
/********************************************************
Name : ByteRead
Parameters : Read data strage location pointer, Select Ack/NoAck
Returns : None
Description : byte data input with Ack output (I2C-BUS)
Note : *1 adjust a wait time
********************************************************/
void ByteRead(unsigned char *iic_readData, unsigned char ackData)
{
unsigned char maskData=0x80; /* MSB first */
unsigned char readData;
*iic_readData = 0; /* */
while (maskData)
{ /* 8times as loop */
readData = *iic_readData | maskData; /* */
iic_sda_d = 0; /* initialize port-latch */
_Wait_tAA; /* wait */
iic_scl = 1; /* SCL="H" */
if (iic_sda)
{ /* SDA="H" ? */
*iic_readData = readData; /* Yes */
}
else{
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
asm("nop"); /* wait *1 */
}
_Wait_tHIGH; /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 0; /* SCL="L" */
maskData >>= 1; /* Change mask data */
_WaitTime1us(); /* wait *1 */
}
if (!ackData)
{ /* Ack output ? */
/* Ack output */
iic_sda = ACK; /* Yes SDA="L" */
iic_sda_d = 1; /* SDA output */
}
else
{
/* NoAck output */
iic_sda = NOACK; /* No SDA="H" */
iic_sda_d = 0; /* SDA input */
}
_Wait_tSU_DAT; /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 1; /* SCL="H" */
//--------------------------------------------------------
_Wait_tHIGH; /* wait */
_WaitTime1us(); /* wait *1 */
iic_scl = 0; /* SCL="L" */
iic_sda_d = 0; /* SDA input */
_WaitTime1us(); /* wait *1 */
}
/********************************************************
Name : _WaitTime0us
Parameters : None
Returns : None
Description : a 0us wait
********************************************************/
void _WaitTime0us(void)
{
;
}
/********************************************************
Name : _WaitTime1us
Parameters : None
Returns : None
Description : a 1us wait
********************************************************/
void _WaitTime1us(void)
{ /* +14cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle = 16cycle */
}
/********************************************************
Name : _WaitTime2us
Parameters : None
Returns : None
Description : a 2us wait
********************************************************/
void _WaitTime2us(void)
{
/* +14cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle */
asm("nop"); /* +1cycle = 32cycle */
}
//--------------------------------------------------------
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?