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

📄 global_function.h

📁 嵌入式单片机开发,嵌入式单片机开发,嵌入式单片机开发
💻 H
📖 第 1 页 / 共 5 页
字号:

// global_function wei gong yong han shu ku(公用函数库)iiiiiiiiiii
// BCD 判断,返回1,是BCD         返回0 不是BCD

unsigned char one_byte_hex_to_bcd(unsigned char a)
{
unsigned char l;
l=((a/10)<<4)+(a%10);
return l;
}

unsigned char testbcd(unsigned char a)
{
	if(((a>>4)<=9)&&((a&0xf)<=9))
       	return  1;
  	else
       	return 0;
}


unsigned char testbcdnum(point,num)
unsigned char *point,num;
{unsigned char l,value;
value=0;
if(num==0) value=0;
else
     	for(l=0;l<num;l++)
          	 value=value+testbcd(*(point+l));
return value;
}

unsigned char testZeronum(point,num)
unsigned char *point,num;
{
	unsigned char l,value;
	value=0;
	if(num==0)
		{
		value=0;
		}
	else
		{
		for(l=0;l<num;l++)
			{
			if(0==*(point+l))
				value=value+1;
			// value=value+testbcd(*(point+l));
			}
		}
	return value;
}


  
// pan duan year de he fa xing判断年的合法性iiiiiiii
// 1 true 0 false
unsigned char testyear(unsigned char a)
{
	if((testbcd(a)==1)&&(a<=0x35))       // dao 2035 year
         	return  1;
  else
       	return 0;
  }
    

  // pan duan month de he fa xing 判断月的合法性iiiiiiii
  // 1 true 0 false
  unsigned char testmonth(unsigned char a)
  {
  	if((testbcd(a)==1)&&(0!=a)&&(a<=0x12))     
         	return  1;
  	else
         	return 0;
}


// pan duan date  de he fa xing 判断日的合法性iiiiiiiiiii
  // 1 true 0 false
  unsigned char testday(unsigned char a)
{
	if((testbcd(a)==1)&&(0!=a)&&(a<=0x31))     
         	return  1;
  	else
         	return 0;
}


  // pan duan week  de he fa xing 判断周的合法性iiiiiiiiiiiiii
  // 1 true 0  false INSIDE RUN   (0---6)       0---SUNDAY
  unsigned char testweek(unsigned char a)
{
	if(a<7)     
         	return  1;
  	else
         	return 0;
}


// pan duan hour  de he fa xing 判断小时的合法性iiiiiiiiiiiiiiii
  // 1 true 0 false
  unsigned char testhour(unsigned char a)
{
	if((testbcd(a)==1)&&(a<=0x23))     
         	return  1;
  	else
         	return 0;
}

// pan duan minute  de he fa xing 判断分钟的合法性iiiiiiiiiiiiiiiii
  // 1 true 0 false
  unsigned char testminute(unsigned char a)
{
	if((testbcd(a)==1)&&(a<=0x59))     
         	return  1;
  	else
         	return 0;
}


// pan duan second  de he fa xing 判断秒的合法性iiiiiiiiiiiiiiiiiii
  // 1 true 0 false
  unsigned char testsecond(unsigned char a)
{
	if((testbcd(a)==1)&&(a<=0x59))     
         	return  1;
  	else
        	 return 0;
}

unsigned char testcuofengshiduan(unsigned char *point)
{
unsigned char l;
unsigned char *fp;
for(l=0;l<8;l++)
	{
		fp=point+2*l;
		if(2!=(testminute(*fp)+testhour(*(fp+1))))
		       return 0;
	}
return 1;
}
unsigned char value_hex_from_bcd(unsigned char a)
{unsigned char value;
value=10*(a>>4)+(0xf&a);
return value;
}

//yi xia tian jia yin yong 以下添加应用函数iiiiiiiiiiiiii

// test year month day week hour minute second de he fa xing
// test 年月日时分秒的合法性用于校时iiiiiiiiiiiiiiiiiiiiiii
// changed  &second   &day
unsigned char testsecond_minute_hour_day_month_year(second,day)
unsigned char *second,*day;
{unsigned char a7;
a7=0;
a7=testsecond(*second)+testminute(*(second+1))+testhour(*(second+2))+testday(*day)
	+testmonth(*(day+1))+testyear(*(day+2));
if(a7!=6)  
	return 0;
else 
	{
         switch(*(day+1))// month
             {
	       	case 0x1:
	       	case 0x3:
	       	case 0x5:
	       	case 0x7:
             		case 0x8:
              	case 0x10:
              	case 0x12: 
						a7=1;
                           		break;
              	case 0x4:
              	case 0x6:
              	case 0x9:
              	case 0x11:
       	            			if((0!=*day)&&(*day<0x31)) 
       	            	      			a7=1;
       	            			else  
							a7=0;
       	            			break;
              	default:
              	     			if((value_hex_from_bcd(*(day+2))%4)==0) 
              	         			{
              	         				if((0!=*day)&&(*day<0x30)) 
									a7=1;
       	                  				else  a7=0;
							}
       	           			else
       	                			{
       	                				if((0!=*day)&&(*day<0x29)) 
									a7=1;
       	                  				else  
									a7=0;
							}
       	           			break;
                }
             return a7;
        }
}

unsigned char testminutehour(unsigned char *point)
{
if(2==testminute(*point)+testhour(*(point+1)))
	return 1;
else
	return 0;
}
unsigned char testdaymonth(unsigned char *point)
{
unsigned char time[6],l;
for(l=0;l<6;l++)
	time[l]=0;
time[3]=*point;
time[4]=*(point+1);
return testsecond_minute_hour_day_month_year(&time[0],&time[3]);
	
}

// ram [] 2 byte----->hex
unsigned int value_hex_from_2bcd(unsigned int addr)
{unsigned int l;
  l=value_hex_from_bcd(RAM[addr]);
  l=l+100*value_hex_from_bcd(RAM[addr+1]);
  return l;
}	
	
// ji suan zhou ci   根据年月日 计算周次ppppppp
// 2000-2035 1_1 zhou ci


const unsigned char table_week_year[]=// week of 2000----2005
                      {6,1,2,3,4,6,0,1,2,4,5,6,0,2,3,4,5,0,1,2,3,5,6,0,1,3,4,5,6,1,2,3,4,6,0,1};
const unsigned int table_month28[]={0,31,59,90,120,151,181,212,243,273,304,334};
const unsigned int table_month29[]={0,31,60,91,121,152,182,213,244,274,305,335};


unsigned char week_from_day_month_year(day)
unsigned char *day;
{unsigned int l;
unsigned char l1,l2,l3;
l2=value_hex_from_bcd(*(day+1)); 
if((value_hex_from_bcd(*(day+2))%4)==0)
	l=table_month29[l2-1];
else 
	l=table_month28[l2-1];
l=value_hex_from_bcd(*day)-1+table_week_year[value_hex_from_bcd(*(day+2))]+l;
l1=l%7;
return l1;
}


// return 1  true














unsigned char test_week_day_month_year(lweek,day)// point
unsigned char lweek,*day;
{if(testweek(lweek)+testday(*day)+testmonth(*(day+1))+testyear(*(day+2))==4)
	if(week_from_day_month_year(day)==lweek)
		if(1==testsecond_minute_hour_day_month_year(&RSOFT_RTC_SECOND,day))
		    		return 1;
	       else 
		   		return 0;
        else 
			return 0;
 else 
 			return 0; 
}









// jiao shi yong 比较时间是否在误差范围内,参数允许误差(秒), 秒分时日月年pppp

// return 1 true 0  false
// NOTE 10 MINUTE
unsigned char compare_date_time(l1,second,day)
unsigned int l1;
unsigned char *second,*day;
{unsigned int j1,j2;
unsigned long j3,j4,j5,j6;
if(((value_hex_from_bcd(RSOFT_RTC_YEAR)-value_hex_from_bcd(*(day+2)))<2)||((value_hex_from_bcd(*(day+2))-value_hex_from_bcd(RSOFT_RTC_YEAR))<2))
	{
		j1=value_hex_from_bcd(RSOFT_RTC_YEAR);
		j1=j1*365+(j1+3)/4;
		if(((value_hex_from_bcd(RSOFT_RTC_YEAR))%4)==0)
			j1=j1+table_month29[value_hex_from_bcd(RSOFT_RTC_MONTH)-1];
		else 
			j1=j1+table_month28[value_hex_from_bcd(RSOFT_RTC_MONTH)-1];
		j1=j1+value_hex_from_bcd(RSOFT_RTC_DAY)-1;
		j2=value_hex_from_bcd(*(day+2));
		j2=j2*365+(j2+3)/4;// num day
		if((value_hex_from_bcd(*(day+2))%4)==0)
			j2=j2+table_month29[value_hex_from_bcd(*(day+1))-1];
		else 
			j2=j2+table_month28[value_hex_from_bcd(*(day+1))-1];
		j2=j2+value_hex_from_bcd(*day)-1;// num day
		j3=value_hex_from_bcd(RSOFT_RTC_SECOND);
		j6=(value_hex_from_bcd(RSOFT_RTC_HOUR));
		j3=(value_hex_from_bcd(RSOFT_RTC_MINUTE))*60+j6*3600+j3;
		// num second
		j4=value_hex_from_bcd(*second);
		j6=(value_hex_from_bcd(*(second+2)));
		j4=(value_hex_from_bcd(*(second+1)))*60+j6*3600+j4;
		if(j1>j2)
			{
				j5=j1-j2;// day 
         			j3=j3+j5*24*3600;// second
			}
		else 
			{
				j5=j2-j1;//day
 				j4=j4+j5*24*3600;// second
			}
 		if(j3>j4)
 			j5=j3-j4;
 		else
 			j5=j4-j3;
 		if(j5<=l1)
 			return 1;
 		else
 			return 0;
	}
else 
	return 0;
}
	





	
// AA将RAM中的内容备份到铁电AAAAAAA
// RAM[I]----->FM I, NUM,
void copy_ram_to_fm(i,num,addr)
unsigned int i,addr;
unsigned char num;
{
unsigned char l;
if(num!=0)
   	{
     		data_addr.addri=addr;
     		for(l=0;l<num;l++)
         		{
         			wr_data[l]=RAM[i];
          			i++;
			}
     		write(FM,num);
    	}
}




// AA将RAM中的内容备份到铁电,铁电1AAAAAAA
// RAM[I]----->FM I, NUM,  fm1=0x33+
void copy_ram_to_fm_fm1(i,num,addr)
unsigned int i,addr;
unsigned char num;
{
unsigned char l;
data_addr.addri=addr;
for(l=0;l<num;l++)
	{
		wr_data[l]=RAM[i];
  		i++;
	}
write(FM,num);
data_addr.addri=addr+FM_YONGHUHAO_L_BAK-FM_YONGHUHAO_L;
for(l=0;l<num;l++)
 	wr_data[l]=wr_data[l]+0x33;
 write(FM,num);
}

// if jing wei return 1 else return 0
unsigned char byte_1_bcd_add(unsigned int i)
{
	if(RAM[i]>=0x99)           // ==99 -->jin wei 
    		{
    			RAM[i]=0;
     			return 1;
		}
  	else 
  		{
  	  		if((RAM[i]&0xf)>=9) 
				RAM[i]=(RAM[i]&0xf0)+0x10;     // n9  --->(n+1) 0
  	  		else  
				RAM[i]=RAM[i]+1;
  	  		return 0;
		}
}



     
void byte_5_bcd_add(unsigned int i)
{unsigned char l,value;  
       if(byte_1_bcd_add(i)==1)
           if(byte_1_bcd_add(i+1)==1) 	
               if(byte_1_bcd_add(i+2)==1)
                   byte_1_bcd_add(i+3);
 // bcd
 if(4!=testbcdnum(&RAM[i],4))
 	for(l=0;l<4;l++)
 		{
 			value=value_hex_from_bcd(RAM[i+l])%100;
 		 	RAM[i+l]=one_byte_hex_to_bcd(value);//((value/10)<<4)+(value%10);
 		}
   }


void set_addr_by_twobiao(unsigned char twobiao_type)
{
	data_addr.addri=TABLE_TWO1[twobiao_type].blockaddr;
 }

unsigned int current_twobiaofm_block_addr(twobiao_type,num)
unsigned char twobiao_type,num;
{union k1 
		{
                unsigned char s[2];
                unsigned int   w;
               }d5;
unsigned char g1;
unsigned int  g3;
 data_addr.addri=FM_POINT_TWOTABLE+twobiao_type;
 if(0==read(FM,1)) 
 	g3=0xffff;
 else
 	{
         g1=wr_data[0];
         set_addr_by_twobiao(twobiao_type); 	         	
	  g1=(g1+num)%TABLE_TWO1[twobiao_type].numofsubblock;// SHANG SHANG YUE
	  d5.w=TABLE_TWO1[twobiao_type].lensubblock;	  
         g3=1+g1*d5.w+data_addr.addri;   //kuai di zhi
 	} 
return g3;
}




void byte_2_bcd_add(unsigned int i)
{unsigned char l,value;
 if(1==byte_1_bcd_add(i))  
  	byte_1_bcd_add(i+1);
// bcd
 if(2!=testbcdnum(&RAM[i],2))
 	for(l=0;l<2;l++)
 		{
 			value=value_hex_from_bcd(RAM[i+l])%100;
 		 	RAM[i+l]=one_byte_hex_to_bcd(value);//((value/10)<<4)+(value%10);
 		}
}
void byte_3_bcd_add(unsigned int i)
{unsigned char l,value;
 if(1==byte_1_bcd_add(i))
    	if(1==byte_1_bcd_add(i+1))
       	byte_1_bcd_add(i+2);
 // bcd
 if(3!=testbcdnum(&RAM[i],3))
 	for(l=0;l<3;l++)
 		{
 			value=value_hex_from_bcd(RAM[i+l])%100;
 		 	RAM[i+l]=one_byte_hex_to_bcd(value);//((value/10)<<4)+(value%10);
 		} 
}


//  if 2,==      1  >,,0<
unsigned char compare_1_byte(i,j)
unsigned int i,j;
{
	if(RAM[i]==RAM[j])  
		return 2;
	else
      		{
      			if(RAM[i]>RAM[j])  
				return 1;
       		else 
				return 0;
		}
}

// bcd compare
/*
unsigned char compare_2_byte(i,j)

⌨️ 快捷键说明

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