📄 jl2key.bak
字号:
/* ---------------------------------------------------------- */
/* */
/* IC卡加油机通讯子模块 */
/* 负责键盘与计量主板通讯 */
/* 最后修改日期:2002年5月18日 */
/* */
/* ---------------------------------------------------------- */
#include "D:\comm_d\comm_pub.h"
#include "D:\comm_d\jl2key.h"
#include "reg52.h"
unsigned char data unit_2s;
extern unsigned char idata comm_status;
unsigned char send_jl(unsigned char gun_num,unsigned char command)
{
register unsigned char length,tem;
ES=0;
if(req_bus(gun_num))return(3); // 请求占用总线超时
SOURCE=4; // 置收发数据来源为加油机主板
switch(command)
{
case 0xa0: // 读单价
case 0xa1: // 读提前关阀量
case 0xa2: // 读密度
case 0xa3: // 读预置量
case 0xa4: // 读当次加油量
case 0xa5: // 读当次金额
case 0xa6: // 读加油量班累
case 0xa7: // 读金额班累
case 0xa8: // 读加油量总累
case 0xa9: // 读金额总累
case 0xaa: // 读状态标志位
case 0xab: // 读错误类型
case 0xb5: // 清班累
case 0xc1: // 停止加油
case 0xc2: // 清数
case 0xc3: // 查税控明细
case 0xc8: // 查税控时钟
case 0xca: // 关断电池
length=3; // 命令长度(不包括通讯头)
break;
case 0xc0: // 开始加油
length=3;
break;
case 0xb0: // 写单价
case 0xb2: // 写密度
length=5;
break;
case 0xb1: // 写提前关阀量
case 0xc7: // 税控检定确认
case 0xc9: // 查税控总累计
length=4;
break;
case 0xb3: // 写金额预置量
length=6;
break;
case 0xb4: // 写油量预置量
length=6;
break;
case 0xc5: // 查税控月累计
length=6;
break;
case 0xc4: // 查税控日志
length=7;
break;
case 0xc6: // 设置税控时钟
length=9;
break;
case 0xd0:
length=7;
break;
default:
HAND_WR=1; // 释放总线
return(5); // 无此命令
break;
}
for(tem=length-2;tem>1;tem--)send_buf[tem]=send_buf[tem-2];
send_buf[0]=0xd0|length; // 通讯头
send_buf[1]=gun_num; // 枪号
send_buf[length-1]=command; // 命令码
send_buf[length]=check_jl(length-1,send_buf+1); // 校验和
send(0,length+1);
switch(command)
{
case 0xaa:
case 0xab:
case 0xca:
length=5;
break;
case 0xa0:
case 0xa2:
length=7;
break;
case 0xa1:
length=6;
break;
case 0xa3:
case 0xa4:
case 0xa5:
length=8;
break;
case 0xa6:
case 0xa7:
case 0xa8:
case 0xa9:
length=10;
break;
case 0xc0:
case 0xc1:
case 0xc2:
case 0xc3:
case 0xc4:
case 0xc5:
case 0xc6:
case 0xc7:
case 0xc8:
case 0xc9:
case 0xb5:
case 0xb4:
case 0xb3:
case 0xb2:
case 0xb1:
case 0xb0:
case 0xd0;
length=5;
break;
}
tem=recv(0,length);
if(tem==2 || tem==1) // 超时/奇偶校验错
{
HAND_WR=1; //释放总线
return(tem);
}
tem=rekk[0];
if((tem&0xf0)!=0xd0) // 判断通讯头是否正确
{
BACK: HAND_WR=1;
return(4);
}
if((tem&0xf)!=(length-1))goto BACK; // 长度不对
if(rekk[1]!=gun_num)goto BACK; // 返回枪号与发出者不符
if(rekk[length-2]!=command)goto BACK; // 命令码与发出的不符
tem=check_jl(length-2,rekk+1);
if(rekk[length-1]!=tem)goto BACK; // 校验和错
for(tem=0;tem<length-4;tem++)rekk[tem]=rekk[tem+2]; // 没出错,把数据放在接收缓冲区头
HAND_WR=1;
comm_status=0;
ES=1;
return(0); // 成功返回
}
unsigned char check_jl(unsigned char length,unsigned char xdata *buf)
{
register unsigned char temp,i;
temp=buf[0];
for(i=1;i<length;i++)temp=temp^buf[i];
i=temp>>4;
temp=(temp&0xf)+0x50;
temp^=i;
return(temp);
}
bit req_bus(unsigned char gun_num)
{
register unsigned char i=0;
unit_2s=0; // 2秒计时单元清0
HAND_WR=1; // 处于读状态
LABEL1: if((HAND_RD&0x2)==0x2)i++; // 判断总线状态
else i=0;
if(unit_2s>=100)return(1); // 超时返回
if(i<42)goto LABEL1; // 未检测到500us的总线空闲,继续检测
HAND_WR=0; // 占用总线
if(gun_num==0)return(0); // 0号枪占用总线成功
for(i=0;i<15;i++); // 1号枪延时50us后释放总线
HAND_WR=1;
i=0;
LABEL2: if((HAND_RD&0x2)==0x2)i++;
else goto LABEL1; // 总线被枪0占用(枪0优先级高),继续等待
if(unit_2s>=100)return(1); // 超时返回
if(i<3)goto LABEL2; // 再检测50us,总线空闲,继续检测
HAND_WR=0; // 1号枪占用总线
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -