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

📄 bank1.c.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
#include "reg51.h" 
#include "../include/bank1.h"

ucharx  DefMoreThan20[]={"批量总数已达20条"};//16
ucharc	MaxnumTable[]={0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x49,0x99,0x99,0x99,0x99,0x99,0x99,0x99,0x09};
ucharc t9table01[10][4] = 
{
  0x20,0x20,0x20,0x20,									//for key0
    0x20,0x20,0x20,0x20,									//for key1
    0x61,0x62,0x63,0x20,									//for key2
    0x64,0x65,0x66,0x20,									//for key3
    0x67,0x68,0x69,0x20,									//for key4
    0x6a,0x6b,0x6c,0x20,									//for key5
    0x6d,0x6e,0x6f,0x20,									//for key6
    0x70,0x71,0x72,0x73,									//for key7
    0x74,0x75,0x76,0x20,									//for key8
    0x77,0x78,0x79,0x7a,									//for key9
};

ucharc t9table04[17][10] = 
{
  //for "0" "*" " " "+" "-" " " " " " "
  0x30,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,		//for key0
    //for "1" "y" "z" "#" "9" "Y" "Z" "#"
    0x31,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x3a,0x3b,0x3c,		//for key1
    //for "2" "a" "b" "c" "@" "2" "A" "B" "C" "@"
    0x32,0x61,0x62,0x63,0x40,0x32,0x41,0x42,0x43,0x40,		//for key2
    //for "3" "d" "e" "f" "#" "3" "D" "E" "F" "#"
    0x33,0x64,0x65,0x66,0x23,0x33,0x44,0x45,0x46,0x23,		//for key3
    //for "4" "g" "h" "i" "$" "4" "G" "H" "I" "$"
    0x34,0x67,0x68,0x69,0x24,0x34,0x47,0x48,0x49,0x24,		//for key4
    //for "5" "j" "k" "l" "%" "5" "J" "K" "L" "%"
    0x35,0x6a,0x6b,0x6c,0x25,0x35,0x4a,0x4b,0x4c,0x25,		//for key5
    //for "6" "m" "n" "o" "^" "6" "M" "N" "O" "^"
    0x36,0x6d,0x6e,0x6f,0x5e,0x36,0x4d,0x4e,0x4f,0x5e,		//for key6
    //for "7" "p" "q" "r" "s" "7" "P" "Q" "R" "S"
    0x37,0x70,0x71,0x72,0x73,0x37,0x50,0x51,0x52,0x53,		//for key7
    //for "8" "t" "u" "v" "&" "8" "T" "U" "V" "&"
    0x38,0x74,0x75,0x76,0x26,0x38,0x54,0x55,0x56,0x26,		//for key8
    //for "9" "w" "x" "y" "z" "9" "W" "X" "Y" "Z"
    0x39,0x77,0x78,0x79,0x7a,0x39,0x57,0x58,0x59,0x5a,		//for key9
    
    0,0,0,0,0,0,0,0,0,0,									//for space to key dot
    0,0,0,0,0,0,0,0,0,0,									//for space to key dot
    0,0,0,0,0,0,0,0,0,0,									//for space to key dot
    0,0,0,0,0,0,0,0,0,0,									//for space to key dot
    0,0,0,0,0,0,0,0,0,0,									//for space to key dot
    0,0,0,0,0,0,0,0,0,0,									//for space to key dot
    
    //for "." "," "!" "?" "(" ")" "/" "\" "'" """
    0x2e,0x3d,0x3e,0x3f,0x40,0x5b,0x5c,0x5d,0x5e,0x5f,		//for keydot
};


uintc LunarDateCode01[] = {0xa1a1,0xcaae};//uintc LunarDateCode01[] = {0xa1a1,'十'};
uintc LunarDateCode02[] = {0xd2bb,0xb6fe,0xc8fd,0xcbc4,0xcee5,0xc1f9,0xc6df,0xb0cb,0xbec5,0xcaae};
//uintc LunarDateCode02[] = {'一','二','三','四','五','六','七','八','九','十'};
uintc LunarDateCode03[] = {0xb3f5,0xcaae,0xdba5,0xdba6};//uintc LunarDateCode03[] = {'初','十','廿','卅'};

ucharc LunarLeapMonth[] = 
{
  0X00,	//2000
    0X40, 0X02, 0X07, 0X00, 0X50, 0X04, 0X09, 0X00, 0X60, 0X04,	//2020
    0X00, 0X20, 0X60, 0X05, 0X00, 0X30, 0Xb0, 0X06, 0X00, 0X50,	//2040
    0X02, 0X07, 0X00, 0X50, 0X03,								//2050
};

uchar	GetMonthLength(uchar year, uchar month)
{
  switch(month)
  {
  case 1:case 3:case 5:case 7:case 8:case 10:case 12:
    return 31;
    break;
  case 4:case 6:case 9:case 11:
    return 30;
    break;
  case 2:
    //如果是闰年
    if((year % 4) == 0)
      return 29;
    else
      return 28;
    break;
  }
  return -1;
}

uchar AllRefresh(calendarx *properties_point)
{
 	uchar solar[3];
  ucharx lunar[10];
  uint holday[2];
  
  ucharx counter,length,i,j,weekday,monthlength,dateAlength;
  ucharx dateA[42],numberA[2],calendarA[12],holdayA[4];		//={0xc,0x13,0x0,0x7,2,9,28,02,20,12,16,16}
  uchar  rtcA[7];
  ucharx weekA[14];
  ucharx lunar_date[14];
  ucharc arrayA[]={0xc5,0xa9,0xc0,0xfa,0xa1,0xa1,0xbe,0xc5,0xd4,0xc2,0xb3,0xf5,0xc1,0xf9};
  ucharc weekA_array[]={0xc8,0xd5,0xd2,0xbb,0xb6,0xfe,0xc8,0xfd,0xcb,0xc4,0xce,0xe5,0xc1,0xf9};
  length=0;
  
  properties_point->SelectNum=5;
  properties_point->date_input.box_bottom=32;
  properties_point->date_input.box_left=0;
  properties_point->date_input.box_right=60;
  properties_point->date_input.box_top=19;
  properties_point->date_input.chr_type=Date_Type;
  properties_point->date_input.chr_disp_mode=0x0b;
  properties_point->date_input.chr_dir=0;
  properties_point->date_input.length_flex=0;
  properties_point->date_input.chr_len=6;
  
  properties_point->time_input.box_bottom=31;
  properties_point->time_input.box_left=90;
  properties_point->time_input.box_right=124;
  properties_point->time_input.box_top=19;
  properties_point->time_input.chr_type=Time_Type;
  properties_point->time_input.chr_disp_mode=0x0b;
  properties_point->time_input.chr_dir=0;
  properties_point->time_input.length_flex=0;
  properties_point->time_input.chr_len=4;
  
  for(i=0;i<14;i++) 
  {
    weekA[i]=weekA_array[i];
  }
  for(i=0;i<14;i++) 
  {
    lunar_date[i]=arrayA[i];
  }
  YjsReadRTclock(&rtcA[0]);		//读rtc里的年、月、日、星期、时、分
  
  for(i=0;i<3;i++)
  {
    solar[i]=(rtcA[i]/16)*10+rtcA[i]%16;
  }
  CalFnSolDate2LunDate(solar, lunar, holday);
  
  j=0;										//uint To uchar
  for(i=0;i<4;)								//节气转换
  {
    holdayA[i++]=(holday[j] & 0xff00)>>8;
    holdayA[i++]=holday[j++] & 0x00ff;
  }
  
  for(i = 4; i < 14;i++)
    lunar_date[i] = lunar[i - 4];
  
  BCDInRam_ASCExRam(6,(uchar *)&rtcA[0],(ucharx *)(&properties_point->date_input.chr[0]));
  for(i=0;i<4;i++) 
  {
    properties_point->time_input.chr[i]=properties_point->date_input.chr[i+8];	
  }
  Edit_Ctrl(&properties_point->date_input,NewKEYREFRSH);
  Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
  
  CursorEnable=0;		// 0 disable,1 enable				//yy
  
  j=4;
  for(i=0;i<6;i++)
  {
    if(i==3) ;
    else calendarA[j++]=((rtcA[i]/16)*10)+(rtcA[i]%16);
  }
  YJHDrawRectangle(0,34,18,113,0x51);	
  YJHDrawRectangle(110,34,127,113,0x51);
  if(holdayA[0] != 0xa1)
    YJHDrawRectangle(99,114,127,127,0x73);	
  YJHDrawLine(0,34,127,34,0x03);
  YJHDrawLine(0,50,127,50,0x03);
  YJHDrawLine(0,114,127,114,0x03);
  YJHStringDisplay(0xff,36, 0x5, 0x63,&weekA[0],7);			//显示星期日,1,2,3,4,5,6,
  YJHStringDisplay(0,115, 0x45, 0x03,&lunar_date[0],7);		//显示农历日期
  YJHStringDisplay(102,115, 0x35, 0x10,&holdayA[0],2);		//显示节气
  
  weekday=GetDayNumPosition(calendarA[4],calendarA[5],1);		//取某月1号的星期数
  if(weekday >= 7) weekday=0;
  else if(weekday > 4) dateAlength=42;
  else dateAlength=35;
  for(counter=0;counter<weekday;counter++)			//显示之前的空白项(weekday长度)
  {
    dateA[counter]=0x00;	
  }
  monthlength=GetMonthLength(calendarA[4],calendarA[5]);
  for(counter=0;counter < monthlength;counter++)	//显示数据项	(monthlength长度)
  {
    dateA[weekday+counter]=((counter+1)/10)*16+((counter+1)%10);		//转换成压缩BCD码,因为从rtc里读出的数值是BCD格式
  }	
  i=dateAlength-(weekday+monthlength);
  for(counter=0;counter < i;counter++)			//填补多余的空白项 (i 长度)
  {
    dateA[weekday+monthlength+counter]=0x00;	
  }
  for(i=0;i<dateAlength;i++)								//显示5×7数字
  {
    if(!(i%7)) j=0;
    if(dateA[i] != 0x00)
    {
      if(dateA[i] < 16) numberA[0]=0x20;
      else numberA[0]=(dateA[i]/0x10)+0x30;
      numberA[1]=(dateA[i]%0x10)+0x30;//计算需反白的当前日期
      if((((j*6) == (((weekday+calendarA[6])%7-1)*18)) || ((j*6) == (((weekday+calendarA[6]-1)%7)*18))) && ((i/7) == ((weekday+calendarA[6]-1)/7)))
      {
        length=0x00;
        counter=0x73;
        YJHDrawRectangle((3+j*6),(51+(i/7)*10),(15+j*6),(59+(i/7)*10),0x73);	
      }
      else
      {
        length=0x03;
        counter=0x3;
      }
    }
    else
    {
      j=j+3;
      continue;
    }
    YJHDisplayString5_7((4+j*6),(52+(i/7)*10),length,counter,(ucharx*)numberA,2);
    j+=3;
  }
  return(NOKEY);
}
// calendar function solar date to lunar date
void CalFnSolDate2LunDate(uchar *psolar, ucharx *plunar, uint *pholday)
{
  uintx spandays = 0;
  uintx tmpuint;
  ucharx tmpuchar;
  ucharx tmparuchar[4];
  
  uint targetsolaryear = 2000 + (*psolar);				//solar target year //samuel 20021109
  uchar targetsolarmonth = *(psolar + 1);					//solar target month
  uchar targetsolardate = *(psolar + 2);					//solar target date
  
  uint lunaryear;
  uchar lunarmonth, lunardate, leapmonth;
  
  //first: calculate solar span days
  for(tmpuint = START_YEAR; tmpuint < targetsolaryear; tmpuint ++)
    //solar year
    spandays += CalFnCalcSYDays(tmpuint);
  
  for(tmpuchar = 1; tmpuchar < targetsolarmonth; tmpuchar ++)
    //solar month
    spandays += CalFnCalcSMDays(targetsolaryear, tmpuchar);
  
  spandays += targetsolardate - 1;						//solar date
  
  spandays -= 46;											//attention
  
  //second: calculate lunar date
  for(lunaryear = START_YEAR; spandays >= CalFnCalcLYDays(lunaryear); lunaryear ++)
    //lunar year
    spandays -= CalFnCalcLYDays(lunaryear);
  
  for(lunarmonth = 1; spandays >= CalFnCalcLMDays(lunaryear, lunarmonth); lunarmonth ++)
    //lunar month
    spandays -= CalFnCalcLMDays(lunaryear, lunarmonth);
  leapmonth = CalFnGetLYLeapMonth(lunaryear);
  if(leapmonth != 0)										//leap month!
    if(lunarmonth > leapmonth)
      lunarmonth --;
    
    lunardate = 1 + spandays;								//lunar date
    //restore lunar month
    YJHReadFlashToExterMem(	LunarDataPage, 6,
      (ucharx *)(lunarmonthAdd + (lunarmonth - 1) * 6),
      (ucharx *)plunar);
    YJHReadFlashToExterMem(	LunarDataPage, 4,
      (ucharx *)(lunardateAdd + (lunardate - 1) * 4),
      (ucharx *)(plunar + 6));
    
    //third: process holday
    *pholday = 0xa1a1;
    *(pholday + 1) = 0xa1a1;								//init holday[]
    
    //	tmpuchar = LunarHolDay[*psolar][targetsolarmonth - 1];
    YJHReadFlashToExterMem(	LunarDataPage, 1,
      (ucharx *)(LunarHolDayAddrOrg + (*psolar * 12) + targetsolarmonth - 1),
      (ucharx *)(&tmpuchar));
    
    if(15 - targetsolardate == (tmpuchar >> 4)) {			//"jieqi"
      
      //		*pholday = LunarHolDayCode[targetsolarmonth - 1][0];
      //		*(pholday + 1) = LunarHolDayCode[targetsolarmonth - 1][1];
      
      YJHReadFlashToExterMem(	LunarDataPage, 4,
								(ucharx *)(LunarHolDayCdAd + (targetsolarmonth - 1) * 8),
                tmparuchar );
      *pholday = tmparuchar[0] * 0x0100 + tmparuchar[1];
      *(pholday + 1) = tmparuchar[2] * 0x0100 + tmparuchar[3];
    }
    if(targetsolardate - 15 == (tmpuchar & 0x0f)) {			//"zhongqi"
      
      YJHReadFlashToExterMem(	LunarDataPage, 4,
								(ucharx *)(LunarHolDayCdAd + (targetsolarmonth - 1) * 8 + 4),
                tmparuchar );
      *pholday = tmparuchar[0] * 0x0100 + tmparuchar[1];
      *(pholday + 1) = tmparuchar[2] * 0x0100 + tmparuchar[3];
    }
    
}


uchar	GetDayNumPosition(uchar year,uchar month,uchar date)
{	
  //数组元素monthday[i]表示第i个月以前的总天数除以7的余数
  ucharx monthday[]={0,3,3,6,1,4,6,2,5,0,3,5};
  uint weeknum,InYear;
  InYear=2000+year;
  weeknum = (InYear-1)%7 + (InYear-1)/4 - (InYear-1)/100 +(InYear-1)/400;
  weeknum += (monthday[month-1] +date);
  //如果iYear是闰年
  if((((year % 4) == 0)) && month>2)	weeknum++;
  //返回:0,1,2,3,4,5,6表日、一、二、三、四、五、六
  weeknum=weeknum%7;
  return ((uchar)weeknum);						//return weekday
}


// calendar function calculate solar year days
uint CalFnCalcSYDays(uint solaryear)
{
  if((solaryear % 4) == 0)								//leap year
    return 366;
  else
    return 365;
}

// calendar function calculate solar month days
uchar CalFnCalcSMDays(uint solaryear, uchar solarmonth)
{
  switch(solarmonth) {
  case 1:	case 3:	case 5:	case 7:	case 8:	case 10: case 12:
    return 31;											//longer month
  case 2:
    if((solaryear % 4) == 0)							//leap year
      return 29;
    else
      return 28;
  case 4:	case 6:	case 9:	case 11:
    return 30;											//shorter month
  default:
    return 0;
  }
}

// calendar function calculate lunar year days
uint CalFnCalcLYDays(uint lunaryear)
{
  uchar i, monthnumber = 12;
  uint days = 0;
  
  if(CalFnGetLYLeapMonth(lunaryear) != 0)					//there is leap month in the year
    monthnumber ++;
  
  for(i = 1; i <= monthnumber; i ++)
    days += CalFnCalcLMDays(lunaryear, i); 
  
  return days;
}


uchar CalFnCalcLMDays(uint lunaryear, uchar lunarmonth)
{
  ucharx tmpuchar[2];
  uintx symbol;
  
  YJHReadFlashToExterMem(	LunarDataPage, 2,
    (ucharx *)(LunarMonthDayAd + (uchar)(lunaryear - START_YEAR) * 2),
    tmpuchar);
  symbol = tmpuchar[0] * 0x0100 + tmpuchar[1];
  symbol &= 0x8000 >> (lunarmonth - 1);
  
  if(symbol == 0)
    return 29;
  else
    return 30;
}

// calendar function get lunar year leap month
uchar CalFnGetLYLeapMonth(uint lunaryear)
{
  uchar tmp, spanyear;
  
  spanyear = lunaryear - START_YEAR;
  tmp = LunarLeapMonth[spanyear / 2];
  tmp >>= ((lunaryear % 2) * 4);
  
  return tmp & 0x0f;
}

uchar Calendar_ctrl(calendarx *properties_point,uchar key)
{
	uchar length,i;
	uchar rtcA[7];
	length = 0;
	switch (key) {	
		case MsgShowTimer:     //可优化      
			YjsReadRTclock(&rtcA[0]);		//读rtc里的时、分
			if (rtcA[6] == 0) {
				if ((properties_point->time_input.chr[0] == 0x32)&&
				(properties_point->time_input.chr[1] == 0x33)&&
				(properties_point->time_input.chr[2] == 0x35)&&
				(properties_point->time_input.chr[3] == 0x39)) {
					return(KEYBCAKAGAIBN);
				}
			}
			BCDInRam_ASCExRam(2,(uchar *)&rtcA[4],
			(ucharx *)(&properties_point->time_input.chr[0]));
			Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
			CursorEnable = 0;
			TimerType = TimerKeyOff;
			TimerVar = 10;
			return(key);
		case KEYREFRSH:
			AllRefresh(properties_point);
			TimerVar = 10;
			TimerType = TimerKeyOff;
			return KEYREFRSH;
		case KEYSELECT:
			if ((properties_point->SelectNum == 1) || 
			(properties_point->SelectNum == 5)) {	//时间调整时按select
				CursorEnable = 1;					// 0 disable,1 enable   
				properties_point->date_input.cur_flash_flag = 1;			//01--有光标,00--无光标
				if ((properties_point->SelectNum == 1)&&
				(Edit_Ctrl(&properties_point->date_input, KEYENTER) == KEYENTER)) {
					Edit_Ctrl(&properties_point->date_input,NewKEYREFRSH);
					properties_point->SelectNum=0;
				}
				else {
					YjsReadRTclock(&rtcA[0]);		//读rtc里的年、月、日、星期、时、分
					BCDInRam_ASCExRam(6,(uchar *)&rtcA[0],(ucharx *)(&properties_point->date_input.chr[0]));
					for (i = 0; i < 6; i++) {
						properties_point->Date_Time[i]=properties_point->date_input.chr[i];			//保存当前日期数据
					}
					Edit_Ctrl(&properties_point->date_input,NewKEYREFRSH);
					properties_point->SelectNum = 1;
				}
			}
			else {								//时间调整时按select							
				CursorEnable = 1;					// 0 disable,1 enable   
				properties_point->time_input.cur_flash_flag = 1;			//01--有光标,00--无光标
				if (Edit_Ctrl(&properties_point->time_input, KEYENTER) != KEYENTER) {
					YjsReadRTclock(&rtcA[0]);		//读rtc里的年、月、日、星期、时、分
					BCDInRam_ASCExRam(6,(uchar *)&rtcA[0],(ucharx *)(&properties_point->date_input.chr[0]));
					for (i = 0; i < 4; i++) {
						properties_point->Date_Time[i] = properties_point->date_input.chr[i];			//保存当前时间数据
						properties_point->time_input.chr[i] = properties_point->date_input.chr[i+8];
					}
					Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
					(properties_point->SelectNum) = 0;
				}
				else {
					Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
					properties_point->SelectNum=1;
				}
			}
			break;
		case KEYESC:
			if (properties_point->SelectNum == 5) {

⌨️ 快捷键说明

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