📄 shui_kong.c
字号:
#include "jyj07.h"
#include "shui_kong.h"
extern byte ram_8255a_c; //8255a_c输出字节
//税务初始化程序,返回初始化状态
//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; //把数组给指针赋值
set_high_skh(); //设置skh状态
tempbit1=0;
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skh(); //读skh状态
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状态
if(tempbit1==1)
{
delay1=10000; //skl为高提前结束
}
}
while(tempbit1==0)
{
error_kind=2;
disp_sk_err(error_kind);
}
calc_shuzu_crc(pskdata); //计算数组的crc值,并赋给最后一个值
data_to_sk4562(pskdata); //通过4562与sk芯片握手
error_kind=check_sk_com(); //检查税控的执行情况
return(error_kind);
}
//设置skh状态
void set_high_skh()
{
P_SKH_SK=1;
}
void set_low_skh()
{
P_SKH_SK=0;
}
//读skh状态
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给税控芯片送数据
void data_to_sk4562(byte *pskdata)
{
byte len;
byte i,j,k,y;
len=*pskdata; //数组第一个值为数组的长度
ram_8255a_c=ram_8255a_c | 0x03; //0000 0011
CS_8255A_C=ram_8255a_c; //税控时钟数据线都置高
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(); //握手线置低
}
//计算数组的crc校验值,并赋值给最后一项
void calc_shuzu_crc(byte *pskdata)
{
byte i,temp0,len;
len=*pskdata-1; //数组的第一项为指令长度
pskdata++; //指向命令码
for(i=0;i<len;i++)
{
temp0=temp0^*pskdata;
pskdata++;
}
*pskdata=temp0; //校验和送到数组最后一项
}
//税务液晶显示自检
void check_display()
{
byte i,j,t_num=0; //显示的段码
byte g_num=0; //显示的枪号
byte *pcheck;
//byte idata check_lcd[13]; //直通显示的数组
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); //发送数组到税务芯片
g_num=1;
check_lcd[2]=g_num;
calc_shuzu_crc(pcheck); //求出校验和
normal_to_sk(pcheck); //发送数组到税务芯片
t_num++;
g_num=0;
}
}
//向税务芯片发送普通数据,并检查税控返回数据
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状态
if(tempbit1==1)
{
delay1=10000; //skl为低提前结束
}
}
while(tempbit1==0) //skl为高错误
{
disp_sk_err(6);
}
data_to_sk4562(pdat);
err_kind=check_sk_com(); //检查指令执行情况
return(err_kind); //err_kind=0 为正确
}
//检查税控指令的执行情况
byte check_sk_com()
{
bit tempbit1;
byte error_kind;
word delay1;
set_low_skh();
//set_high_skh();
tempbit1=read_skh(); //读skh状态
while(tempbit1==1) //
{
tempbit1=read_skh();
}
for(delay1=0;delay1<10000;delay1++)
{
tempbit1=read_skl(); //读skl状态
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状态
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状态
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状态
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 + -