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

📄 bank1.c.svn-base

📁 keilC底层软件,能够结合硬件产生加解密密文,具有安全保护功能.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
    
    count=n_int+n_dec;
    if(count>15)			//四舍五入处理(总长15位控制)
    {
      n_dec=15-n_int;		//从高向低截取小数的位数
      i=n_dec/2;			
      j=n_dec%2;
      if(i!=7)			//将低位无效字节清零
      {
        for(k=0;k<(7-i);k++)
        {
          p_math->bcdd3buf[k]=0;
        }
      }
      
      k=p_math->bcdd3buf[7-i];	//取需要进行四舍五入处理的字节
      if(j==0)		//小数位数为偶
      {
        k=k&0xf0;
        k=k>>4;//(unsigned char)
        p_math->bcdd3buf[7-i]=0;
        if(k>=5)	cy=1;
      }
      else
      {
        k=k&0x0f;
        if(k>=5)
        {
          m=p_math->bcdd3buf[7-i];
          m=m&0xf0;
          m=m+0x10;
          
          p_math->bcdd3buf[7-i]=m;
          if(m>=0xa0)
          {
            p_math->bcdd3buf[7-i]=0x00;
            cy=1;
          }
        }
        p_math->bcdd3buf[7-i]=(p_math->bcdd3buf[7-i])&0xf0;
      }
      
      if(k>=5)
      {
        j=7-i+1;
        count=0;
        for(;j<16;j++)
        {
          m=p_math->bcdd3buf[j];
          m=m&0x0f;
          m=m+cy;	//低字BCD码
          if(m<0xa)	
          {
            p_math->bcdd3buf[j]=(p_math->bcdd3buf[j])&0xf0|m;
            cy=0;
            break;
          }
          cy=1;
          m=(p_math->bcdd3buf[j])&0xf0;
          m=m>>4;
          m=m+cy;	//高字BCD码
          if(m<0xa)
          {
            m=m<<4;
            p_math->bcdd3buf[j]=m;
            cy=0;
            break;
          }
          p_math->bcdd3buf[j]=0;
          cy=1;
        }
      }
      //再次进行整数及小数BCD码个数的扫描
      for(i=0;i<8;i++)
      {
        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;
      
      for(i=0;i<8;i++)
      {
        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--;
      
      count=n_int+n_dec;
    }
    
    p_math->d3num=n_dec;		
    count=intnums+n_dec;	//注意: intnums 可能比 n_int 大1, 目的是为了后面解压的方便
    
    if(n_dec!=0)
      count++;
    
    if(firstno!=8)		//如果整数不为零
    {
      for(i=0;i<intnums;i++)	//计算区之计算结果整数部分(BCD码)解压缩放入显缓
      {
        m=p_math->bcdd3buf[15-firstno-i/2];
        if(i%2==0)
        {
          p_caldsp->caltext[17-count+i]=((m&0xf0)>>4)|'0';
        }
        else
        {
          p_caldsp->caltext[17-count+i]=m&0x0f|'0';
        }
      }
      i=((p_math->arithflag)&0x04)>>2;
      if(i==1)	//结果为负
      {
        if(n_int!=intnums)
          p_caldsp->caltext[17-count]='-';
        else
          p_caldsp->caltext[17-count-1]='-';
      }
      else		//结果为正
      {
        if(n_int!=intnums)
          p_caldsp->caltext[17-count]=' ';
      }
    }
    else				//如果整数为零
    {
      p_caldsp->caltext[17-count-1]='0';
      i=((p_math->arithflag)&0x04)>>2;
      if(i==1)	//结果为负
      {
        p_caldsp->caltext[17-count-2]='-';
      }
    }
    
    if(n_dec!=0)
    {
      p_caldsp->caltext[17-count+intnums]='.';
      for(i=0;i<n_dec;i++)	//计算区之计算结果小数(BCD码)解压缩放入显缓
      {
        m=p_math->bcdd3buf[15-firstno-(i+intnums)/2];
        if(i%2==0)
          p_caldsp->caltext[17-count+intnums+1+i]=((m&0xf0)>>4)|'0';
        else
          p_caldsp->caltext[17-count+intnums+1+i]=m&0x0f|'0';
      }
    }
    p_caldsp->intnum=n_int;
    p_caldsp->decnum=n_dec;
  }
  p_caldsp->opator='=';
}

//计算器显示缓冲区:共为50行,每行20个字节(1个字节操作符+1个字节整数位数+1个字节小数位数+17字节ASCII码(含1个小数点))
//如果无操作符,则操作符字节为0x00-------加减乘除点等-->"2b,2d,2a,2f,2e,3d"
//函数说明用于当显示缓冲区已满时由后向前挤去一行

void	dspbufmov_up(calcux	*p_ctrl,dspbufflinex	*p_caldsp)
{
  uchar 	i,j,y;
  uchar	*p0;
  uchar	*p1;
  
  p0=&(p_caldsp->opator);		//显示缓冲区首行
  p1=p0+20;					//显示缓冲区第二行
  
  if((p_ctrl->buffpointer)>=(p_ctrl->bufflines))		//当显示缓冲区已满时由后向前挤去一行
  {
    p_ctrl->buffpointer=p_ctrl->bufflines-1;
    y=p_ctrl->bufflines-1;
    for(i=0;i<y;i++)
    {
      for(j=0;j<20;j++)
      {
        *p0=*p1;
        p0++;
        p1++;
      }
    }
    for(j=0;j<20;j++)		//显示缓冲末行清空
    {
      *p0=' ';
      p0++;
    }
  }
  
  
  if((p_ctrl->p_lastline)>=(p_ctrl->bufflines))		//当显示缓冲区已满时由后向前挤去一行
  {
    p_ctrl->p_lastline=p_ctrl->bufflines-1;
  }
}


uchar	calcu_ctrl(calcux	*p_ctrl,uchar	key)
{
	dspbufflinex *p_caldsp;
	uchar	f_refresh=0;		//屏幕刷新标志
	uchar	f_editini=0;		//编辑框需要初始化标志
	uchar	strlen;
	uchar	i,j,y;	
	ucharx	x1,y1,x2,y2;
	uchar	*p0;				
	uchar	*p1;
	uchar	f_jumpedit=0;		
	p_caldsp = (dspbufflinex*)&CalBuffA[0];
	if (key != KEYREFRSH) {
		if ((key != KEYESC) && (key != KEYUP) &&
		(key != KEYDOWN)&&((p_ctrl->opats&0xf0)==0xf0))
			return NOKEY;
	}
    if (key != KEYSELECT) {
		if ((p_ctrl->p_lastline) != (p_ctrl->buffpointer)) {
			p_ctrl->p_lastline = p_ctrl->buffpointer;
			f_refresh  = 1;
			p_ctrl->opats = p_ctrl->opats&0x0f;
			f_jumpedit = 1;
		}
	}
	switch (key) {
		case KEYREFRSH:
			p_ctrl->flag_updn = 0;
			p0=(ucharx *)&TEMPSTART[0];		//计算区清空
			for (key = 0; key < 70; key++) {
				*p0 = 0;
				p0++;
			}
			YJHClearWindow(p_ctrl->box_left,p_ctrl->box_top,p_ctrl->box_right,p_ctrl->box_bottom,0x00);
			YJHDrawRectangle(p_ctrl->box_left,p_ctrl->box_top,p_ctrl->box_right,p_ctrl->box_bottom,0x03);
			//调试时屏蔽
			p_ctrl->f_result = 0;			//控件区一些重要属性初始化
			p_ctrl->opator = 0xff;
			p_ctrl->opats = 0;
			p_ctrl->windowlines = (p_ctrl->box_bottom-p_ctrl->box_top-4)/p_ctrl->lineinter;
			f_editini = 1;
			f_refresh = 1;
			break;
		case KEY0:
		case KEY1:
		case KEY2:
		case KEY3:
		case KEY4:
		case KEY5:
		case KEY6:
		case KEY7:
		case KEY8:
		case KEY9:
		case KEYDOT:
		case KEYCLEAR:
			if (p_ctrl->f_result == 0) {		//如果上次计算结果已经清除,数字输入才有效          
				Edit_Ctrl((textboxx *)&(p_ctrl->optext.properties_len),key);
				if (key != KEYCLEAR) {
					if ((p_ctrl->opator) == 0xff) {
						p_ctrl->opats=1; 	//如果尚未输入运算符,操作步骤设置为第一步
					}
					else {
						p_ctrl->opats=3;			//否则操作步骤设置为第三步
					}
				}
			}
			break;
		case KEYADD:		//KEYRIGHT
		case KEYSUB:		//KEYLEFT
		case KEYMUL:		//KEYDOWN
		case KEYDIV:		//KEYUP
			if (p_ctrl->optext.chr[0] != 0x20) {
				if (Edit_Ctrl((textboxx *)&(p_ctrl->optext.properties_len),KEYENTER) == NOKEY) {
					break;
				}
			}
			if (p_ctrl->f_result == 1) {
				break;
			}
			i = p_ctrl->opats;
			if (key == KEYADD) {
				p_ctrl->lastopator = 0;
			}
			else if (key == KEYSUB) {
				p_ctrl->lastopator = 1;
			}
			else if (key == KEYMUL) {
				p_ctrl->lastopator = 2;
			}
			else {
				p_ctrl->lastopator = 3;
			}
			if (i != 3) {
				p_ctrl->opator = p_ctrl->lastopator;
				SetupOperate(p_ctrl,(asmcalcux*)&TEMPSTART[0],
				(dspbufflinex *)&CalBuffA[0]);		//设置第一操作数
				f_refresh=1;
			}     
			if (i == 0||i == 1) { //i=0 为默认第一操作数为零时
				f_editini = 1;
				p_ctrl->opats = 2;
			}
			if (i == 3) {	//此时相当于按下等号,并且将该结果作为第一操作数开始下一次运算
				SetupOperate(p_ctrl,(asmcalcux*)&TEMPSTART[0],(dspbufflinex *)&CalBuffA[0]);	//设置第二操作数
				switch (p_ctrl->opator) {
					case 0:				//KEYAD
						MBCD_ADD();
						break;
					case 1:				//KEYSUB:
						MBCD_SUB();
						break;
					case 2:				//KEYMUL:
						MBCD_MUL();
						break;
					case 3:				//KEYDIV:
						MBCD_DIV();
						break;
					default:
						break;
				}
				DspResult(p_ctrl,(asmcalcux	*)&TEMPSTART[0],(dspbufflinex *)&CalBuffA[0]);
				p_ctrl->buffpointer++;		//显示缓冲指针加1
				p_ctrl->p_lastline++;		//显示窗口末行行号加1
				dspbufmov_up(p_ctrl,(dspbufflinex *)&CalBuffA[0]);
				p_caldsp = p_caldsp+p_ctrl->buffpointer;
				p_ctrl->opator = p_ctrl->lastopator;
				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;
				}
				p_caldsp = p_caldsp-p_ctrl->buffpointer;		//显示缓冲行指针恢复
				p0 = (ucharx *)&TEMPSTART[0];	//将结果送到第一操作数
				p1 = p0+34;
				for (i = 0; i < 17; i++) {
					*p0 = *p1;
					p0++;
					p1++;
				}
				for (i = 0; i < 34; i++) {		//计算区之第二操作数及结果清空,arithflag 及 maxnums 保留
					*p0 = 0;
					p0++;
				}
				i = (*p0&0x04)>>2;
				*p0 = (*p0&0xfc)|i;		//结果符号送到第一操作数符号
				p_ctrl->opats = 2;
				f_editini = 1;
				f_refresh = 1;
			}
			break;
		case KEYSELECT:
			if ((p_ctrl->buffpointer+1) <= (p_ctrl->windowlines)) {
				return(NOKEY);	//总行数不足一页
			}
			if ((p_ctrl->p_lastline+1) == (p_ctrl->windowlines)) {
				if (p_ctrl->flag_updn == 0)	{
					p_ctrl->flag_updn = 1;
				}
			}
			if ((p_ctrl->p_lastline) == (p_ctrl->buffpointer)) {
				if (p_ctrl->flag_updn == 1)	{
					p_ctrl->flag_updn=0;
				}
			}
			if (p_ctrl->flag_updn == 0) {	//		case KEYUP:
				p_ctrl->p_lastline = p_ctrl->p_lastline-1;
				f_refresh=1;
				CursorEnable=0;
				TimerType=TimerKeyOn;
			}
			else {	//		case KEYDOWN:
				p_ctrl->p_lastline=p_ctrl->p_lastline+1;
				f_refresh = 1;
				if ((p_ctrl->p_lastline) == (p_ctrl->buffpointer)) {
					if (p_ctrl->f_result == 1) {
						CursorEnable = 0;
					}
					else {
						CursorEnable = 1;
						Edit_Ctrl((textboxx *)&(p_ctrl->optext.properties_len),NewKEYREFRSH);
					}
					f_jumpedit = 1;
				}
				TimerType=TimerKeyOn;
			}
			break;
		case KEYENTER:
			//整屏向上刷新一行
			if (p_ctrl->f_result == 0) {
				if ((p_ctrl->opats) == 2||(p_ctrl->opats) == 3) {		//按下等号,计算结果
					if (p_ctrl->optext.chr[0] != 0x20) {
						if(Edit_Ctrl((textboxx *)&(p_ctrl->optext.properties_len),KEYENTER) == NOKEY) {
							break;
						}
					}
					if ((p_ctrl->opats) == 2) {
						p_ctrl->opats = 3;
						p0 = (ucharx *)&TEMPSTART[0];	//将第一操作数拷贝到第二操作数
						p1 = p0+17;
						for (i = 0; i < 17; i++) {
							*p1 = *p0;
							p0++;
							p1++;
						}
						p1 += 17;					//取 arithflag
						i = (*p1)&0x03;
						if (i == 1 || i == 2) {
							*p1 = (*p1)|0x03;		//令俩操作数同号
						}
						p_caldsp = p_caldsp+p_ctrl->buffpointer;
						p0 = (ucharx *)&(p_caldsp->caltext[0]);	    //将显示缓冲第一操作数拷贝到第二操作数
						p1 = p0-20;
						for (i = 0; i < 17; i++) {
							*p0 = *p1;
							p0++;
							p1++;
						}
						p_caldsp = p_caldsp-p_ctrl->buffpointer;		//显示缓冲行指针恢复
					}
					SetupOperate(p_ctrl,(asmcalcux	*)&TEMPSTART[0],(dspbufflinex *)&CalBuffA[0]);	//设置第二操作数
					switch (p_ctrl->opator) {
						case 0:				//KEYADD:
							MBCD_ADD();
							break;
						case 1:				//KEYSUB:
							MBCD_SUB();
							break;
						case 2:				//KEYMUL:
							MBCD_MUL();
							break;
						case 3:				//KEYDIV:
							MBCD_DIV();
							break;
						default:
							break;
					}
					DspResult(p_ctrl,(asmcalcux	*)&TEMPSTART[0],(dspbufflinex *)&CalBuffA[0]);
					p_ctrl->lastopator=0;       //选择键的运算符号复位为"+"
					f_refresh=1;
					p_ctrl->f_result=1;
					p_ctrl->opats=1;
				}
			}
			else {
				p0 = (ucharx *)&TEMPSTART[0];		//计算区清空
				for (key = 0; key < 70; key++) {
					*p0 = 0;
					p0++;
				}
				p_ctrl->f_result=0;			//清除结果,并恢复初始状

⌨️ 快捷键说明

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