📄 源程序0.c
字号:
/*以下进行数据拼装处理,并发送到主控制器的是压缩的BCD码*/
/*第一参数*/
tmh=buf[0]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[1]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[6]=dat;
tmh=buf[2]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[3]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[7]=dat;
/*第二参数*/
tmh=buf[4]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[5]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[8]=dat;
tmh=buf[6]-0x30;
tmh=tmh&0x0f;
tmh<<=4;
tml=buf[7]-0x30;
tml=tml&0x0f;
dat=tmh|tml;
cantxbuf[9]=dat;
}
/**************************************
通过CAN将设置的参数传送带主控制器函数
***************************************/
void cantransfer(void)
{
uchar i,ljh,itemid=0;
readfromlcd(itemid);
cantxbuf[0]=0x88;
cantxbuf[1]=0;
cantxbuf[2]=TOID;
cantxbuf[3]=0;
cantxbuf[4]=ID;
cantsbuf[5]=0x01;
if(f_yb1)cantxbuf[10]=0x01;
else cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
ljh=ljh+cantxbuf[i];
cantxbuf[11]=ljh;
jx1 :
tdata_can();
while(!recok);
recok=0;
if(huisong)
{
for(i=0;i<13;i++)
cantxbuf[i]=canbuf[i];
trdata_can();
huisong=0;
}
if(canbuf[11]!=ljh)goto jx1;
itemid=1;
readfromlcd(itemid);
cantxbuf[0]=0x88;
cantxbuf[1]=0;
cantxbuf[2]=TOID;
cantxbuf[3]=0;
cantxbuf[4]=ID;
cantxbuf[5]=0x02;
if(f_yb2)cantxbuf[10]=0x01;
else cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
ljh=ljh+cantxbuf[i];
cantxbuf[11]=ljh;
jx2 :
tdata_can();
while(!recok);
recok=0;
if(huisong)
{
for(i=0;i<13;i++)
cantxbuf[i]=canbuf[i];
trdata_can();
huisong=0;
}
if(canbuf[11]!=ljh)goto jx2;
itemid=2;
readfromlcd(itemid);
cantxbuf[0]=0x88;
cantxbuf[1]=0;
cantxbuf[2]=TOID;
cantxbuf[3]=0;
cantxbuf[4]=ID;
cantxbuf[5]=0x03;
if(f_yb3)cantxbuf[10]=0x01;
else cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
ljh=ljh+cantxbuf[i];
cantxbuf[11]=ljh;
f_over=1;
message();
jx3 :
tdata_can();
while(!recok);
recok=0;
if(huisong)
{
for(i=0;i<13;i++)
cantxbuf[i]=canbuf[i];
trdata_can();
huisong=0;
}
if(canbuf[11]!=ljh)goto jx3;
itemid=3;
readfromlcd(itemid);
cantxbuf[0]=0x88;
cantxbuf[1]=0;
cantxbuf[2]=TOID;
cantxbuf[3]=0;
cantxbuf[4]=ID;
cantxbuf[5]=0x02;
if(f_yb4)cantxbuf[10]=0x01;
else cantxbuf[10]=0x00;
ljh=0;
for(i=5;i<=10;i++)
ljh=ljh+cantxbuf[i];
cantxbuf[11]=ljh;
jx4 :
tdata_can();
while(!recok);
recok=0;
if(huisong)
{
for(i=0;i<13;i++)
cantxbuf[i]=canbuf[i];
trdata_can();
huisong=0;
}
if(canbuf[11]!=ljh)goto jx4;
}
/***********************************************
蜂鸣器告警函数
告警类型由参数决定,不同的参数显示不同的错误信息
01:从LCD读取数据转换错误,告警形式为较慢的告警
02:CAN通信错误
03:为压力超量程告警
04:预留
********************************************/
void warnbeep(uchar wtype)
{
uchar i,ttt,j,k;
switch(wtype)
{
case 1: ttt=200;
break;
case 2: ttt=100;
break;
case 3: ttt=10;
break;
case 4: ttt=1;
break;
}
while(1)
{
for(i=0;i<ttt;i++)
for(j=0;j<100;j++)
for(k=0;k<200;k++)
f_beep=1;
message();
for(i=0;i<ttt;i++)
for(j=0;j<100;j++)
for(k=0;k<200;k++)
f_beep=0;
message();
for(i=0;i<ttt;i++)
for(j=0;j<100;j++)
for(k=0;k<200;k++)
f_beep=1;
message();
for(i=0;i<ttt;i++)
for(j=0;j<100;j++)
for(k=0;k<200;k++)
f_beep=0;
message();
if(wtype==3)
break;
}
}
/*******************************
等待液晶写入完成函数(判忙函数)
*********************************/
void wait(void)
{
do
{ACC=LCDCOM_R;} while(BF==1); /*查BF标志*/
}
/***********************
延迟函数
**********************/
void delay(void)
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<100;j++)
}
/******************************************
液晶屏初始化函数
8位总线,4行
输入模式:地址增量,显示屏不动
开光标,并闪
******************************************/
void init_lcd(void)
{ LCDCOM_W=0x38;
delay();
LCDCOM_W=0x38;
delay();
LCDCOM_W=0x38;
delay();
wait();
LCDCOM_W=0x38;
wait();
LCDCOM_W=0x06;
wait();
LCDCOM_W=0x0c;
wait();
LCDCOM_W=0x01;
wait();
}
/**************************************
显示主界面函数
显示格式为:
第1行:B1:XXXX XXXX XXXX X
第2行:B2:XXXX XXXX XXXX X
第3行:B3:XXXX XXXX XXXX X
第4行:B4:XXXX XXXX XXXX X
本函数显示除X以外的其他部分
***************************************/
void display(void)
{
wait();
LCDCOM_W=0x01;
wait();
LCDCOM_W=0x80;
writelcd('B');
writelcd('1');
writelcd(':');
wait();
LCDCOM_W=0xc0;
writelcd('B');
writelcd('2');
writelcd(':');
wait();
writelcd('B');
writelcd('3');
writelcd(':');
wait();
writelcd('B');
writelcd('4');
writelcd(':');
}
/*******************************************
指示控制函数
指示灯或蜂鸣器根据各自的标志位进行开关控制
**********************************************/
void message(void)
{
uchar lout=0xff;
if(f_yb1)
lout=led1;
else
lout=0x01;
if(f_yb2)
lout=led2;
else
lout=0x02;
if(f_yb3)
lout=led3;
else
lout=0x04;
if(f_yb4)
lout=led4;
else
lout=0x08;
if(f_ready)
lout=ledready;
else
lout=0x20;
if(f_over)
lout=ledover;
else
lout=0x40;
if(f_beep)
lout=beepon;
else
lout=beepoff;
LADD=lout;
}
/***************************************************************************
从EEPROM中读取数据
读取数据项参数由ITEMID决定,读取后的数据转化为BCD码临时存入BUFROM缓冲区
前4个字节为下限压力,后4个字节为上限压力
****************************************************************************/
void readeeprom(uchar itemid)
{
uint sadr;
uchar i;
switch(itemid)
{
case 1:
sdar=0x0000;
for(i=0;i<8;i++)
{
buf_rom[i]=readbyte_eeprom(sadr);
sdar++;
}
break;
case 2:
sdar=0x0008;
for(i=0;i<8;i++)
{
buf_rom[i]=readbyte_eeprom(sadr);
sdar++;
}
break;
case 3:
sdar=0x0010;
for(i=0;i<8;i++)
{
buf_rom[i]=readbyte_eeprom(sadr);
sdar++;
}
break;
case 4:
sdar=0x0018;
for(i=0;i<8;i++)
{
buf_rom[i]=readbyte_eeprom(sadr);
sdar++;
}
break;
}
}
/********************************************
从EEPROM读1个字节函数
参数:ADDR为欲读单元地址
函数值:为读出内容
*********************************************/
uchar readbyte_eeprom(uint addr)
{
uchar tt;
WMCON|=EEMEN_;
tt=XBYTE[addr];
WMCON^=EEMEN_;
return(tt);
}
/*******************************************************
写1个字节到EEPROM函数,在失败情况下,重试1次
参数:ADDR为欲写单元地址,VAL为写入内容
函数值:错误标志,=0,表示正确写入;=1,表示不能正确写入
*********************************************************/
bit writebyte_eeprom(uint,uchar val)
{
uchar tt;
WMCON|=EEMEN_;
WMCON|=EEMWE_;
XBYTE[addr]=val;
for(tt=0;tt<10;tt++)
delay 1ms();
tt=XBYTE[addr];
if(tt==val)
{
WMCON^=EEMWE_;
WMCON^=EEMEN_;
return(0);
}
else
{
XBYTE[addr]=val;
for(tt=0;tt<10;tt++)
delay 1ms();
tt=XBYTE[addr];
if(tt==val)
{
WMCON^=EEMWE_;
WMCON^=EEMEN_;
return(0);
}
WMCON^=EEMWE_;
WMCON^=EEMEN_;
return(1);
}
}
/*************************************************
从EEPROM中读取压力上、下限参数并显示
**************************************************/
void displayeeprom(void)
{
uchar i;
readeeprom(1);
for(i=0;i<4;i++)
buf_yl[i]=buf_rom[i];
disp_yl(0x84);
for(i=4;i<8;i++)
buf_yl[i-4]=buf_rom[i];
disp_yl(0x89);
readeeprom(2);
for(i=0;i<4;i++)
buf_yl[i]=buf_rom[i];
disp_yl(0xc4);
for(i=4;i<8;i++)
buf_yl[i-4]=buf_rom[i];
disp_yl(0xc9);
readeeprom(3);
for(i=0;i<4;i++)
buf_yl[i]=buf_rom[i];
disp_yl(0x98);
for(i=4;i<8;i++)
buf_yl[i-4]=buf_rom[i];
disp_yl(0x9d);
readeeprom(4);
for(i=0;i<4;i++)
buf_yl[i]=buf_rom[i];
disp_yl(0xd8);
for(i=4;i<8;i++)
buf_yl[i-4]=buf_rom[i];
disp_yl(0xdd);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -