📄 ceshi.c.bak
字号:
*************************************************************************************/
uchar Check_I2C_Ack()
{
uchar data i=0;
S_Dat=1; // 释放数据线
S_Dat=1;
S_Clk=1; // 保持数据时间,即S_Clk为高,时间大于4.7us
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
FM24_Bit=S_Dat;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
if(FM24_Bit==0)
i=0x00;
else
i=0x01;
return(i);
}
/**************************************************************************************
*
* FUNCTION: Read_I2C_1Byte
*
* DESCRIPTION: 读取FM24C04中当前地址的数据
*
*
* PARAMETERS: none
*
* RETURNED: 读取到的数据
*
*************************************************************************************/
uchar Read_I2C_1Byte()
{
uchar i=0;
uchar RD_data=0;
for(i=0; i<8; i++)
{
S_Dat=1; // 释放数据线
S_Dat=1;
S_Dat=1;
S_Dat=1;
S_Clk=1; // 发送时钟信号
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
FM24_Bit=S_Dat; // 读取数据
S_Clk=0; // 释放时钟信号
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
S_Clk=0;
if(FM24_Bit==1) // 组织数据
RD_data=RD_data|0x01;
else
RD_data=RD_data|0x00;
if(i<7)
RD_data=RD_data<<1;
}
return(RD_data);
}
/**************************************************************************************
*
* FUNCTION: Write_I2C_1Byte
*
* DESCRIPTION: 写一个字节到24
*
*
* PARAMETERS: in: WR_data(等待写入的数据)
*
* RETURNED: none
*
*************************************************************************************/
void Write_I2C_1Byte(uchar WR_data)
{
uchar i=0;
uchar j=0;
for(i=0; i<8; i++)
{
j=WR_data&0x80;
WR_data=WR_data<<1;
if(j==0x80)
FM24_Bit=1;
else
FM24_Bit=0;
S_Dat=FM24_Bit; // 首先发送数据到数据线上
S_Dat=FM24_Bit;
S_Clk=1; // 然后发送时钟信号
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=1;
S_Clk=0; // 最后释放发送时钟信号
S_Clk=0;
S_Clk=0;
S_Clk=0;
}
}
/**************************************************************************************
*
* FUNCTION: Read_FM24_5Byte
*
* DESCRIPTION: 按照指定地址读取FM24C02中连续5个数据(读取到的数据放在read_buf中)
*
*
* PARAMETERS: in: Add_FM24为指定的地址
* out: none
*
* RETURNED: none
*
*************************************************************************************/
void Read_FM24_5Byte(uchar WR_24,uchar Add_FM24)
{
uchar i;
uchar Degree_N1=0;
uchar Degree_N2=0;
uchar Degree_N3=0;
uchar CRC;
EA=0; //禁止总中断
Read_Wait0:
Send_I2C_Start(); //
Write_I2C_1Byte(WR_24); //写入写命令字
Degree_N1++;
if(Check_I2C_Ack()!=0) //==0正确继续
{
if(Degree_N1<3) //三次循环
goto Read_Wait0;
else
goto Exit_Read; //错误退出
}
Write_I2C_1Byte(Add_FM24); //写读数据首地址
Degree_N2++;
if(Check_I2C_Ack()!=0) //
{
if(Degree_N2<3)
goto Read_Wait0;
else
goto Exit_Read;
}
Send_I2C_Start();
Read_Wait1:
Write_I2C_1Byte((WR_24+1)); //写入读命令字
Degree_N3++;
if(Check_I2C_Ack()!=0)
{
if(Degree_N3<3)
goto Read_Wait1;
else
goto Exit_Read;
}
for(i=0; i<5; i++)
{
read_buf[i]=Read_I2C_1Byte();//读一个字节
Send_I2C_Ack(); //应答
}
Exit_Read:
Send_I2C_Stop(); //写停止
CRC=0;
for(i=0; i<4;i++)
CRC+=read_buf[i]; //判断校验和
CRC+='X';
if(read_buf[4]!=CRC) //和错误清0
{
for(i=0;i<4;i++)
read_buf[i]=0x05;
read_buf[4]=5+5+5+5+'X';
}
watchdog_reset=0x9a;
EA=1;
}
/**************************************************************************************
*
* FUNCTION: Write_FM24_nByte
*
* DESCRIPTION: 按照指定地址写入FM24C04中连续n个地址的数据(待写入的数据放在write_buf中)
*
*
* PARAMETERS: in: Add_FM24为指定的地址
* out: none
*
* RETURNED: none
*
*************************************************************************************/
void Write_FM24_5Byte(uchar WR_24,uchar Add_FM24)
{
uchar i;
uchar Degree_N1=0;
uchar Degree_N2=0;
uchar Degree_N3=0;
EA=0;
for(i=0;i<250;i++);
Write_Wait0:
Send_I2C_Start();
Write_I2C_1Byte( WR_24 );
Degree_N1++;
if(Check_I2C_Ack()!=0)
{
if(Degree_N1<3)
goto Write_Wait0;
else
goto Exit_Write;
}
Write_I2C_1Byte( Add_FM24);
Degree_N2++;
if(Check_I2C_Ack()!=0)
{
if(Degree_N2<3)
goto Write_Wait0;
else
goto Exit_Write;
}
for(i=0; i<5; i++)
{
Write_Wait2:
Write_I2C_1Byte( write_buf[i] );
if(Check_I2C_Ack()!=0)
{
Degree_N3++;
if(Degree_N3<3)
goto Write_Wait2;
else
goto Exit_Write;
}
else
{
Degree_N3=0;
}
}
Exit_Write:
Send_I2C_Stop();
EA=1;
}
/**************************************************************************************
*
* FUNCTION: read_cs
*
* DESCRIPTION: 读出全部常数和当前常数序号。
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void read_cs(void)
{
uchar i,j,my_cs;
my_cs=0;
for(i=0;i<10;i++)
{
Read_FM24_5Byte(WR_2402,add_0+(i*0x10));
for(j=0;j<5;j++)
{
constant_all[my_cs]=read_buf[j];my_cs++;
}
}
Read_FM24_5Byte(WR_2402,add_0-0x10);
constant_cn=read_buf[0];
constant_mtr[0]=constant_all[constant_cn*5];
constant_mtr[1]=constant_all[constant_cn*5+1];
constant_mtr[2]=constant_all[constant_cn*5+2];
constant_mtr[3]=constant_all[constant_cn*5+3];
}
/**************************************************************************************
*
* FUNCTION: save_cs
*
* DESCRIPTION: 保存常数和常数序号
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void save_cs(void)
{ uchar i,crc;
crc=0;
for(i=0;i<4;i++)
{
write_buf[i]=constant_mtr[i];
crc+=constant_mtr[i];
}
write_buf[4]=crc+'X';
Write_FM24_5Byte(WR_2402,add_0+(constant_cn*0x10));
for(i=0;i<255;i++) //延时
{
for(crc=0;crc<20;crc++);
}
crc=0;
for(i=0;i<4;i++)
{
write_buf[i]=constant_cn;
crc+=constant_cn;
}
write_buf[4]=crc+'X';
Write_FM24_5Byte(WR_2402,add_0-0x10);
for(i=0;i<255;i++) //延时
{
for(crc=0;crc<20;crc++);
}
}
/**************************************************************************************
*
* FUNCTION: do_key
*
* DESCRIPTION: 按键处理,判断哪个按键按下了
*
* PARAMETERS: none
*
* RETURNED: none
*
*************************************************************************************/
void do_key(void)
{
// uchar i;
if(an_set_left_cn >= 2 )
{
an_set_left_cn=0;
key_time=200;
have_pulse_cn=0;
if(an_start_flag=='D')
{ an_start_flag=0;
check_step=0x00;
}
relay=1;
if(flashing=='F')
{
current_flash_cn++;
if(current_flash_cn>=4)
{current_flash_cn=0;} //循环闪烁
}
else
{flashing='F';current_flash_cn=0;}
}
if(an_set_right_cn >= 2 )
{
an_set_right_cn=0;
key_time=200;
have_pulse_cn=0;
if(an_start_flag=='D')
{ an_start_flag=0;
check_step=0x00;
}
relay=1;
if(flashing=='F')
{
current_flash_cn--;
if(current_flash_cn>=4)
{current_flash_cn=3;} //循环闪烁
}
else
{flashing='F';current_flash_cn=3;}
}
if(an_set_up_cn >= 2 )
{
an_set_up_cn=0;
key_time=200;
have_pulse_cn=0;
if(an_start_flag=='D')
{ an_start_flag=0;
check_step=0x00;
}
relay=1;
if(flashing=='F') //没闪烁时不处理常数位的增减。
{
constant_mtr[current_flash_cn]++;
if(constant_mtr[current_flash_cn]>=0x0A)
{constant_mtr[current_flash_cn]=0;}
}
else
{ constant_all_flag='A';
if( constant_showing=='S')
{constant_cn++;}
else
{ constant_showing='S';}
if(constant_cn>9)
{constant_cn=0;}
constant_mtr[0]=constant_all[constant_cn*5];
constant_mtr[1]=constant_all[constant_cn*5+1];
constant_mtr[2]=constant_all[constant_cn*5+2];
constant_mtr[3]=constant_all[constant_cn*5+3];
}
}
if(an_set_down_cn >= 2)
{
an_set_down_cn=0;
key_time=200;
have_pulse_cn=0;
if(an_start_flag=='D')
{ an_start_flag=0;
check_step=0x00;
}
relay=1;
if(flashing=='F') //没闪烁时不处理常数位的增减。
{
constant_mtr[current_flash_cn]--;
if(constant_mtr[current_flash_cn]>=0x0A)
{constant_mtr[current_flash_cn]=9;}
}
else
{ constant_all_flag='A';
if( constant_showing=='S')
{constant_cn--;}
else
{ constant_showing='S';}
if(constant_cn>9)
{constant_cn=9;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -