?? shui_kong.c
字號:
#include "jyj07.h"
#include "shui_kong.h"
extern byte ram_8255a_c; //8255a_c輸出字節(jié)
//稅務初始化程序,返回初始化狀態(tài)
//0:初始化正常,1:
byte shuiwu_init()
{
byte err_type;
wait_sk_ready();
if(err_type==0)
{
err_type=hand_to_sk();
}
else
{
return(err_type);
}
if(err_type==0)
{
check_display();
}
return(err_type);
}
//*********************HAND_TO_SK***************
//功能: 和稅控芯片握手,初始化稅控芯片工作方式
byte hand_to_sk()
{
word delay1;
bit tempbit1;
byte error_kind=0;
byte idata sk_hand_data[7]={0x06,0xa0,0xa3,CHUAN_BING,0,0,0};
byte *pskdata;
pskdata=sk_hand_data; //把數(shù)組給指針賦值
set_high_skh(); //設置skh狀態(tài)
tempbit1=0;
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skh(); //讀skh狀態(tài)
if(tempbit1==1)
{
delay1=10000; //skh為高提前結束
}
set_high_skh();
} //skh為低說明沒準備好
while(tempbit1==0)
{
error_kind=1;
disp_sk_err(error_kind);
}
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skl(); //讀skl狀態(tài)
if(tempbit1==1)
{
delay1=10000; //skl為高提前結束
}
}
while(tempbit1==0)
{
error_kind=2;
disp_sk_err(error_kind);
}
calc_shuzu_crc(pskdata); //計算數(shù)組的crc值,并賦給最后一個值
data_to_sk4562(pskdata); //通過4562與sk芯片握手
error_kind=check_sk_com(); //檢查稅控的執(zhí)行情況
return(error_kind);
}
//設置skh狀態(tài)
void set_high_skh()
{
P_SKH_SK=1;
}
void set_low_skh()
{
P_SKH_SK=0;
}
//讀skh狀態(tài)
bit read_skh()
{
bit tempbit;
tempbit=P_SKH_SK;
return(tempbit);
}
//讀skl值
bit read_skl()
{
bit tempbit;
tempbit=0x01&CS_8255B_C; //8255b c口的最低位
return(tempbit);
}
//顯示稅控錯誤信息
void disp_sk_err(byte error_kind)
{
}
//通過4562給稅控芯片送數(shù)據(jù)
void data_to_sk4562(byte *pskdata)
{
byte len;
byte i,j,k,y;
len=*pskdata; //數(shù)組第一個值為數(shù)組的長度
ram_8255a_c=ram_8255a_c | 0x03; //0000 0011
CS_8255A_C=ram_8255a_c; //稅控時鐘數(shù)據(jù)線都置高
for(i=0;i<len;i++)
{
k=0x01; //0000 0001
for(j=0;j<8;j++)
{
y=k & *pskdata;
if(y==0)
{
ram_8255a_c=ram_8255a_c & 0xfe;
}
else
{
ram_8255a_c=ram_8255a_c | 0x01;
}
CS_8255A_C=ram_8255a_c; //送出一位
ram_8255a_c=ram_8255a_c & 0xfd; //1111 1101
CS_8255A_C=ram_8255a_c;
ram_8255a_c=ram_8255a_c | 0x02; //0000 0010
CS_8255A_C=ram_8255a_c; //一個上升沿
k=k<<1; //k左移一位
}
pskdata++;
}
set_low_skh(); //握手線置低
}
//計算數(shù)組的crc校驗值,并賦值給最后一項
void calc_shuzu_crc(byte *pskdata)
{
byte i,temp0,len;
len=*pskdata-1; //數(shù)組的第一項為指令長度
pskdata++; //指向命令碼
for(i=0;i<len;i++)
{
temp0=temp0^*pskdata;
pskdata++;
}
*pskdata=temp0; //校驗和送到數(shù)組最后一項
}
//稅務液晶顯示自檢
void check_display()
{
byte i,j,t_num=0; //顯示的段碼
byte g_num=0; //顯示的槍號
byte *pcheck;
//byte idata check_lcd[13]; //直通顯示的數(shù)組
byte idata check_lcd[13]={0x0c,0xa4,0,0,0,0,0,0,0,0,0,0,0};
pcheck=check_lcd;
for(i=0;i<16;i++)
{
check_lcd[2]=g_num;
for(j=3;j<11;j++)
{
check_lcd[j]=t_num;
}
calc_shuzu_crc(pcheck); //求出校驗和
normal_to_sk(pcheck); //發(fā)送數(shù)組到稅務芯片
g_num=1;
check_lcd[2]=g_num;
calc_shuzu_crc(pcheck); //求出校驗和
normal_to_sk(pcheck); //發(fā)送數(shù)組到稅務芯片
t_num++;
g_num=0;
}
}
//向稅務芯片發(fā)送普通數(shù)據(jù),并檢查稅控返回數(shù)據(jù)
byte normal_to_sk(byte *pdat)
{
word delay1;
bit tempbit1;
byte err_kind;
set_high_skh();
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skl(); //讀skl狀態(tài)
if(tempbit1==1)
{
delay1=10000; //skl為低提前結束
}
}
while(tempbit1==0) //skl為高錯誤
{
disp_sk_err(6);
}
data_to_sk4562(pdat);
err_kind=check_sk_com(); //檢查指令執(zhí)行情況
return(err_kind); //err_kind=0 為正確
}
//檢查稅控指令的執(zhí)行情況
byte check_sk_com()
{
bit tempbit1;
byte error_kind;
word delay1;
set_low_skh();
//set_high_skh();
tempbit1=read_skh(); //讀skh狀態(tài)
while(tempbit1==1) //
{
tempbit1=read_skh();
}
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skl(); //讀skl狀態(tài)
if(tempbit1==0)
{
delay1=10000; //skl為低提前結束
}
}
while(tempbit1==1) //skl為高錯誤
{
error_kind=3;
disp_sk_err(error_kind);
}
set_high_skh();
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skh(); //讀skh狀態(tài)
if(tempbit1==1)
{
delay1=10000; //skh為高提前結束
}
set_high_skh();
} //skh為低說明沒準備好
while(tempbit1==0)
{
error_kind=4;
disp_sk_err(error_kind);
}
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skl(); //讀skl狀態(tài)
if(tempbit1==1)
{
delay1=10000; //skl為低提前結束
}
}
while(tempbit1==0) //skl為高錯誤
{
error_kind=5;
disp_sk_err(error_kind);
}
return(error_kind);
}
//等待稅控芯片準備好
void wait_sk_ready()
{
bit tempbit1;
set_high_skh();
tempbit1=read_skh(); //讀skh狀態(tài)
while(tempbit1!=1)
{
tempbit1=read_skh();
}
tempbit1=read_skl();
while(tempbit1!=1)
{
tempbit1=read_skl();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -