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

📄 bank1.c.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
				return(KEYESC);
			}
			break;
		case KEYENTER:
			if (properties_point->SelectNum == 5) {
				return(KEYENTER);
			}
			break;
		default:
			break;
	}
	//properties_point->SelectNum == 1 设置日期
	//properties_point->SelectNum == 0 设置时间	
	//=========================================================================
	//设置日期
	if (properties_point->SelectNum == 1) {
		CursorEnable = 1;					// 0 disable,1 enable    
		properties_point->date_input.cur_flash_flag = 0;			//00--有光标,01--无光标
		switch (key) {
			case KEYESC:
				CursorEnable = 0;					// 0 disable,1 enable    
				properties_point->date_input.cur_flash_flag = 0;			//01--有光标,00--无光标
				return(KEYBCAKAGAIBN);
			case KEYENTER:
				TimerType = 0x0;        //关闭时钟刷新
				//更新RTC的年月日时分秒
				if (Edit_Ctrl(&properties_point->date_input,KEYENTER) == KEYENTER){
					CursorEnable = 0;					// 0 disable,1 enable    
					properties_point->date_input.cur_flash_flag = 0;			//01--有光标,00--无光标
					properties_point->SelectNum = 5;
					Edit_Ctrl(&properties_point->date_input,NewKEYREFRSH);
					for (i = 0; i < 4; i++) {
						properties_point->date_input.chr[i+8] = 
						properties_point->time_input.chr[i];
					}
					for (i = 0; i < 6; i++) {
						rtcA[i] = (((properties_point->date_input.chr[2*i]-0x30)*16)+(properties_point->date_input.chr[2*i+1]-0x30));	
					}
					rtcA[3] = GetDayNumPosition(rtcA[0],rtcA[1],rtcA[2]);	
					rtcA[6] = 0;
					WriteRTclock(0x26,&rtcA[0]);							
					TimerVar = 10;
					TimerType = TimerKeyOff;
					CursorEnable = 0;
					return(KEYBCAKAGAIBN);
				}
				break;
			case KEYSELECT:
				properties_point->date_input.cur_flash_flag = 1;			//01--有光标,00--无光标
				Edit_Ctrl(&properties_point->date_input, NewKEYREFRSH);
				return(KEYSELECT);
			default:
				properties_point->date_input.cur_flash_flag = 1;			//01--有光标,00--无光标
				Edit_Ctrl(&properties_point->date_input, InputKey);
				return(NOKEY);
		}
	}
	//设置时间
	if (properties_point->SelectNum == 0) {
		CursorEnable = 1;					// 0 disable,1 enable    
		properties_point->time_input.cur_flash_flag=1;			//01--有光标,00--无光标
		switch (key) {
			case KEYESC:
				CursorEnable = 0;					// 0 disable,1 enable    
				properties_point->time_input.cur_flash_flag = 0;			//01--有光标,00--无光标
				return(KEYBCAKAGAIBN);
			case KEYENTER:				//更新RTC的时分秒
				TimerType = 0x0;        //关闭时钟刷新
				if (Edit_Ctrl(&properties_point->time_input,KEYENTER) == KEYENTER) {
					CursorEnable = 0;					// 0 disable,1 enable    
					properties_point->date_input.cur_flash_flag = 0;			//01--有光标,00--无光标
					properties_point->SelectNum = 5;
					Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
					for (i = 0; i < 4; i++) {
						properties_point->date_input.chr[i+8] = 
						properties_point->time_input.chr[i];
					}
					for (i = 0; i < 6; i++) {
						rtcA[i] = (((properties_point->date_input.chr[2*i]-0x30)*16)+(properties_point->date_input.chr[2*i+1]-0x30));	
					}
					rtcA[3] = GetDayNumPosition(rtcA[0],rtcA[1],rtcA[2]);	
					rtcA[6] = 0;
					WriteRTclock(0x26,&rtcA[0]);							
					TimerType = TimerKeyOff;
					CursorEnable = 0;
					return(KEYBCAKAGAIBN);
				}
				break;
			case KEYSELECT:
				properties_point->date_input.cur_flash_flag=1;			//01--有光标,00--无光标
				Edit_Ctrl(&properties_point->time_input,NewKEYREFRSH);
				return(KEYSELECT);
			default:
				properties_point->date_input.cur_flash_flag=1;			//01--有光标,00--无光标
				Edit_Ctrl(&properties_point->time_input,InputKey);
				return(InputKey);
		}		
	}
	return(NOKEY);
}

uchar CtrlMText(StrcMTextx * p, uchar crtKey)
{
  
	//first: key process
	switch(crtKey) {										//judge current key
		case KEYREFRSH:											//keyrefresh(fresh)
			MTxstvinit(p);										//init
			break;
		case KEYUP:												//up
			TimerType = TimerKeyOn;           //for repeat enable, 20021210  
			if (p->crtpbglnsn != 1) {
				p->crtpbglnsn--;
			}
			else {
				return NOKEY;
			}
			break;
		case KEYDOWN:											//down
			TimerType = TimerKeyOn;           //for repeat enable, 20021210
			if (p->crtpbglnsn + p->crtplnnumber <= p->totallnnumber) {    
				p->crtpbglnsn++;
			}
			else {
				return NOKEY;
			}
			break;    
		case KEYPAGEUP:											//page up
			TimerType = TimerKeyOn;           //for repeat enable, 20021210
			if(p->crtpbglnsn == 1) {						//for avoid refresh
				return NOKEY;
			}
			if (p->crtpbglnsn > (uint)(p->crtplnnumber)) {
				p->crtpbglnsn -= p->crtplnnumber;
			}
			else {
				p->crtpbglnsn = 1;
			}
			break;
		case KEYPAGEDOWN:										//page down
			TimerType = TimerKeyOn;           //for repeat enable, 20021210    
			if (p->crtpbglnsn + p->crtplnnumber <= p->totallnnumber) {
				p->crtpbglnsn += p->crtplnnumber;
			}
			else {
				return NOKEY;
			}
			break;
		case KEYESC:
			return KEYESC;
			break;
		case KEYENTER:
			return KEYENTER;
			break;
		default:
			return NOKEY;
			break;
	}
	MTxFnDisplay(p);
	return NOKEY;
}


void MTxstvinit(StrcMTextx * p)//multi text struct value init
{
	uint i;
	uint crtcharaddress;									//current character address
	crtcharaddress = p->textaddress_h * 0x0100 + p->textaddress_l;
	for (i = 1; i < 255; i ++) {							//for the max line number is 255
		if ((i % 10) == 1) {
			p->adhistory[(uchar)(i / 10)] = crtcharaddress;
		}
		crtcharaddress = MTxFnScan1line(p, crtcharaddress, 0xff);
		if (crtcharaddress == 0) {								//"EOF"
			break;
		}
  }
  
  p->crtpbglnsn = 1;										//current page begining line sn
  p->crtplnnumber = (uchar)((p->psty2 - p->psty1 - 1) / (12 + (p->charset >> 3)));
  p->totallnnumber = i;									//total line number
}

//multi text function display
void MTxFnDisplay(StrcMTextx * p)
{
	uchar i;
	uint crtcharaddress;									//current char address
	uchar skiplnnumber;										//skip line number
	uchar ystep, crty;
	//first: frame and rollbar
	YJHDrawRectangle(p->pstx1, p->psty1, p->pstx2, p->psty2, p->frameset);
	//display frame
	DrawRollbar(p->pstx2 - 7, p->psty1 + 1, p->psty2 - 1, (uchar)(p->crtpbglnsn), p->crtplnnumber, (uchar)(p->totallnnumber));
	//display rollbar
	//sencond: process
	crtcharaddress = p->adhistory[(uchar)((p->crtpbglnsn - 1) / 10)];
	skiplnnumber = (p->crtpbglnsn - 1) % 10;
	//	xstep = 6 + (p->charset & 0x03);						//process xstep
	ystep = 12 + (p->charset >> 3);							//process ystep
	//third: skip
	for (i = 0; i < skiplnnumber; i ++) {
		crtcharaddress = MTxFnScan1line(p, crtcharaddress, 0xff);
	}
	//	p->crtpbglnsn += skiplnnumber;
	//last: display (1 page)
	YJHClearWindow(p->pstx1 + 1, p->psty1 + 1, p->pstx2 - 8, p->psty2 - 1, 0);
	//clear window
	for (crty = p->psty1 + 1; crty + ystep < p->psty2; crty += ystep) {
		crtcharaddress = MTxFnScan1line(p, crtcharaddress, crty);
		if (crtcharaddress == 0) {								//EOF
			break;
		}
	//		p->crtpbglnsn ++;
	}
}

//-------------------------------------------------------------------------------------

//multi text function scan 1 line
uint MTxFnScan1line(StrcMTextx * p, uint charaddress, uchar crty)
{
	uchar crtx/*, charlib*/;
	ucharx crtchar[2];
	uchar xstep = 6 + (p->charset & 0x03);				//process xstep
	uchar charmode = ((p->charset << 5) & 0xe0) | BLACK;//character mode
	for (crtx = p->pstx1 + 1; ; crtx += xstep) {
		YJHReadFlashToExterMem(p->textpage, 2, 
		(uchar *)(charaddress), crtchar);
		//get current character
		if (crtchar[0] == 0xff) {							//"EOF"
			return 0;
		}
		if (crtchar[0] == 0x0d)	{						//"return"
			return (charaddress + 2);
		}
		if (crtchar[0] < 0x80) {							//SBC
			if (crtx + xstep < p->pstx2 - 8) {
				if(crty != 0xff) {
					YJHStringDisplay(crtx, crty, LIB12x12, charmode, crtchar, 1);
				}
				charaddress ++;
			}
			else {
				return charaddress;
			}
    	}
		if (crtchar[0] >= 0xa0) {						//DBC
			if (crtx + 6 + xstep < p->pstx2 - 8) {
				if(crty != 0xff) {						//display?
					YJHStringDisplay(crtx, crty, LIB12x12, charmode, crtchar, 1);
				}
			crtx += 6;								//adjust current char x
			charaddress += 2;
			}
			else {
				return charaddress;
			}
		}
	}
}


void	SetupOperate(calcux	*p_ctrl,asmcalcux	*p_math,dspbufflinex	*p_caldsp)	
{
  uchar	i,k,j=0;
  uchar	m=0;
  uchar	f_dot=0;	//有无小数点标志 =1 有
  uchar	n_int=0;	//整数位数
  uchar	n_dec=0;	//小数位数
  uchar	count=0;
  dspbufflinex	*p0;
  
  m=p_ctrl->opats;
  p0=p_caldsp;		//显示缓冲区入口指针保存
  p_caldsp=p_caldsp+p_ctrl->buffpointer;		//指向当前行
  
  if(m==0||m==1||m==3)
  {
    if(m!=0)
    {
      for(i=0;i<17;i++)	//编辑总长17字节
      {
        k=p_ctrl->optext.chr[i];
        if(k=='.') f_dot=1;
        if((k>='0')&&(k<='9'))
        {
          if(f_dot==0) n_int++;
          else	n_dec++;
        }
      }
      
      //			p_caldsp=p_caldsp+p_ctrl->buffpointer;		//指向当前行
      p_caldsp->intnum=n_int;
      p_caldsp->decnum=n_dec;			//整数位数和小数位数写入显缓
      if((n_int+n_dec)!=0)
      {
        k=n_int+n_dec-1;
        if(f_dot==1)
          k++;
        for(i=0;i<k+1;i++)				//输入字符存放到显示缓冲区(总长17位=1符号+15数字窜+1小数点)
        {
          p_caldsp->caltext[16-k+i]=p_ctrl->optext.chr[i];
        }
      }
      
      if(m==1)
      {
        p_math->d1num=n_dec;		//设置计算区第一操作数小数位长
        i=(p_math->arithflag)&0x01;
        if(i==1)
          p_caldsp->caltext[16-k-1]='-';	//第一操作数的符号写入显示缓冲
      }
      else	//m==3
      {
        p_math->d2num=n_dec;	//设置计算区第二操作数小数位长
      }
    }
    else		//m=0	设置计算区第一操作数
    {
      p_caldsp->caltext[16]='0';
      p_math->d1num=0x0;
    }
    p_ctrl->buffpointer++;		//显示缓冲指针加1
    p_ctrl->p_lastline++;		//显示窗口末行行号加1
    dspbufmov_up(p_ctrl,p0);
  }
  
  //	if(m==1||m==2||m==3) 					//显示缓冲区运算符写入
  //	{
  
  if(m==0||m==1)		//m=0为默认第一操作数为0的情况
    p_caldsp=p0+p_ctrl->buffpointer;		//指针加一
  switch(p_ctrl->opator)
  {
		case 0:				//KEYADD:
      p_caldsp->opator='+';
      break;
    case 1:				//KEYSUB:
      p_caldsp->opator='-';
      break;
    case 2:				//KEYMUL:
      p_caldsp->opator='*';
      break;
    case 3:				//KEYDIV:
      p_caldsp->opator='/';
      break;
    default :
      break;
  }
  
  //	}
  
  if(m==1||m==3)	
  {
    count=0;
    for(i=n_int;i!=0;i--)		//设置计算区整数部分
    {
      k=(p_ctrl->optext.chr[i-1])&0x0f;
      if(count%2==1)
        k=k<<4;
      if(m==1) 
        p_math->bcdd1buf[j+8]=(p_math->bcdd1buf[j+8])|k;
      else if(m==3)
        p_math->bcdd2buf[j+8]=(p_math->bcdd2buf[j+8])|k;
      else
      {	//m=0 进入该程序,必为非法
      }
      if(count%2==1)
      {
        j++;
      }
      count++;
      if(count==n_int) break;
    }
    
    if(f_dot==1)		//设置计算区小数部分
    {
      count=0;
      j=7;
      for(i=n_int;i<18;i++)
      {
        k=(p_ctrl->optext.chr[i+1])&0x0f;
        if(count%2==0)
          k=k<<4;
        if(m==1) 
          p_math->bcdd1buf[j]=(p_math->bcdd1buf[j])|k;
        else if(m==3)
          p_math->bcdd2buf[j]=(p_math->bcdd2buf[j])|k;
        else
        {	//m=0 进入该程序,必为非法
        }
        if(count%2==1)
        {
          j--;
        }
        count++;
        if(count==n_dec) break;
      }
    }
    
    if(m==3)			//设置计算区最大值 0999999999999999.0000000000000000
    {
      for(i=0;i<16;i++)
      {
        p_math->maxnum[i]=MaxnumTable[i];		
      }
    }
  }
  else if(m==0)
  {
    p_math->bcdd1buf[8]=0x00;
  }
  else
  {
  }
}


//函数说明:将计算结果(压缩BCD码)取出解压缩为ASCII码并放入显示缓冲区
void	DspResult(calcux	*p_ctrl,asmcalcux	*p_math,dspbufflinex	*p_caldsp)
{
  uchar 	i,j,k,m,count=0;
  uchar	n_int=0;			//整数BCD码个数
  uchar	n_dec=0;			//小数BCD码个数
  uchar	firstno;
  uchar	intnums;
  uchar	cy=0;
  ucharc  texterr[]={"-溢出-"};
  
  p_caldsp=p_caldsp+p_ctrl->buffpointer;		//显缓指向当前行
  i=(p_math->arithflag)&0x10;					//判断结果是否溢出
  if(i!=0)
  {
    for(i=0;i<sizeof(texterr)-1;i++)
      p_caldsp->caltext[11+i]=texterr[i];
    p_ctrl->f_result=1;					//溢出结果不能作为连续计算的第一操作数
    
  }
  else
  {	
    for(i=0;i<8;i++)		//计算区之计算结果从整数最高字节起扫描整数BCD码个数
    {
      k=p_math->bcdd3buf[15-i];
      if(k!=0) 	break;
    }
    n_int=(8-i)*2;			//此处可能多计一个
    intnums=n_int;
    firstno=i;
    k=k&0xf0;
    if(k==0&&n_int!=0)
      n_int--;
    if(n_int==0)
      n_int=1;			//如果整数为全零,应显示成"0."的格式,因此 "=1"
    
    for(i=0;i<8;i++)		//计算区之计算结果从小数最低字节起扫描小数BCD码个数
    {
      k=p_math->bcdd3buf[i];
      if(k!=0) 	break;
    }
    n_dec=(8-i)*2;			//此处可能多计一个
    k=k&0x0f;
    if(k==0&&n_dec!=0)
      n_dec--;			//即使小数为全零,也无须显示成".0"的格式

⌨️ 快捷键说明

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