📄 main.c
字号:
{
if(++remote_fault_count>10)
{
remote_fault_count=0;
old_dis_number=dis_number;
ComunicationFault();
remote_build();
dis_number=old_dis_number;
// key=nokey;
// display();
}
write_rebuf_p=RxdPointBak;
goto again;
}
else
{
value_message_count++;//报文计数加一
remote_fault_count=0;
}
}
}
void WriteData(void)
{
again:
if(program_state==1) return;
trbuf[0]=address_device;
trbuf[1]=0x06;
trbuf[2]=set_addh;
trbuf[3]=set_addl;
trbuf[4]=set_valueh;
trbuf[5]=set_valuel;
TxdLength=6;//实际发送缓存有效长度
receive_byte_number=8; //06功能码接收总字节数
RemoteTypeBak=1;
crc_account(); //crc计算
Txded_Number=0; //发送缓存读计数清零,接收缓存清零在发送结束时清零. //发送缓存读计数清零
Current_Message_End=1;
REN=0; //启动发送 //起动输出
CLK=1;
RI=0;
SBUF=trbuf[0];
WaitTime=0;
//Current_Message_End=0;//for debug
while((Current_Message_End!=0)&&(WaitTime<100))
WD_SDA=~WD_SDA;
if(Current_Message_End!=0)
{
if(++remote_fault_count>5)
{
remote_fault_count=0;
old_dis_number=dis_number;
ComunicationFault();
remote_build();
dis_number=old_dis_number;
// key=nokey;
// display();
}
goto again;
}
else
remote_fault_count=0;
}
/*
void WriteOrder(void)
{
//数据打包
unsigned j;
again:
trbuf[0]=address_device;
trbuf[1]=0x06;
for(j=0;j<4;j++)
{
trbuf[j+2]=*(read_order_p+j); //[行][列]*(p+i*long_dis_message+j)
}
TxdLength=6;//用于计算效验码 ,在计算完后加二形成发送长度.
crc_account();
Txded_Number=0;
receive_byte_number=8; //报文接收字节数
RemoteTypeBak=0; //当前交互报文类型
Current_Message_End=1;
REN=0; //启动发送 //起动输出
CLK=1;
RI=0;
SBUF=trbuf[0];
WaitTime=0;
while((Current_Message_End!=0)&&(WaitTime<100))
WD_SDA=~WD_SDA;
if(Current_Message_End!=0)
{
if(++remote_fault_count>5)
{
remote_fault_count=0;
old_dis_number=dis_number;
ComunicationFault();
remote_build();
dis_number=old_dis_number;
// key=nokey;
// display();
}
goto again;
}
else
remote_fault_count=0;
}*/
void GetState(void)
{
again:
if((program_state==1)||(alone_user==1)) return;//编程状态或单机模式
trbuf[0]=address_device;
trbuf[1]=state_message_tab[0];
trbuf[2]=state_message_tab[1];
trbuf[3]=state_message_tab[2];
trbuf[4]=state_message_tab[3];
trbuf[5]=state_message_tab[4];
TxdLength=6;
receive_byte_number=5 + trbuf[5] * 2;
RemoteTypeBak=4;
write_rebuf_p=union_state.state_buf;
crc_account();
Current_Message_End=1;
Txded_Number=0;
REN=0; //启动发送 //起动输出
CLK=1;
RI=0;
SBUF=trbuf[0];
WaitTime=0;
//Current_Message_End=0;//for debug
while((Current_Message_End!=0)&&(WaitTime<200))
WD_SDA=~WD_SDA;
//Current_Message_End=0;//for debug
if(Current_Message_End!=0)
{
if(++remote_fault_count>5)
{
remote_fault_count=0;
old_dis_number=dis_number;
ComunicationFault();
remote_build();
dis_number=old_dis_number;
// key=nokey;
// display();
}
goto again;
}
else
remote_fault_count=0;
}
/********************************************************************
*
* 名称: crc_account
* 说明: 根据发送缓存使用长度,计算并添加其crc.
更新使用长度值,read_trbuf_p (读取发送缓存指针)保持原值.
* 功能: CRC 计算
* 调用:
* 输入: 全局变量
* 返回值: 无,
***********************************************************************/
void crc_account(void)
{ //TxdLength为要校验的字节数
idata union{
uint wordd;
uchar charr[2];
}crcreg; //crc寄存器
idata uchar temp1,i=0,j;
uint da;
crcreg.wordd=0xffff;
do //所有参加计算字节的循环
{
temp1=trbuf[i]; //(read_trbuf_p=rebuf)
crcreg.wordd^=temp1; //nnn高8位无影响?
for(j=0;j<8;j++) //一个字节的8次移位循环
{
da=crcreg.wordd;
crcreg.wordd>>=1;
if(da&0x0001) crcreg.wordd^=CRC; //移出前最低位判断(define CRC 0xa001)
}
i++;
}
while(i<TxdLength); //参加crc计算的字节完毕
trbuf[i]=crcreg.charr[1];
crch_bak=crcreg.charr[0]; //低字节
i++;
trbuf[i]=crcreg.charr[0];
crcl_bak=crcreg.charr[1]; //高字节
TxdLength+=2;
}//crc_account
/********************************************************************
*
* 名称: uart_interrupt
* 说明: 串口发送中断:未取完成则取指针++,填下一个需发送字节
接收:存数据,计数,存指针++
接收完成后,置单条报文完成标志item_end=0;
* 功能: 串口中断
* 调用:
* 输入: 全局变量
* 返回值: 无
***********************************************************************/
void uart_interrupt (void) interrupt 4 using 1
{
idata uchar rechar,j;
uint da;
//WDTRST=0x1e;
//WDTRST=0xe1;
if(TI)
{
TI=0;
if(Current_Message_End==0)
return;
if(++Txded_Number>=TxdLength)
{
//抑制循环nnn,使能接收中断
CLK=0;
rebuf_write_count=0; //初始化接收缓存计数器
Txded_Number=0;
REN=1;
}
else
SBUF=trbuf[Txded_Number]; //发送的第一个字节由通讯控制程序写入
}
if(RI)
{
rechar=SBUF;
RI=0;
// if(remote_sign_program_state==1) return;//编程器连接,则交出通讯权nnn
if (Current_Message_End==0)
return;
if(remote_type_address==1)
{//特殊指令接收
rebuf_write_count++;
if(rebuf_write_count==1||rebuf_write_count==4)
{
if(rechar!=0x68)rebuf_write_count=0;//改变波特率重试,重记数
return;
}
if(rebuf_write_count==2)
address_device=rechar; //保存设备地址
if(rebuf_write_count==3) //验证设备地址
{
if(rechar!=address_device)rebuf_write_count=0;//改变波特率重试,重记数
return;
}
if(rebuf_write_count==5)
{//特殊报文校验码接收nnn
if(rechar==((address_device*2+0xd0)%256))
{
remote_type_address=0;
remote_sign_built=1; //特殊报文校验码,通讯建立,
alone_user=0; //联机模式---唯一此处能转工作模式
REN=0;
CLK=1;
RI=0;
}
}
return;
}//特殊指令接收
//以下为标准协议指令接收
if(rebuf_write_count==0) //读第一字节
{
if(rechar!=address_device) return; //普通报文地址校对
recrc.recrc_int=0xffff; //初始化接收CRC初值
}
rebuf_write_count++;
//接收缓存写计数++
if(rebuf_write_count>receive_byte_number-2)
{//>接收crc
if(rebuf_write_count>receive_byte_number-1)
{//crch效验
if(rechar==recrc.recrc[0])
{//=接收crch
//CRC正确,指令和状态接收结束
Current_Message_End=0; //条报文完成标志仅由通讯程序置位
remote_fault_count=0;
switch (RemoteTypeBak)
{
case 0:remote_type_order=0;
break;
case 1: remote_type_set=0;
break;
case 3: break;
default:break;
}
REN=0;
CLK=1;
RI=0;
}//CRC正确
else
{
REN=0;
CLK=1;
RI=0;
}
return;
}
else
{//crcl效验
if(rechar!=recrc.recrc[1])
{
REN=0;
CLK=1;
RI=0;
}
return;
}
}//>接收crc
else
{//<=接收crc外其他字节
//接收校验码计算
recrc.recrc_int^=rechar;
for(j=0;j<8;j++)
{
da=recrc.recrc_int;
recrc.recrc_int>>=1;
if(da&0x0001)recrc.recrc_int^=CRC;
}
if((RemoteTypeBak==0)||(RemoteTypeBak==1)) return; //指令
{
if(rebuf_write_count>3)
{*write_rebuf_p=rechar;
write_rebuf_p++;
}
}
}//<=接收crc外其他字节
}//if(RI)
}//uart_interrupt
/*--------------------------------------- 通讯控制程序结束 ----------------------------------------*/
//----------s---------
void menu_main_control()
{
switch(key)
{
case nokey:
clr_fullscreen();
if(arrow_state1%2==0)
lcdwrite(3,115,6,&arrow);
if(arrow_state1%2==1)
lcdwrite(1,115,6,&arrow);
if(SuperUser==1)
{
switch(arrow_state1/2)
{
case 0:
lcdwrite_chinese(2,4,13,&xi);
lcdwrite_chinese(2,17,13,&shu);
lcdwrite_chineseN(2,30,2,&jiao);
lcdwrite_chineseN(0,4,4,&xinhaoceliang);
break;
case 1:
lcdwrite_chineseN(2,4,2,&bao);
lcdwrite_chineseN(2,30,2,&cha);
lcdwrite_chineseN(0,4,4,&gu);
break;
case 2:
lcdwrite_chineseN(2,4,2,&guan);//管理
lcdwrite_chineseN(2,30,2,&xinhao);//信息
lcdwrite_chinese(0,4,9,&hanD);
lcdwrite_chinese(0,13,4,&hanI);
lcdwrite_chinese(0,17,10,&xiexian);
lcdwrite_chinese(0,27,9,&hanD);
lcdwrite_chinese(0,36,9,&hanO);
lcdwrite_chineseN(0,45,2,&zhuang);
lcdwrite_chineseN(0,71,2,&cha);
break;
case 3:
//lcdwrite_chineseN(2,4,4,&tongxun);
lcdwrite_chineseN(2,4,6,&baohu);//保护定值设置
if(union_state.state_buf[11]==protect)//保护模式
{
lcdwrite_chineseN(0,4,2,&xi);//系统
lcdwrite_chineseN(0,30,4,&can);//参数
}
else
{
lcdwrite_chineseN(0,4,2,&qidong);//起动
lcdwrite_chineseN(0,30,4,&can);//参数
}
break;
case 4:
//lcdwrite_chineseN(2,4,2,&qidong);
//lcdwrite_chineseN(2,30,4,&can);
if(union_state.state_buf[11]==protect)//保护模式 ,此下重定义光标号意义
{
lcdwrite_chinese(2,4,13,&shuchu);
lcdwrite_chinese(2,17,13,&ru);
lcdwrite_chineseN(2,30,2,&shuchu);
lcdwrite_chineseN(2,56,2,&pei);
}
else
{
lcdwrite_chineseN(2,4,2,&xi);
lcdwrite_chineseN(2,30,4,&can);
lcdwrite_chinese(0,4,13,&shuchu);
lcdwrite_chinese(0,17,13,&ru);
lcdwrite_chineseN(0,30,2,&shuchu);
lcdwrite_chineseN(0,56,2,&pei);
}
break;
// case 5:
// lcdwrite_chinese(2,4,13,&shuchu);
// lcdwrite_chinese(2,17,13,&ru);
// lcdwrite_chineseN(2,30,2,&shuchu);
// lcdwrite_chineseN(2,56,2,&pei);
// break;
}
}
else
{
if(arrow_state1==8)
arrow_state1=6;
if(arrow_state1==9)
arrow_state1=7;
switch(arrow_state1/2)
{
case 0:
lcdwrite_chineseN(2,4,4,&xinhaoceliang);
lcdwrite_chineseN(0,4,2,&bao);
lcdwrite_chineseN(0,30,2,&cha);
break;
case 1:
lcdwrite_chineseN(2,4,4,&gu);
lcdwrite_chineseN(0,4,2,&guan);//管理
lcdwrite_chineseN(0,30,2,&xinhao);//信息
break;
case 2:
lcdwrite_chinese(2,4,9,&hanD);
lcdwrite_chinese(2,13,4,&hanI);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -