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

📄 main.c

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
* Copyright (c) 2004,成都港顺科技发展有限公司
* All rights reserved.
*
* 编 译 器:uVision 2;Keil:C Compiler:7.20;Assembler:7.10
* 工程名称:POS-Test.UV2
* 文件名称:Main.C
************************************************************************ ********************************
* 摘    要:系统初始化 清除内存 数据保护 字符串转换函数定义  以及“销售”和“系统功能”函数入口
* ********************************************************************************************************
* 单 片 机:uPSD3254
* 当前版本:0.4
* 作    者:李凯
* 完成日期:2004-12-7 14:45
*
* 存储器地址空间分配:
* CSIOP  : PAGE:ALL 256bytes  0x0200-0x02FF
* SRAM   : PAGE:ALL 31.25Kbytes 0x300-0x7FFF
* BOOT0  : PAGE:ALL 32Kbytes 0x0000-0x1FFF  Program Space
* BOOT1  : PAGE:ALL 32Kbytes 0x2000-0x3FFF  Program Space
* BOOT2  : PAGE:ALL 32Kbytes 0x4000-0x5FFF  Program Space
* BOOT3  : PAGE:ALL 32Kbytes 0x6000-0x7FFF  Program Space
* Flash0 : PAGE:0   32Kbytes 0x8000-0xFFFF  Program Space
* Flash1 : PAGE:1   32Kbytes 0x8000-0xFFFF  Program Space
* Flash2 : PAGE:2   32Kbytes 0x8000-0xFFFF  Program Space
* Flash3 : PAGE:3   32Kbytes 0x8000-0xFFFF  Program Space
* Flash4 : PAGE:4   32Kbytes 0x8000-0xFFFF  Program Space
* Flash5 : PAGE:5   32Kbytes 0x8000-0xFFFF  Program Space
* Flash6 : PAGE:6   32Kbytes 0x8000-0xFFFF  Program Space
* Flash7 : PAGE:7   32Kbytes 0x8000-0xFFFF  Program Space
*/

#include "Main.h"

PSD_REGS PSD_REG  _at_  PSD_REG_ADDR;

/*

void reset (void)
{//软件自复位(中断中不能使用)
((void (code *) (void)) 0x0000) ();
}


*/
//void IntSet(uint x)
//{//INT0:bit0 UART2:bit1 Timer0:bit3 I2C:bit4 INT1:bit5 DDC:bit6 Timer1:bit7 USB:bit8 UART1:bit9 Timer2+EXF2:bit10
//  EA=1;
//  EX0=1;
//  if(x & 0x02)IEA |= 0x10;
//  else    IEA &= 0xEF;
//  if(x & 0x04)ET0=1;
//  else    ET0=0;
//  if(x & 0x08)IEA |= 0x02;
//  else    IEA &= 0xFD;
//  if(x & 0x10)EX1=1;
//  else    EX1=0;
//  if(x & 0x20)IEA |= 0x80;
//  else    IEA &= 0x7F;
//  if(x & 0x40)ET1=1;
//  else    ET1=0;
//  if(x & 0x80)IEA |= 0x01;
//  else    IEA &= 0xFE;
//  if(x & 0x100)ES=1;
//  else    ES=0;
//  if(x & 0x200)ET2=1;
//  else    ET2=0;
//}



//mode::bit0=0:按整数转换为字符串;bit0=1:按浮点数转换为字符串     SwitchInt SwitchFloat
//mode::bit1=0:如dat值为0不转换为字符‘0’;bit1=1:如dat值为0则要转换    SwitchZero
//mode::bit2=0:按浮点数转换时如果小数点后全为0,不转换;bit2=1:要转换 SwitchDot
//mode::bit3=0:高位的0不转换;bit3=1:高位的0转换为字符‘ ’(空格)      SwitchSpace
//mode::bit7=0:转换后的字符串加结束符'\0';bit7=1:加空格' '        SwitchEnd
void NumToStr(ulong dat, uchar *str, uchar mode)
{//ulong最大为:4294967295,不超过10位,加小数点和结束符,不超过12位
	uchar i=0,j=0,x;
	ulong k,e=1000000000;

   	if(dat==0)
   	{
   		if(mode & SwitchZero)
   		{
   			str[0]='0';
   			x=1;
   		}
   		else	x=0;
   		
   		if(mode & SwitchEnd)
   			str[x]=' ';
   		else
   			str[x]=0;
   		return;
   	}
   	k=dat;
	while(1)
	{
		x = dat/e;
		if(mode & SwitchSpace)
		{
			str[i] = x + '0';
			i++;
		}
		else
		{		
			if(x!=0 || i!=0)//i!=0是为了保证当最高位之后有的位是0也能够被正常转换
			{
				str[i] = x + '0';
				i++;
			}	
		}	
		if(e==1)break;
		dat = dat%e;
		e /= 10;
	}

	if(mode & SwitchFloat)
	{//按浮点数转换
		if(k>=100)
		{
			if((k%100)!=0 || (mode & SwitchDot))
			{
				str[i]=str[i-1];
				str[i-1]=str[i-2];
				str[i-2]='.';
				if(mode & SwitchEnd)
					str[i+1]=' ';
				else
					str[i+1]=0;
			}
			else
			{
				if((mode & SwitchDot)==0)
				{
					if(mode & SwitchEnd)
					{
						str[i]=str[i-1]=0;
						str[i-2]=' ';
					}
					else
						str[i]=str[i-1]=str[i-2]=0;
				}
			}
		}
		else
		{
			if(k>9)
			{
				str[2]=str[0];
	      		str[3]=str[1];
        		str[0]='0';
        		str[1]='.';
        	}
        	else
        	{
        		str[3]=str[0];
        		str[0]='0';
        		str[1]='.';
        		str[2]='0';
        	}
        	if(mode & SwitchEnd)
				str[4]=' ';
			else
				str[4]=0;
        }
	}
	else
	{
		if(mode & SwitchEnd)
			str[i]=' ';
		else
			str[i]=0;
	}
}



//mode::bit0=0:BCD数组全部为0不转换;bit0=1:要转换为字符'0'
//mode::bit1=0:
//mode::bit2=0:
//mode::bit3=0:
//mode::bit7=0:高位的零不转换;bit7=1:要转换为字符'0'
void BcdToStr(uchar len,uchar *bcd,uchar *str,uchar mode)
//void BcdToStr(uchar len,uchar *bcd,uchar *str)
{//是否考虑将0转换为空格
	uchar i=0,j=0,k=0,f=0,x,first=0;//mode=0;
	
	for(i=0;i<len;i++)
		if(bcd[i]!=0)f=1;
	if((mode&0x01)==0 && f==0)
	{
		str[0]=0;
		return;
	}
//	if(bcd[i]==0 && (mode&0x01)==0)
//	{
//		if(mode & 0x80)str[0]=' ';
//		else	str[0]=0;
//		return;
//	}
	x=mode&0x80;
	for(i=0;i<len;i++)
	{		
		k=bcd[i]>>4;
		if(k!=0)first=1;
		if(k!=0 || first==1 || x)
		{
			if(k > 9)
				str[j]=k-10+'A';
			else					
				str[j]=k+'0';		
			j++;			
		}
		k=bcd[i]&0xf;
		if(k!=0)first=1;
		if(k!=0 || first==1 || x)
		{
			if(k > 9)
				str[j]=k-10+'A';
			else					
				str[j]=k+'0';
			j++;
		}
	}
//	if(mode & 0x80)str[j]=' ';
//	else	
		str[j]=0;
}



void BcdToHex(uchar len,uchar *bcd,uchar *hex)
{//可以用
	uchar i=0,j=0;
	for(i=0;i<len;i++)
	{
		hex[j]=bcd[i]>>4;
		j++;
		hex[j]=bcd[i]&0xf;
		j++;
	}
	return;
}

uchar Verdict(uchar *bcdtime)
{
	uchar flag;
	uchar i=0,Intime[8],day=0,month=0;
	uint  x=0,year=0;
	
	BcdToHex(4,bcdtime,Intime);

	year=Intime[0]*1000+Intime[1]*100+Intime[2]*10+Intime[3];//年
	month=Intime[4]*10+Intime[5];//月
	day=Intime[6]*10+Intime[7];//日
	if(((year%4==0) && (year%100!=0)) || year%400==0) flag=1;//是润年
	else flag=0;
	switch(month)
	{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
					if((day>=1)&&(day<=31))return 1;//月大
					else return 0;
			case 2:
					if(flag)
					{
						if((day>=1)&&(day<=29)) return 1;
						else return 0;
					}
					else
					{
						if((day>=1)&&(day<=28)) return 1;
						else return 0;
					}

			case 4:
			case 6:
			case 9:
			case 11:
					if((day>=1)&&(day<=30))return 1;//月小
					else
						return 0;
			default: return 0;
	}
}





void SysIni()
{
	IE=0;
	IEA = 0;

	DisableCom;			   //关串口

	//DisableCs;					  //打印机中断信号
	WDKEY=0x55;						//Disable Watchdog
	WDRST=0xFF;

	RCAP2H = 0;
	RCAP2L = 0;
	TL1 = 0;
	TH1 = 0;
	PCON = 0;


	P1SFS=0;						//只有高4位有效
	P3SFS=0;						//只有高2位有效
	P4SFS=0;						//Set P4 as General i/o Port




	PSD_REG.CONTROL_A=0;		//sets the port A to MCU I/O Mode
	PSD_REG.DRIVE_A = 0;		//set port A Slew Rate
	PSD_REG.DIRECTION_A &= 0xFB;//set port PA2 input


	PSD_REG.CONTROL_B=0;		//sets the port B to MCU I/O Mode
	PSD_REG.DRIVE_B = 0;		//set port B Slew Rate
	PSD_REG.DIRECTION_B=0xFF;	//set port B output

	PSD_REG.DATAOUT_B = 0xFF;


	PSD_REG.DRIVE_C=0;		
    PSD_REG.DIRECTION_C &= 0x7F;//0:InPUT 1:OUTPUT


	PSD_REG.DIRECTION_D=0x06;	//set Port D output


	RxdNum=0;
	RxdLen=0;
	TxdNum=0;
	TxdLen=0;
	

	TR1=0;TR0=0;
	IT0=0;
	IP=0x01;
	IPA=0;
	IT0=1;
	IT1=1;
	EA = 1;
	IEA = 1;
	EX0=1;
	EX1=0;	

}


void SysFunction()		 //系统功能函数入口
{
	uchar k=1,str[4];
//	gyt4 tp;

	while(1)
	{
		WindowsSet(6);
		strcpy(&WinHint[0][1],"1.报表查询");
		strcpy(&WinHint[1][1],"2.商品管理");
		strcpy(&WinHint[2][1],"3.权限管理");
		strcpy(&WinHint[3][1],"4.税务功能");
		strcpy(&WinHint[4][1],"5.自检");
		strcpy(&WinHint[5][1],"6.测试");



		str[0]=K_TC;
		str[1]=K_HJ;
		str[2]=0;

		k=Windows(k,0,str);

		if(str[0]==K_TC)return;

		switch(k)
		{
			case 	1:
						Report();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -