⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shui_kong.c

📁 加油机源程序代码
💻 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 + -