📄 g1.c.bak
字号:
case pwr1: //Prmter1.PWR1BC=TEMP(11);
//*P1++ = Prmter1.PWR1+Prmter1.PWR1BC;
*P++ = Prmter1.PWR1;
length --;
break;
case pwr1u: *P++ = Prmter1.PWR1U;
*P++ = 0;
length = length - 2;
break;
case pwr2: //Prmter1.PWR2BC=TEMP(12);
//*P1++ = Prmter1.PWR2+Prmter1.PWR2BC;
*P++ = Prmter1.PWR2;
length--;
break;
case pwr2u: *P++ = Prmter1.PWR2U;
*P++ = 0;
length = length - 2;
break;
case id1: *P++ = Prmter1.ID1;
*P++ = 0;
length = length -2;
break;
case id1u: *P++ = Prmter1.ID1U;
*P++ = 0;
length = length -2;
break;
case id2: *P++ = Prmter1.ID2;
*P++= 0;
length = length -2;
break;
case id2u: *P++ = Prmter1.ID2U;
*P++ = 0;
length = length -2;
break;
case id3: *P++ = Prmter1.ID3;
*P++ = 0;
length = length -2;
break;
case id3u: *P++ = Prmter1.ID3U;
*P++ = 0;
length = length -2;
break;
case id4: *P++ = Prmter1.ID4;
*P++ = 0;
length = length -2;
break;
case id4u: *P++ = Prmter1.ID4U;
*P++ = 0;
length = length -2;
break;
case id1st: *P++= Prmter1.ID1ST;
length--;
break;
case id2st: *P++ = Prmter1.ID2ST;
length--;
break;
case freq1_state: *P++ = Prmter1.PLL_STATE1;
length--;
break;
case freq3_state: *P++ = Prmter1.PLL_STATE3;
length--;
break;
default: receive_buf[8] = *--P;
receive_buf[7] = *--P;
if(receive_buf[5]==0xc1)//设置命令
{
erro = erro | 0x02;
}
else
{
erro = erro | 0x01;
}
length = 0;
break;//特殊处理
}
}
if(erro & 0x02)
{
length = 2;//设置参数失败
}
else if(erro & 0x01)
{
length = 2;//查询参数失败
}
else
{
length = receive_cnt-10;//命令体长度
}
return length;
}
/**********************************************************
** 功能说明: 发送参数函数
** 输入参数: 类型: uchar 应答标志位
类型: uchar 命令体的长度
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/01/11
*********************************************************/
void send_reply_flag(uchar reply_flag,uchar length)
{
auto uchar start,i;
//receive_buf[7] = length;
receive_buf[6] = reply_flag;
start = 1; //CRC校验
length = length + 6;
CheckCRC(receive_buf,length,start,pChecksum);
receive_buf[length + 1] = pChecksum[0];
receive_buf[length + 2] = pChecksum[1];
length = length + 3;//加上校验字节(2BYTE),再加一个字节,就为包的总长度-1
receive_buf[length] = 0x4e;//最后一个字节是包尾
portd_wbuf = portd_wbuf | 0x10; //485发送使能
PORTD = portd_wbuf;
TXEN = 1; //USART 使能
delay_unit(2000);
length = length + 1;
for(i = 0;i < length;i ++)
{
if((i==0)||(i==(length-1)))
{
TXREG = receive_buf[i];
}
else if(receive_buf[i]==0x5e)
{
TXREG = 0x5e;
receive_buf[i]=0x5d;
i--;
}
else if(receive_buf[i]==0x4e)
{
TXREG = 0x5e;
receive_buf[i]=0x4d;
i--;
}
else
{
TXREG = receive_buf[i];
}
while(TRMT == 0)
{
;
}
}
delay_unit(1000);
TXEN = 0;
portd_wbuf = portd_wbuf & 0xef;
PORTD = portd_wbuf;
headend_flag=0x00;
return;
}
/**********************************************************
** 功能说明: CRC校验函数
** 输入参数: 类型: uchar* 须校验的数组
类型: uchar 命令体的长度
类型: uchar 开始位置
类型: uchar* 校验配置表
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 李承胜 创建时间:不详
*********************************************************/
void CheckCRC(uchar *pData, uchar length,uchar start, uchar *pChecksum)
{
auto uchar i = 0;
auto uint checksum = 0;
for(i = 0;i < length;i ++)
{
checksum = ( checksum << 8) ^ CRCTable[( checksum >> 8 ) ^ pData[i + start]];
}
pChecksum[0] = checksum % 256;
pChecksum[1] = checksum / 256;
return;
}
/**********************************************************
** 功能说明: 接受数据数组的初始化
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void receive_free()
{
auto uchar i;
for(i = 0; i < BUF_LENGTH; i ++)
{
receive_buf[i] = 0;
}
return;
}
/**********************************************************
** 功能说明: 对sda端口进行赋值
** 输入参数: buf 类型:uchar :0或1
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void sda(uchar buf)
{
if(buf)
{
portc_wbuf = portc_wbuf | 0x04;
PORTC = portc_wbuf;
}
else
{
portc_wbuf = portc_wbuf & 0xfb;
PORTC = portc_wbuf;
}
}
/**********************************************************
** 功能说明: 对scl端口进行赋值
** 输入参数: buf 类型:uchar :0或1
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void scl(uchar buf)
{
if(buf)
{
portd_wbuf = portd_wbuf | 0x02;
PORTD = portd_wbuf;
}
else
{
portd_wbuf = portd_wbuf & 0xfd;
PORTD = portd_wbuf;
}
}
/**********************************************************
** 功能说明: 读eeprom的值
** 输入参数: addr 类型:uint :读数的地址
** 输出参数: buf 类型:uchar :读出的数据
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
uchar rrom(uint addr)
{
uchar buf;
union buf_union comm;
RCIE=0;
CREN=0;
T1CON=0x00;
dog();
comm.buf1 = addr;
_nop();
iic_stop();
iic_star();
iic_send((comm.buf2[1] <<1)| 0xa0);
iic_ack();
iic_send(comm.buf2[0]);
iic_ack();
iic_star();
iic_send((comm.buf2[1] <<1)|0xa1);
iic_ack();
buf = iic_get();
iic_stop();
T1CON=0x31;
// CREN=0;
CREN=1;
RCIE=1;
receive_time_on = 0;
receive_time_count = 0;
receive_over = 0;
tran_flag=0x00;
headend_flag=0x00;
// receive_cnt = 0;
return buf;
}
/**********************************************************
** 功能说明: 写eeprom
** 输入参数: addr 类型:uchar :写数据的地址
buf 类型:uchar :读出的数据
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void wrom(uint addr,uchar buf)
{
uchar ubuf;
uchar wcount;
union buf_union comm;
RCIE=0;
CREN=0;
T1CON=0x00;
wcount = 0;
dog();
comm.buf1 = addr;
iic_write_re:
if( wcount > 4 )
{
iic_stop();
_nop();
wcount = 0;
err_eeprom = 1;
T1CON=0x31;
// CREN=0;
CREN=1;
RCIE=1;
return ;
}
_nop();
iic_star();
iic_send((comm.buf2[1]<<1) | 0xa0);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_send(comm.buf2[0]);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_send(buf);
ubuf = iic_ack();
if(ubuf)
{
wcount++;
_nop();
goto iic_write_re;
}
iic_stop();
T1CON=0x31;
CREN=1;
RCIE=1;
return ;
}
/**********************************************************
** 功能说明: 延时函数
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_delay()
{
uchar a;
for(a = 0; a < IIC_DELAY ; a++ )
{
asm("NOP");
}
}
/**********************************************************
** 功能说明: 操作eeprom时发起始命令
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_star()
{
TRISD1 = 0;
TRISC2 = 0;
scl(1);
sda(1);
// _nop();
sda(0);
scl(0);
_nop();
}
/**********************************************************
** 功能说明: 操作eeprom完成时发结束命令
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_stop()
{
TRISD1 = 0;
TRISC2 = 0;
sda(0);
scl(1);
_nop();
sda(1);
_nop();
scl(1);
_nop();
}
/**********************************************************
** 功能说明: 发数据给eeprom
** 输入参数: buf 类型:uchar :需要发送的数据
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void iic_send(uchar buf)
{
uchar i;
TRISD1 = 0;
TRISC2 = 0;
for(i = 0 ; i < 8 ;i++)
{
if( buf & 0x80 )
{
sda(1);
}
else
{
sda(0);
}
_nop();
scl(1);
//_nop();
scl(0);
//_nop();
buf = buf << 1;
}
}
/**********************************************************
** 功能说明: 从eeprom获取数据
** 输入参数:
** 输出参数: buf 类型:uchar :获取的数据
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
uchar iic_get()
{
uchar i,buf;
buf = 0x00;
TRISD1 = 0;
TRISC2 = 1;
for(i = 0 ; i < 8 ;i++)
{
scl(1);
_nop();
buf = buf <<1;
if(PORTC & 0x04)
{
buf = buf|0x01;
}
scl(0);
_nop();
}
return buf;
}
/**********************************************************
** 功能说明: eeprom回应命令体
** 输入参数: buf 类型:uchar :0响应/1无响应
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
uchar iic_ack()
{
uchar buf;
TRISD1 = 0;
TRISC2 = 1;
sda(1);
_nop();
scl(1);
if(PORTC & 0x04)
buf = 1;
else
buf = 0;
scl(0);
_nop();
TRISC2 = 0;
_nop();
return buf;
}
/**********************************************************
** 功能说明: 收到数据发出响应
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 汤勇 创建时间:2004-11-16
***********************************************************/
void ack_iic(uchar buf)
{
if(buf == 0)
{
sda(0);
}
else
{
sda(1);
}
_nop();
scl(1);
_nop();
scl(0);
_nop();
}
/**********************************************************
** 功能说明: 中断处理子程序(包括接收中断、定时器中断)
** 输入参数:
** 输出参数:
** 返 回 值: 无
** 引用函数:
** 创 建 人: 陈璐 创建时间:2005/12/27
*********************************************************/
void interrupt int_process(void)
{
auto uchar i;
// uchar buf;
if(RCIF == 1) //USART接收中断标志位为1
{
if(portd_wbuf&0x10)//如果处于发送状态,返回主程序,不处理缓冲区中的数据
{
return;
}
if(receive_over == 1 )//如果接收完成标志为1,则接收完成,不再接收数据.
{
return;
}
if(receive_cnt > 79)//接收缓冲超过80个字节时,就为溢出,将接收缓冲重新计数
{
receive_time_on = 0;//接收超时定时器开关关闭
receive_time_count = 0;//接收超时定时计数器清零
receive_cnt = 0;//发送或接收
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -