📄 function.c
字号:
#include "include.h"
//波特率=fosc/(32×[65536-(RC2H,RC2L)])的公式
uchar code BaudRate[7][2]={ //foc=11.0592 M
{0xfe,0xe0}, //1200bps
{0xff,0x70}, //2400bps
{0xff,0xb8}, //4800bps
{0xff,0xdc}, //9600bps
{0xff,0xee}, //19200
{0xff,0xf4}, //38400bps
{0xff,0xfa}, //57600bps
};
#define yisectorqu 7282 //一扇区能写审计记录的条数
//sbit check_papermask=P3^3;
sbit beep_on=P1^1; //
//uchar xdata Leddata=0x0f;
//==============================================================================
/*void initial_PSD_port(void)
{
//PSD8xx_reg.PAGE|=0x80;
// PSD8xx_reg.DIRECTION_C|=8;
//PSD8xx_reg.DATAOUT_C|=8; //SRAM不片选
PSD8xx_reg.DIRECTION_C|=0x10;
PSD8xx_reg.DATAOUT_C|=0x10;//FLASH不片选
// PSD8xx_reg.PAGE&=0x7f;
}
*/
void initial_system(void)
{
// uchar buf[2];
WDKEY = 0x55;
buzz_off();
InitSoftTimer();
Init_VFD();
InitialLCD();
modify_rate(3);
//initial_PSD_port();
//read_eeprom(TIME_MODE,2,buf);
//time_mode_buf=buf[0];
//Writ_cpld(Sim_rst,1);
//if((time_mode_buf!=0)||(time_mode_buf!=0x20))
}
//=========================================================================
//==========================================================================
#if 0
void feed_on_dot(uchar n)
{
n=0;
}
//===========================================================================
void feed_on_line(uchar n)
{
n=0;
}
#endif
//===========================================================================
/*
uchar fpaper(uchar n)
{
uchar pp,pp1;
PSD8xx_reg.DIRECTION_D&=0xfb;
Turn_On_Printer();
while(n--)
{
pp=1;
while(pp--)
{
counter=0x20;
while(1)
{
if((PSD8xx_reg.DATAIN_D&0x04))
{
pp1=25;
do {} while(--pp1);
if((PSD8xx_reg.DATAIN_D&0x04)) break;
}
if(counter==0) {Turn_Off_Printer(); return 1;}
}
counter=0x20;
while(1)
{
if(!(PSD8xx_reg.DATAIN_D&0x04))
{
pp1=25;
do {} while(--pp1);
if(!(PSD8xx_reg.DATAIN_D&0x04)) break;
}
if(counter==0) {Turn_Off_Printer(); return 1;}
}
}
}
Turn_Off_Printer();
return 0;
}
*/
//============================================================================
void clear_rece_buffer2(void)
{
;
}
//=============================================================================
uchar modify_rate2(uchar rate)
{
modify_rate(rate);
return 0;
}
//===========================================================================
void send_str2(uint length,uchar *buffer)
{
while(length>0)
{
SBUF2=*buffer++;
length--;
do{;}while((SCON2&0x02)==0);
SCON2&=0xfd;
}
}
//==============================================================================
void send_char2(uchar ch)
{
uint i=10000;
SBUF2=ch;
do{i--;}while(((SCON2&0x02)==0)&&(i>0));
SCON2&=0xfd;
}
//============================================================================
uchar rece2(uint length,uchar *buffer)
{
uint i;
while(length>0)
{
i=5000;
do{i--;}while((SCON2&0x01)==0&&(i>0));
if(i==0)return 1;
*buffer=SBUF2;
buffer++;
SCON2&=0xfe;
length--;
}
return 0;
}
//=============================================================================
void send_str(uint length, uchar *buffer)
{
while(length>0)
{
SBUF=*buffer++;
length--;
do{;}while(TI==0);
TI=0;
}
}
//==============================================================================
void modify_rate(uchar rate)
{
uchar i;
i=rate;
//i--;
EA=0;
T2CON=0x30; // Usart 1
PCON|=12; //Usart 2
TH2=BaudRate[i][0];//0xff;
TL2=BaudRate[i][1];//0xdc;
RCAP2H=BaudRate[i][0];// 0xff;
RCAP2L=BaudRate[i][1];// 0xdc;
SCON=0x50; //mode 1: 8bit 1stop 1start
SCON2=0x50;
TR2=1;
EA=1;
}
/*
波特率=fosc/(32×[65536-(RC2H,RC2L)])的公式
*/
//===============================================================================
void clear_rece_buffer(void)
{
;
}
//=============================================================================
uchar rece(uint length,uchar *buffer)
{
uint i;
while(length>0)
{
i=5000;
do{i--;}while((RI==0)&&(i>0));
if(i==0)return 1;
*buffer=SBUF;
buffer++;
RI=0;
length--;
}
return 0;
}
//==============================================================================
void send_char(uchar ch)
{
uint i=5000;
SBUF=ch;
do{i--;}while((TI==0)&&(i>0));
TI=0;
}
//===============================================================================
void select_com(uchar com)
{
com=0;
}
//==================================================================================
void shut_bat(uchar shut) reentrant
{
static uchar lastflg;
//if(low_pwr){Writ_cpld(Backlight,0);lighton=0;}//1?±31a//send_char(0xaa);
if(lastflg!=shut)
{
if(shut==1)SetupPortD(Bat_cnt,0);
else SetupPortD(Bat_cnt,1);
lastflg=shut;
}
}
//===================================================================================
void beep(uchar time)
{
//22.1184M 晶体定时中断为25ms
if(time>25)beepcounter=time/25;
else beepcounter=1;
beepflg=1;
buzz_on();
/*if(time>25)counter=time/25;
else counter=1;
{buzz_on();while(counter>0);}
buzz_off();
*/
}
//===================================================================================
/*void bighx1_a(uchar *buf,uchar *p)
{
;
}
*/
//==================================================================================
void buzz_on(void)
{
beep_on=0; //BUZZER_ON
}
//====================================================================================
void buzz_off(void)
{
beep_on=1;//BUZZER_OFF
}
/***********************************************
延时时间=4[t2(t1+1)+1]*机器周期
机器周期=1.08us 11.0592Mhz
最大延时282Ms
***********************************************/
void delayms(uint t1)
{
uchar t2=10;
uint t;
do
{
t=t1;
while(--t);
t=t1;
while(--t);
}while(--t2);
}
//==============================================
void delay_ms(uchar ms)
{
while(ms--)
delayms(250);
}
//====================================================================
//卡的接收定时用
void delay_etu(void)
{
uchar i;
_nop_();
i=31;
while(--i);
}
//=================================================================
void delay_half_etu(void)
{
uchar i;
i=15; //APDU 2005.10.09
while(--i);
}
//====================================================================
//4-7扇区
//结构:年 月 日 时 分 事件类型 事件结果 用户身份 LRC校验 共9个字节
uchar Write_FAU_data(uchar type,uchar result)//,uchar mode)
{
uchar i,k;
i = type;
k = result;
return 0;
#if 0
uchar buf[10];
uint tempuint;
uchar buf1[2];
ulong addtemp;
//uchar *tempbuf,i,j;//uchar tempbuf[1024],i,j;
uchar i,find=0;
uint temp=0;
//if(Mach_initialed)return 0; //机器未初始化
if(read_eeprom(RECEIVER_NO,2,buf1))return(READ_EEPROM_FAIL);
if(read_rtc(buf)) return(READ_CLOCK_FAIL);//读时钟错误
buf[5]=type;
buf[6]=result;
buf[7]=buf1[0];
buf[8]=lrcdata(8,1,buf);
if(read_eeprom(FAU_Quantity,2,&tempuint))return(READ_EEPROM_FAIL);
if((tempuint==0xffff)||(g_tax_pin_pass==0)) return 0; //机器未初始化
//if(mode)tempuint--; //记录数要倒退
//send_str(2,&tempuint);
if(tempuint<MAX_FAU_QU)
{
addtemp=FAU_DATA_START_ADD+(ulong)9*tempuint;
for(i=0;i<3;i++)
{
temp+=yisectorqu;
if(temp==tempuint)
{
find=1;
break;
}
}
if((find==1)&&(tempuint!=0))
{
addtemp+=7;
if (flash_sector_erase(23+i))
return(ERASE_FLASH_FAIL);
}//删除下一扇区 //每一扇区后7个字节不用
if(write_flash(addtemp,9,buf)){return 0;}//return(WRITE_FLASH_FAIL);
tempuint++;
if(write_eeprom(FAU_Quantity,2,&tempuint))return(WRITE_EEPROM_FAIL);
return 0;
}
else
{
/*if (flash_sector_erase(4))return(ERASE_FLASH_FAIL);//删除最早的一扇区
for(j=5;j<8;j++)
{
for(i=0;i<64;i++)
{
addtemp=(ulong)(0x10000*j)+(uint)(i*1024);
if(read_flash(addtemp,1024,tempbuf)) return READ_FLASH_FAIL;
if (write_flash(addtemp-0x10000,1024,tempbuf)) return(WRITE_FLASH_FAIL);
}
if (flash_sector_erase(j))return(ERASE_FLASH_FAIL);
}
if(flash_sector_erase(7))return(ERASE_FLASH_FAIL);
addtemp=0x70000;
if (write_flash(addtemp,9,buf))return(WRITE_FLASH_FAIL);
tempuint=yisectorqu*3-1;//第7扇区开始21845;
*/
addtemp=FAU_DATA_START_ADD;
if (flash_sector_erase(28))return(ERASE_FLASH_FAIL);//删除最早的一扇区
if (write_flash(addtemp,9,buf))return 0;//return(WRITE_FLASH_FAIL);
tempuint=1;
if(write_eeprom(FAU_Quantity,2,&tempuint))return(WRITE_EEPROM_FAIL);
return 0;
}
#endif
}
//==========================================================================
void openbacklight(void)
{
static uchar lastsecond;
uchar rtc[7];
if(!low_pwr)
{
if(backlightcnt>0)
{
if(!lighton){Writ_cpld(Backlight,1);lighton=1;}
if((!read_rtc(rtc))&&(rtc[4]!=lastsecond)){lastsecond=rtc[4];backlightcnt--;}
}
else if(lighton) {Writ_cpld(Backlight,0);lighton=0;}
}
}
//=================================================================
/*
例:2003年9月16日23点59分
03*1048576+09*65536+16*2048+23*64+59=3769851,转换为"HEX":003985FB
2099年12月31日23点59分表示为063CFDFB
数据还原算法如下:
存储数据以A表示
A mod 1048576=B
B mod 65536=C
C mod 2048=D
则
年=A/1048576,取整数
月=B/65536,取整数
日=C/2048,取整数
时=D/64,取整数
分=D mod 64
*/
void uzip_date(uchar *oldtime,uchar *newtime)
{
uchar buf[5];
uchar x;
ulong timecode;
uchar i;
memcpy((uchar*)&timecode,oldtime,4);
buf[0]=timecode/1048576;
buf[1]=(timecode%1048576)/65536;
buf[2]=((timecode%1048576)%65536)/2048;
buf[3]=(((timecode%1048576)%65536)%2048)/64;
buf[4]=(((timecode%1048576)%65536)%2048)%64;
for(i=0;i<5;i++)
{
x=buf[i];
buf[i]=((x/10)<<4)|(x%10);
}
memcpy(newtime,buf,5);
}
//=================================================================
void zip_date(uchar *oldtime,uchar *newtime)
{
// uchar buf[5];
ulong timecode;
uchar x;
x=(oldtime[0]>>4)*10+(oldtime[0]&0x0f);
timecode=(ulong)x*1048576;
x=(oldtime[1]>>4)*10+(oldtime[1]&0x0f);
timecode+=(ulong)x*65536;
x=(oldtime[2]>>4)*10+(oldtime[2]&0x0f);
timecode+=(ulong)x*2048;
x=(oldtime[3]>>4)*10+(oldtime[3]&0x0f);
timecode+=(ulong)x*64;
x=(oldtime[4]>>4)*10+(oldtime[4]&0x0f);
timecode+=x;
memcpy(newtime,(uchar*)&timecode,4);
}
//==============================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -