?? 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 + -