📄 bank1.c.svn-base
字号:
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 + -