📄 windows.c.bak
字号:
}
}
}
uchar CountStrDotLen(uchar *str)
{//统计字符串中点阵宽度 最多192个点
uchar i,Dot=0;
i=0;
while(str[i]!=0)
{
if(str[i]>0xa0)
{
Dot+=16; //汉字占16点
i++;
}
else
Dot+=8; //西文字符占8点
i++;
}
return Dot;
}
uchar Windows(uchar no,uchar mode,uchar *key)
{
uchar i,j;
uchar InCurLocation[13]; //输入区光标位置
//计算总行数
for(i=0;i<12;i++) //最多12行
{
if(WinHint[i][0] == 0) break;
InCurLocation[i] = CountStrDotLen(&WinHint[i][1]); //从第一字节开始
}
if(i==0)return 0;
if(i<4)
{
j = i*2;
for(;j<8;j++)
LcdClearLine(j,192);
}
if(mode==0) //mode为窗口工作工作方式,0为菜单选择模式
return DisMenu(no,i,key);
else
return DisMenuMode(no,i,InCurLocation,key);
}
//---------------------------------------------------------------------------------------
//键盘扫苗,返回数字(0~9) 是功能键则将键值最高位置1以和字母区分
uchar ScanNumber(uchar row,uchar col,uchar dat,uchar mode)
{
uchar const str[]={K_0, K_1, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9,
K_XM1,K_XM2,K_XM3,K_XM4,K_XM5,K_XM6,K_00};
uchar i,k,val,tp[2];
uint time=0;
bit flg=1;
tp[1]=0;
val=0xFF;
while(val==0xFF)
{
val = GetKey();
if(RxdFlg==1 && mode!=0)return 0;
time++;
if(time>CursorTime)
{
time = 0;
if(mode!=0)
{
if(flg!=0)
tp[0]=dat;
else
tp[0]=' ';
if(mode==3)i=0x0B;
else i=0;
LcdDisplay(row,col,tp,i);
flg = ~flg;
}
}
}
if(mode==4)k=17;
else k=10;
for(i=0;i<k;i++)
{
if(str[i]==val)return i; //返回数字
}
if(val==K_00 && mode!=4)return 16;
// return (val | 0x80); //是功能键则将键值最高位置1以和字母区分
return val;
}
//整数显示
void LcdDisNum(uchar row, uchar col, uchar *str,uchar flg)
{
uchar i,len,dat[26];
if(flg==1)
{
len=strlen(str);
for(i=0;i<len;i++) //最多显示24个数字
{
dat[i]='*';
}
dat[len]=0;
LcdDisplay(row,col,dat,0);
}
else
LcdDisplay(row,col,str,0);
}
//小数输入
//row 小数显示的行坐标 Col 小数显示的列坐标 bcd 显示初始值
//key[0] 存放有效按键的值,返回按键扫描码
//当输入键值与keyvalue数组中任意一位相等时退出
ulong GetFloat(uchar row, uchar col, ulong dat,uchar len,uchar *key)
{//keyvalue数组长度至少2字节
uchar i,val,dotlen,disparr[26],tp[25],lastposition = 0;
ulong returnvalue=0;
bit x=0,dot=0,zero=0,win;
win=0;
if(len&0x80)win=1;
len &= 0x7F;
if(len>24) len = 24; //最大输入长度
dotlen=0xFF;
disparr[0]=0;
if(dat!=0)
{
zero=1;
NumToStr(dat,disparr,1);
}
lastposition = strlen(disparr);
for(i=0;i<lastposition;i++)
if(disparr[i]=='.')
{
dot=1;
dotlen=0;
break;
}
while(1)
{
LcdDisplay(row, col, disparr, 0); //显示数字
VfdDisplayInt(disparr,len,0);
val = ScanNumber(row,col+lastposition*8,'_',1);
if(RxdFlg==1) //串口中断,退出
{
key[0] = 0;
RxdFlg=0;
IEA &= 0xEF; //关UART2中断,ES2 = 0;
LcdDisplay(row,col+lastposition*8," ",0);
VfdClear();
return returnvalue; //返回整数
}
if(val>=0x0A && val<=0x0F)continue;
if(val<10 || val==16) //是数字键
{//对数字键的判断不能放到switch中
if(lastposition<len)
{
// if(zero==0 && (val==16 || val==0))
if(val==16 && zero==0) //输入的第一个按键不能是"00"
continue;
zero=1;
if(dotlen!=0)
{
if(dotlen!=0xFF)dotlen--;
if(val == 16)
{
disparr[lastposition++] = '0';
if(lastposition<len)
{
disparr[lastposition++] = '0';
dotlen--;
}
}
else disparr[lastposition++] = val + '0';
disparr[lastposition] = 0;
}
}
continue;
}
{
// val&=0x7F;
switch(val)
{
case K_LEFT:
case K_RIGHT:
case K_UP:
case K_DOWN: if(win)
{
x=1;
break;
}
continue;
case K_DOT: if(dot==1 || zero==0)continue;
if(lastposition<len)
{
disparr[lastposition++] ='.';
disparr[lastposition] = 0;
dot=1;
dotlen=2; //小数点后只能输入两位数字
}
break;
case K_QC: disparr[0] = 0;
lastposition = 0;
dot=0;
dotlen=0xFF;
zero=0;
for(i=0;i<=len;i++)tp[i]=' ';
tp[i]=0;
LcdDisplay(row,col,tp,0);
break;
case K_LJ: LcdDisplay(row,col+lastposition*8," ",0);
if(lastposition>0)
{
lastposition--;
if(lastposition==0)
{
zero=0;
}
if(disparr[lastposition]=='.')
{
dot=0;
dotlen=0xFF;
}
if(dot==1)dotlen++;
disparr[lastposition] = 0;
}
break;
case K_TC:
case K_HJ: x=1;
break;
default: i=0;
while(key[i]!=0)
{
if(val==key[i])
{
x=1;
break;
}
i++;
}
break;;
}
if(x==1)
{
key[0] = val ;
i=0;
while(disparr[i]!=0)
{
if(disparr[i]!='.')
{
returnvalue=(ulong)returnvalue*10L+(ulong)disparr[i]-'0';
}
else
{
disparr[i+3] = 0; //只要两位小数
if(disparr[i+1]==0) disparr[i+1] = '0';
if(disparr[i+2]==0) disparr[i+2] = '0';
}
i++;
}
if(disparr[i-3]!='.') returnvalue *=100; //没有按小数点则*100
LcdDisplay(row,col+lastposition*8," ",0); //清除光标
VfdClear();
return returnvalue;
}
}
}
}
//返回输入的整数值
//row 整数显示的行坐标 col 整数显示的列坐标 dat 显示初始值
//len:输入数据最大允许长度
//key[]:返回时存放按键扫描码,keyvalue数组长度至少1字节
//存放有效按键的值,当输入键值与keyvalue数组中任意一位相等时退出
ulong GetInt(uchar row, uchar col, ulong dat, uchar len,uchar flg,uchar *key)
{
uchar i, val, k,disparr[26],tp[25];
uchar lastposition = 0;
ulong returnvalue=0;
bit x=0,zero=0,win;
win=0;
if(len&0x80)win=1;
len &= 0x7F;
if(len>24) len = 24; //输入数据最大允许长度
disparr[0]=0;
// if(dat!=0)
// {
NumToStr(dat,disparr,0);
// LcdDisNum(row, col, disparr, flg);
// }
lastposition = strlen(disparr);
k=strlen(key);
// VfdDisplayInt(disparr,len,flg);
while(1)
{
LcdDisNum(row, col, disparr, flg); //显示数字
VfdDisplayInt(disparr,len,flg);
val = ScanNumber(row,col+lastposition*8,'_',1);
if(RxdFlg==1)
{
key[0] = 0;
RxdFlg=0;
IEA &= 0xef;
LcdDisplay(row,col+lastposition*8," ",0);//清除光标
VfdClear();
return 0;
}
if(val>=0x0A && val<=0x0F)continue;
if(val<10 || val==16)
{
if(zero==0 && (val==0 || val==16))continue;
zero=1;
if(lastposition<len)
{
if(val == 16)
{
disparr[lastposition++] = '0';
if(lastposition<len)
disparr[lastposition++] = '0';
}
else disparr[lastposition++] = val + '0';
disparr[lastposition] = 0;
}
}
else
{
val&=0x7f;
switch(val)
{
case K_LEFT:
case K_RIGHT:
case K_UP:
case K_DOWN:if(win)
{
x=1;
break;
}
continue;
case K_QC: disparr[0] = 0;
zero=0;
lastposition = 0;
for(i=0;i<=len;i++)tp[i]=' ';
tp[i]=0;
LcdDisplay(row,col,tp,0);
break;
case K_LJ: LcdDisplay(row,col+lastposition*8," ",0);
if(lastposition>0)
{
disparr[--lastposition] = 0;
}
break;
case K_TC:
case K_HJ: x=1;
break;
default:
for(i=0;i<k;i++)
{
if(val==key[i])
{
x=1;
break;
}
}
if(x!=1)continue;
}
if(x==1)
{
key[0] = val;
i=0;
while(disparr[i]!=0)
{
returnvalue=(ulong)returnvalue*10L+(ulong)disparr[i]-'0';
i++;
}
LcdDisplay(row,col+lastposition*8," ",0);//清除光标
VfdClear();
return returnvalue;
}
}
}
}
//-------------------------------------------------------
// ASCII转换为BCD码
//-------------------------------------------------------
void StrToBcd(uchar len,uchar *str,uchar *bcd)
{//如果str长度是奇数,最高位补0
uchar i,j,x;
j=strlen(str);
for(i=0;i<j;i++)
{
if(str[i]>'9')str[i]=str[i]-'A'+10;
else str[i]-='0';
}
if(len>j)len=j;
x=len/2;
if(len%2)
{
bcd[0]=str[0] & 0x0f;
i=1;
j=1;
x++;
}
else
{
j=0;
i=0;
}
for(;i<x;i++)
{
bcd[i] = str[j++];
bcd[i] <<=4;
bcd[i] |= (str[j++] & 0x0F);
// bcd[i] = ((str[j++]<<4) | (str[j++] & 0x0f));
}
bcd[i]=0;
}
uchar GetBcd(uchar row, uchar col, uchar *bcd,uchar len,uchar *key)
{// Ln:BCD显示的行坐标;Col:BCD显示的列坐标;Len:输入BCD的长度;
uchar i,j,val,k,disparr[28],tp[28];
uchar lastposition = 0;
bit x=0,zero=0,win;
memset(disparr,0,sizeof(disparr));
memset(tp,0,sizeof(tp));
win=0;
if(len&0x80)win=1;
len &= 0x7F;
if(len>20) len = 20; //最大输入长度
j=len/2;
if(len%2)j++;
BcdToStr(j,bcd,disparr,0);
lastposition = strlen(disparr);
k=strlen(key);
while(1)
{
VfdDisplayInt(disparr,len,0);
LcdDisplay(row, col, disparr, 0); //显示数字
val = ScanNumber(row,col+lastposition*8,'_',4);
if(val<=16)
{
if(lastposition<len)
{
if(val == 16)
{
disparr[lastposition++] = '0';
if(lastposition<len)
disparr[lastposition++] = '0';
}
else
{
if(val<10)
disparr[lastposition++] = val + '0';
else
disparr[lastposition++] = val-10+'A';
}
disparr[lastposition] = 0;
}
}
else
{
val&=0x7f;
switch(val)
{
case K_LEFT:
case K_RIGHT:
case K_UP:
case K_DOWN: if(win)
{
x=1;
break;
}
continue;
case K_QC:
if(lastposition>0)
{
for(i=0;i<j;i++)bcd[i]=0;
disparr[0] = 0;
lastposition = 0;
for(i=0;i<=len;i++)tp[i]=' ';
tp[i]=0;
LcdDisplay(row,col,tp,0);
}
else
if(win)x=1;
break;
case K_LJ: LcdDisplay(row,col+lastposition*8," ",0);
if(lastposition>0)
{
disparr[--lastposition] = 0;
}
else
if(win)x=1;
break;
case K_TC:
case K_HJ: x=1;
break;
default:
for(i=0;i<k;i++)
{
if(val==key[i])
{
x=1;
break;
}
}
break;
}
if(x==1)
{
StrToBcd(len,disparr,bcd);
LcdDisplay(row,col+lastposition*8," ",0);
VfdClear();
key[0]=val;
return val;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -