📄 filesys20.c
字号:
Type:类型,1:以PLU为索引,2:以记忆代码做索引,
返回 值:HH_OK:成功
功能描述:删除PLU记录
算法描述:
建立时间:2004/11/10
作 者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char HH_DelPLU(unsigned char *Ptr,unsigned char Type)
{
unsigned char i,j,k,x;
unsigned char ErrType;
// unsigned char HexTempID[2];
unsigned char tmpIndex[2];
// unsigned char tmpPLU_EN[PLU_EN_LEN+1]; //PLU列表有效位
unsigned char tmpPLU_EN2[PLU_EN_LEN+1];
// unsigned char tmpPLUIndexOv_EN[PLUIndexOv_EN_LEN+1];//索引溢出有效位
unsigned char tmpPLUIndexOv_EN2[PLUIndexOv_EN_LEN+1];
unsigned char tmpPLUIndex[sizeof(_PLUIndex)+1];
unsigned char tmpPLUIndexOv[sizeof(_PLUIndexOv)+1];
unsigned char tmpPLUIndexOv2[sizeof(_PLUIndexOv)+1];
unsigned char tmpPLUIndexOv3[sizeof(_PLUIndexOv)+1];
unsigned char InData[sizeof(_PLU)+1];
unsigned char OutData[sizeof(_PLU)+1];
// unsigned int tmpRecordNo;
unsigned int bakRecordNo; //PLU列表序号
// unsigned int tmpIndexOvNo;
unsigned int bakIndexOvNo;//PLU列表索引溢出序号
unsigned int IndexNo;
unsigned long tmpAddr;
_PLUIndex * PLUIndexPtr;
_PLUIndexOv * PLUIndexOvPtr;
_PLUIndexOv * PLUIndexOv2Ptr;
_PLUIndexOv * PLUIndexOv3Ptr;
_PLU * InPtr;
// _PLU * OutPtr;
memcpy(InData, Ptr, sizeof(_PLU));
InPtr = (_PLU *)InData;
if(Type == PLU_TYPE)//以PLU代码为索引
{
ErrType = CmpPLU(&IndexNo,tmpPLUIndex,tmpPLUIndexOv,InData,OutData);
PLUIndexPtr = (_PLUIndex *)tmpPLUIndex; //PLU索引
PLUIndexOvPtr = (_PLUIndexOv *)tmpPLUIndexOv; //PLU索引溢出
//读出
if (ReadFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取PLU列表有效位
if (XORCheck(tmpPLU_EN2, PLU_EN_LEN) != *(tmpPLU_EN2+PLU_EN_LEN))return ERR_CHECK;//校验和出错
//读出
if (ReadFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取索引溢出有效位
if (XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN) != *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN))return ERR_CHECK;//校验和出错
//---------删除索引所指记录-----------------
if(ErrType==PLU_OK_INDEX)
{
bakRecordNo = PLUIndexPtr->RecordNo;
j = bakRecordNo>>3; //除以8,获得在PLU列表有效位所在字节号,0~254
k = bakRecordNo&0x07; //取8的模,获得在该字节的位序,0~7
x = 0x01;
for(i=0; i<k; i++)x<<=1;
tmpPLU_EN2[j] = tmpPLU_EN2[j]&(~x);
//写PLU列表有效位
*(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
//写索引
PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte&(~0x80); //索引有效标志清除
*(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
return HH_OK;
}
//---------删除第一索引溢出所指记录-----------------
else if (ErrType==PLU_OK_FST_INDEXOV)
{
bakRecordNo = PLUIndexPtr->RecordNo;
j = bakRecordNo>>3; //除以8,获得在PLU列表有效位所在字节号,0~254
k = bakRecordNo&0x07; //取8的模,获得在该字节的位序,0~7
x = 0x01;
for(i=0; i<k; i++)x<<=1;
tmpPLU_EN2[j] = tmpPLU_EN2[j]&(~x);
//写PLU列表有效位
*(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
bakIndexOvNo = PLUIndexPtr->FstOvIndex;
j = bakIndexOvNo>>3; //除以8,获得在PLU列表溢出有效位所在字节号,0~254
k = bakIndexOvNo&0x07; //取8的模,获得在该字节的位序,0~7
x = 0x01;
for(i=0; i<k; i++)x<<=1;
tmpPLUIndexOv_EN2[j] = tmpPLUIndexOv_EN2[j]& (~x);
*(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
if (WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;//读取索引溢出有效位
//写索引
if(PLUIndexOvPtr->Next == 0xff)
{
PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte&(~0x40); //索引溢出有效标志清除
}
PLUIndexPtr->FstOvIndex = PLUIndexOvPtr->Next;
*(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
if(PLUIndexOvPtr->Next != 0xff)
{
//读取后一个索引溢出
tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Next;
if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
if (XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)))return ERR_CHECK;
PLUIndexOv2Ptr = (_PLUIndexOv *)tmpPLUIndexOv2;
//修改取后一个索引溢出
PLUIndexOv2Ptr->Prior = 0xf0;//在索引本体中
*(tmpPLUIndexOv2+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv));
if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
}
return HH_OK;
}
//---------删除普通索引溢出所指记录-----------------
else if (ErrType==PLU_OK_INDEXOV)
{
bakRecordNo = PLUIndexPtr->RecordNo;
j = bakRecordNo>>3; //除以8,获得在PLU列表有效位所在字节号,0~254
k = bakRecordNo&0x07; //取8的模,获得在该字节的位序,0~7
x = 0x01;
for(i=0; i<k; i++)x<<=1;
tmpPLU_EN2[j] = tmpPLU_EN2[j]&(~x);
//写PLU列表有效位
*(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
bakIndexOvNo = PLUIndexPtr->FstOvIndex;
j = bakIndexOvNo>>3; //除以8,获得在PLU列表溢出有效位所在字节号,0~254
k = bakIndexOvNo&0x07; //取8的模,获得在该字节的位序,0~7
x = 0x01;
for(i=0; i<k; i++)x<<=1;
tmpPLUIndexOv_EN2[j] = tmpPLUIndexOv_EN2[j]& (~x);
*(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
if (WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;//读取索引溢出有效位
if(PLUIndexOvPtr->Next != 0xff)
{
//读取后一个索引溢出
tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Next;
if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
if (XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)))return ERR_CHECK;
PLUIndexOv2Ptr = (_PLUIndexOv *)tmpPLUIndexOv2;
//修改后一个索引溢出
PLUIndexOv2Ptr->Prior = 0xf0;//在索引本体中
*(tmpPLUIndexOv2+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv));
if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
}
//读取前一个索引溢出
tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Prior;
if (ReadFlash(tmpPLUIndexOv3, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
if (XORCheck(tmpPLUIndexOv3, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv3+sizeof(_PLUIndexOv)))return ERR_CHECK;
PLUIndexOv3Ptr = (_PLUIndexOv *)tmpPLUIndexOv3;
//修改前一个索引溢出
PLUIndexOv3Ptr->Next = PLUIndexOv2Ptr->Prior;//
//tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Prior;
*(tmpPLUIndexOv3+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv3, sizeof(_PLUIndexOv));
if (ReadFlash(tmpPLUIndexOv3, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
return HH_OK;
}
else
{
return ErrType;
}
}
}
/*
****************************************************************************************
函数名称:HH_NewPLU
入口参数:*Ptr: 指向带的索引PLU列表数据缓冲区,读取的数据也放在该缓冲区
Type:类型,1:以PLU为索引,2:以记忆代码做索引,
返回 值:HH_ERR:是错误记录,HH_OK:不是错误记录
功能描述:新建PLU记录
算法描述:
建立时间:2004/11/10
作 者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char HH_NewPLU(unsigned char *Ptr,unsigned char Type)
{
unsigned char i;
unsigned char ErrType;
// unsigned char HexTempID[2];
unsigned char tmpIndex[2];
// unsigned char tmpPLU_EN[PLU_EN_LEN+1]; //PLU列表有效位
unsigned char tmpPLU_EN2[PLU_EN_LEN+1];
// unsigned char tmpPLUIndexOv_EN[PLUIndexOv_EN_LEN+1];//索引溢出有效位
unsigned char tmpPLUIndexOv_EN2[PLUIndexOv_EN_LEN+1];
unsigned char tmpPLUIndex[sizeof(_PLUIndex)+1];
unsigned char tmpPLUIndexOv[sizeof(_PLUIndexOv)+1];
unsigned char tmpPLUIndexOv2[sizeof(_PLUIndexOv)+1];
unsigned char InData[sizeof(_PLU)+1];
unsigned char OutData[sizeof(_PLU)+1];
// unsigned int tmpRecordNo;
unsigned int bakRecordNo; //PLU列表序号
// unsigned int tmpIndexOvNo;
unsigned int bakIndexOvNo;//PLU列表索引溢出序号
unsigned int IndexNo;
unsigned long tmpAddr;
_PLUIndex * PLUIndexPtr;
_PLUIndexOv * PLUIndexOvPtr;
_PLUIndexOv * PLUIndexOv2Ptr;
_PLU * InPtr;
// _PLU * OutPtr;
memcpy(InData, Ptr, sizeof(_PLU));
InPtr = (_PLU *)InData;
if(Type == PLU_TYPE)//以PLU代码为索引
{
ErrType = CmpPLU(&IndexNo,tmpPLUIndex,tmpPLUIndexOv,InData,OutData);
if(ErrType == PLU_ERR_EOF)//PLU代码若不同,才可添加
{
PLUIndexPtr = (_PLUIndex *)tmpPLUIndex; //PLU索引
PLUIndexOvPtr = (_PLUIndexOv *)tmpPLUIndexOv; //PLU索引溢出
//计算未存储记录的第一个记录序号
if (ReadFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取PLU列表有效位
if (XORCheck(tmpPLU_EN2, PLU_EN_LEN) != *(tmpPLU_EN2+PLU_EN_LEN))return ERR_CHECK;//校验和出错
//memcpy(tmpPLU_EN2, tmpPLU_EN, PLU_EN_LEN);
if(CalcRecordEn(tmpPLU_EN2,PLU_EN_LEN,&bakRecordNo) != HH_OK)return HH_ERR;
//计算未存储索引溢出的第一个索引溢出序号
if (ReadFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_READ;//读取索引溢出有效位
if (XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN) != *(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN))return ERR_CHECK;//校验和出错
//memcpy(tmpPLUIndexOv_EN2, tmpPLUIndexOv_EN, PLUIndexOv_EN_LEN);
if(CalcRecordEn(tmpPLUIndexOv_EN2,PLUIndexOv_EN_LEN,&bakIndexOvNo) != HH_OK)return HH_ERR;
//在该记录序号写入PLU记录
*(InData+sizeof(_PLU)) = XORCheck(InData, sizeof(_PLU));
tmpAddr = PLU_ADDR + bakRecordNo*(sizeof(_PLU)+1);
if(WriteFlash(InData, sizeof(_PLU)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
//---------若索引空,先把索引填满-----------------
if(PLUIndexPtr->CtrlByte&0x80 == 0)
{
//写索引
PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte|0x80; //索引有效标志置位
if(PLUIndexPtr->CtrlByte&0x40 == 0)PLUIndexPtr->FstOvIndex = 0xff;//索引溢出为空
PLUIndexPtr->RecordNo = bakRecordNo; //索引指向的记录号
*(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
}
//---------然后,考虑填充索引溢出为空的-----------------
else if(PLUIndexPtr->CtrlByte&0x40 == 0)
{
//写索引
PLUIndexPtr->CtrlByte = PLUIndexPtr->CtrlByte|0x40; //索引溢出有效标志置位
PLUIndexPtr->FstOvIndex = bakIndexOvNo; //改变索引溢出序号
*(tmpPLUIndex+sizeof(_PLUIndex)) = XORCheck(tmpPLUIndex, sizeof(_PLUIndex));
tmpAddr = PLUIndex_ADDR + ((unsigned int)tmpIndex[0]*256+tmpIndex[1])*(sizeof(_PLUIndex)+1);
if(WriteFlash(tmpPLUIndex, sizeof(_PLUIndex)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
//写PLU索引溢出
tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * bakIndexOvNo;
PLUIndexOvPtr->Prior = 0xF0; //前一个索引在索引本体中
PLUIndexOvPtr->Next = 0xFF; //下一个索引为空
PLUIndexOvPtr->RecordNo = bakRecordNo; //索引溢出指向的记录号
*(tmpPLUIndexOv+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv, sizeof(_PLUIndexOv));
if (WriteFlash(tmpPLUIndexOv, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
//写PLU列表索引溢出有效位
*(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
if(WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
}
//---------最后,考虑填充索引溢出不为空的-----------------
else if(PLUIndexPtr->CtrlByte&0x40 != 0)
{
//读取写PLU索引溢出前最后的PLU索引溢出前一个索引溢出
tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * PLUIndexOvPtr->Prior;
if (ReadFlash(tmpPLUIndexOv2, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_READ;
if (XORCheck(tmpPLUIndexOv2, sizeof(_PLUIndexOv)) != *(tmpPLUIndexOv2+sizeof(_PLUIndexOv)))return ERR_CHECK;
PLUIndexOv2Ptr = (_PLUIndexOv *)tmpPLUIndexOv2;
//添加一个PLU索引溢出
tmpAddr = PLUIndexOv_ADDR + (sizeof(_PLUIndexOv)+1) * bakIndexOvNo;
PLUIndexOvPtr->Prior = PLUIndexOv2Ptr->Next; //前一个索引
PLUIndexOvPtr->Next = 0xFF; //下一个索引为空
PLUIndexOvPtr->RecordNo = bakRecordNo; //索引溢出指向的记录号
*(tmpPLUIndexOv+sizeof(_PLUIndexOv)) = XORCheck(tmpPLUIndexOv, sizeof(_PLUIndexOv));
if (WriteFlash(tmpPLUIndexOv, sizeof(_PLUIndexOv)+1, tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
//写PLU列表索引溢出有效位
*(tmpPLUIndexOv_EN2+PLUIndexOv_EN_LEN) = XORCheck(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN);
if(WriteFlash(tmpPLUIndexOv_EN2, PLUIndexOv_EN_LEN+1,PLUIndexOv_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
}
//写PLU列表有效位
*(tmpPLU_EN2+PLU_EN_LEN) = XORCheck(tmpPLU_EN2, PLU_EN_LEN);
if(WriteFlash(tmpPLU_EN2, PLU_EN_LEN+1,PLU_EN_ADDR, HH_APP) != HH_OK)return ERR_WRITE;
return HH_OK;
}
else//PLU代码相同或其他出错则返回
{
return ErrType;
}
}
else
{
return (HH_ERR);
}
}
/*
****************************************************************************************
函数名称:HH_WritePLU
入口参数:*Ptr: 指向带的索引PLU列表数据缓冲区,读取的数据也放在该缓冲区
Type:类型,1:以PLU为索引,2:以记忆代码做索引,
返回 值:HH_ERR:是错误记录,HH_OK:不是错误记录
功能描述:写指定索引的记录
算法描述:
建立时间:2004/11/10
作 者:
当前版本:V1.0
****************************************************************************************
*/
unsigned char HH_WritePLU(unsigned char *Ptr,unsigned char Type)//写PLU记录
{
unsigned char i,j,k,x;
unsigned char ErrType;
unsigned char HexTempID[2];
// unsigned char tmpIndex[2];
unsigned char tmpPLU_EN[PLU_EN_LEN+1]; //PLU列表有效位
unsigned char tmpPLUIndex[sizeof(_PLUIndex)+1];
unsigned char tmpPLUIndexOv[sizeof(_PLUIndexOv)+1];
xdata unsigned char InData[sizeof(_PLU)+1];
xdata unsigned char OutData[sizeof(_PLU)+1];
unsigned int tmpRecordNo; //PLU列表序号
unsigned int IndexNo;
unsigned long tmpAddr;
_PLUIndex * PLUIndexPtr;
_PLUIndexOv * PLUIndexOvPtr;
_PLU * InPtr;
// _PLU * OutPtr;
memcpy(InData, Ptr, sizeof(_PLU));
InPtr = (_PLU *)InData;
if(Type == PLU_TYPE)//以PLU代码为索引
{
ErrType = CmpPLU(&IndexNo,tmpPLUIndex,tmpPLUIndexOv,InData,OutData);
if(ErrType==PLU_OK_INDEX)
{
PLUIndexPtr = (_PLUIndex *)tmpPLUIndex;
tmpAddr = PLU_ADDR + PLUIndexPtr->RecordNo*(sizeof(_PLU)+1);
}
else if ((ErrType==PLU_OK_INDEXOV) || (ErrType==PLU_OK_FST_INDEXOV))
{
PLUIndexOvPtr = (_PLUIndex *)tmpPLUIndexOv;
tmpAddr = PLU_ADDR + PLUIndexOvPtr->RecordNo*(sizeof(_PLU)+1);
}
else
{
return ErrType;
}
*(InData+sizeof(_PLU)) = XORCheck(InData, sizeof(_PLU));
if(WriteFlash(InData, sizeof(_PLU)+1,tmpAddr, HH_APP) != HH_OK)return ERR_WRITE;
return HH_OK;
}
else if(Type == TEMPID_TYPE)//以记忆码为索引
{
HexTempID[0] = InPtr->TempID[0];
HexTempID[1] = InPtr->TempID[1];
BCDtoHEX(HexT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -