📄 windows.c
字号:
/*
* Copyright (c) 2004,成都港顺科技发展有限公司
* All rights reserved.
*
* 编 译 器:Keil:C Compiler:7.20;Assembler:7.10
* 工程名称:POS-Test.UV2
* 文件名称:Windows.C
* 摘 要:窗体显示
*
* 单 片 机:uPSD3254
* 当前版本:0.4
* 作 者:李凯
* 完成日期:2004-12-7 14:45
*/
#include "Main.h"
void WindowsSet(uchar x)
{
uchar i;
memset(WinDat,0,sizeof(WinDat));
memset(WinHint,0,sizeof(WinHint));
for(i=0;i<x;i++)WinHint[i][0]=1;
}
void VfdDisplayInt(uchar *str,uchar MaxNum,uchar Pwd)
{// Pwd = 1 显示密码 Pwd = 0显示整数
uint Cursor = 0xffff,DigitDot;
uchar i,position,IntLen=7,Dot,AllLen;
uchar VFDdisbuff[13];
for(i=0;i<10;i++) VFDdisbuff[i]=0x13;
if(MaxNum<7) Cursor =~(Cursor << MaxNum+6); //显示下划线_____
else Cursor = 0x1fff; //如果超出7位,则只显7位
IntLen = AllLen = 0;
for(i=0;i<7;i++)
{
if(str[i]==0) break;
if(str[i]!='.')IntLen++;
AllLen++;
}
position = 10 - IntLen;
if((position<3) || position>10 ) return; //显示超出范围
for(i=0;i<AllLen;i++)
{
if(str[i]=='.') continue;
if(Pwd == 1)
VFDdisbuff[position++] = 0x10; //'-'
else
VFDdisbuff[position++] = str[i]-'0';
}
Dot = i = 0;
while(IntLen!=0)
{ i++;
if(str[IntLen]=='.') { Dot = i; break; }
IntLen--;
}
DigitDot = 0x0020;
DigitDot <<= Dot;
VfdDisplay(VFDdisbuff,Cursor,DigitDot); //显示
}
void ScrollBar(uchar CurrentRow, uchar FullRow)
{//CurrentRow 当前行位置 FullRow 总行数
uchar const BarArr[]={
0xFF,0x41,0x51,0x59,0x5D,0x59,0x51,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x82,0x8A,0x9A,0xBA,0x9A,0x8A,0xFF
};
uchar val,Step,BarLen;
CurrentRow-=1;
val = FullRow/4;
if((FullRow%4)!=0) val += 1;
FullRow-=1;
BarLen = (63-16)/val; //滚动条
val = 48-BarLen; //48=64-16,可显示的总长度
Step = val/FullRow; //每行移动的点数
ShowPicture(0,184,64,192,BarArr);
if(CurrentRow<FullRow)
DisplayRectangle(8+Step*CurrentRow,186,8+(Step*CurrentRow)+BarLen,189,1);
else
DisplayRectangle(55-BarLen,186,55,189,1); //最后一行64-8=55
}
void Dis4HintMode(uchar StartLn,uchar CurLn,uchar *InputLocation)
{
uchar i,j,k,DisMode,adr=0,InputStr[25],val;
gyt4 *xp;
ulong num;
StartLn -= 1;
CurLn -= 1;
k=StartLn+4;
for(i=StartLn;i<k;i++)
{
if(WinHint[i][0]==0)return;
if(i==CurLn) DisMode = 0x11; //清除本行并显示反白效果
else DisMode = 0x01;
memset(InputStr,0,sizeof(InputStr));
switch(WinDat[i][0])
{
case 1: //为1、7表示显示整数
case 7: xp = &WinDat[i][2];
num=xp->dat;
NumToStr(num,InputStr,SwitchInt);
break;
case 2: //为2、8表示显示小数
case 8: xp = &WinDat[i][2];
num=xp->dat;
NumToStr(num,InputStr,SwitchFloat);
break;
case 3: strcpy(InputStr,&WinDat[i][2]); //显示汉字
break;
case 4: xp = &WinDat[i][2];
num=xp->dat;
NumToStr(num,InputStr,SwitchInt); //显示密码
val = strlen(InputStr);
for(j=0;j<val;j++) InputStr[j] = '*';
InputStr[j] = 0;
break;
case 5: //为5、6表示显示BCD码数组
case 6: j=WinDat[i][1]/2;
if(WinDat[i][1]%2)j+=1;
BcdToStr(j,&WinDat[i][2],InputStr,0);
break;
default:break;//其它方式未定义,不处理
}
LcdDisplay(adr,0,&WinHint[i][1],DisMode);
if(InputStr[0]!=0)
LcdDisplay(adr,InputLocation[i],InputStr,0);
adr +=16;
}
}
void Dis4Hint(uchar StartLn,uchar CurLn)
{
uchar i,DisMode,adr=0;
StartLn -= 1;
CurLn -= 1;
for(i=StartLn;i<StartLn+4;i++)
{
if(i==CurLn) DisMode = 0x11; //清除本行并显示反白效果
else DisMode = 0x01;
if(WinHint[i][0]==0) return;
LcdDisplay(adr,0,WinHint[i]+1,DisMode);
adr +=16;
}
}
uchar DisMenu(uchar no,uchar MenuLen,uchar *key)
{
uchar i,val,k;
uchar StartLn, CurLn;
if(no==0) no = 1;
CurLn = no;
if(no<=4)StartLn = 1;
else StartLn = no-3;
k=strlen(key);
while(1)
{
Dis4Hint(StartLn, CurLn);
ScrollBar(CurLn,MenuLen);
val = ScanNumber(0,0,0,0);
if((val<10) && (val>0) && (val<=MenuLen)) //是数字键1-9
{
key[0] = 0;
return val;
}
// val&=0x7F;
switch(val)
{
case K_UP: if(CurLn>StartLn)
CurLn--;
else
{
CurLn--; StartLn--;
if((CurLn<1) || (StartLn<1))
{
CurLn = MenuLen;
if(MenuLen>3)
{
StartLn = MenuLen - 3;
}
else
{
StartLn = 1;
}
}
}
break;
case K_DOWN:if(CurLn<(StartLn+3))
{
CurLn++;
if(CurLn>MenuLen)
{
CurLn = 1;
StartLn = 1;
}
}
else
{
CurLn++; StartLn++;
if((CurLn>MenuLen) || (StartLn>MenuLen))
{
CurLn = 1;
StartLn = 1;
}
}
break;
case K_LEFT:if(StartLn>4) //不在第一页
{
StartLn-=4;
CurLn-=4;
}
else
{
StartLn = 1;
CurLn = 1;
}
break;
case K_RIGHT:
if(MenuLen>4)
{
if((StartLn+4)<=MenuLen)
{
if((StartLn+4)<=MenuLen-4)
{
StartLn+=4;
CurLn+=4;
}
else
{
StartLn = MenuLen-4+1;
CurLn = MenuLen-4+1;
}
}
else
{
StartLn = MenuLen-4+1;
CurLn = MenuLen;
}
}
break;
default:
for(i=0;i<k;i++)
{
if(key[i]==val)
{
key[0] = val;
return CurLn;
}
}
continue;
}
}
}
void DelGb18030(uchar *str)
{
uchar i,j,k;
i=0;
j=0;
while(str[i]!=0)
{
if(str[i]<0x80)
{
j=1;
i++;
}
else
// if(str[i]>=0x81)
{
i++;
if(str[i]>=0x40)
{
j=2;
i++;
}
else
{
j=4;
i+=3;
}
}
}
i--;
for(k=0;k<j;k++)
str[i-k]=0;
}
uchar DisMenuMode(uchar no,uchar MenuLen,uchar *InputLocation,uchar *key)
{
uchar i,j,k,val;
uchar StartLn, CurLn;
uchar SelectInput=0;
uchar const TotalInput = 5;
uchar CharBuff[30];
uchar KeyPress;
gyt4 num,*xp;
bit flg;
if(no==0) no = 1;
CurLn = no;
if(no<=4)
StartLn = 1;
else
StartLn = no-3;
KeyPress=key[0];
while(1)
{
Dis4HintMode(StartLn, CurLn,InputLocation);
ScrollBar(CurLn,MenuLen);
k=CurLn-1;
switch(WinDat[k][0])
{
//case 7 8 与 case 1 2 的位置不能调换
case 7:
case 8: ScanerIni(); //初始化扫描仪
case 1:
case 2:
xp = &WinDat[k][2];
num.dat = xp->dat;
val = WinDat[k][1] | 0x80; //允许输入最大长度
if(WinDat[k][0]==1 || WinDat[k][0]==7)//输入整数
num.dat = GetInt((CurLn-StartLn)*16,InputLocation[k],num.dat,val,0,key);
else //输入小数
num.dat = GetFloat((CurLn-StartLn)*16,InputLocation[k],num.dat,val,key);
if(key[0] == 0)
return 0xf0; //扫描仪输入返回
else
xp->dat = num.dat;
val = key[0];
key[0] = KeyPress;
break;
case 3: memset(CharBuff,0,sizeof(CharBuff));
if(SelectInput == 0) //拼音输入法
{
val = ImeInput(CharBuff);
}
if(SelectInput==1) //区位输入法
{
val = QuWeiInput(48,32,CharBuff);
}
if(SelectInput==2) //英语输入法
{
val = EnglishInput(48,32,CharBuff);
}
if(SelectInput==3) //手写板输入
{
val = ManuscriptInput(48,32,CharBuff);
}
if(SelectInput==4)
{
val = Gb18030Input(CharBuff);
}
j = strlen(&WinDat[k][2]);
if(j<WinDat[k][1])
{
strncpy(&WinDat[k][j+2],CharBuff,WinDat[k][1]-j);
}
break;
case 4: xp = &WinDat[k][2]; //输入密码
num.dat = xp->dat;
val = WinDat[k][1] | 0x80; //允许输入最大长度
num.dat = GetInt((CurLn-StartLn)*16,InputLocation[k],num.dat,val,1,key);
xp->dat = num.dat;
val = key[0];
key[0] = KeyPress;
break;
//case 5 与 case 6 的位置不能调换
case 6: ScanerIni(); //初始化扫描仪
while(1)
{
val = GetKey();
if(val!=0xff)
{
if(val==K_TM)
{
IEA &= 0xEF; //禁止扫描仪输入的串口中断
// WinDat[k][0] = 5; //切换到键盘输入,
flg=0; //继续执行case 5:
break;
}
if((val==K_UP)||(val==K_DOWN)||(val==K_LEFT)||(val==K_RIGHT)||(val==K_TC)||(val==K_HJ))
{
IEA &= 0xEF; //禁止扫描仪输入的串口中断
flg=1;
break;
}
}
if(RxdFlg)
{//收到条形码
IEA &= 0xEF; //关描仪输入的串口中断
// UartTxd(15,&RxdBuf[200]);
RxdBuf[213] = 0;
StrToBcd(WinDat[k][1],&RxdBuf[200],&WinDat[k][2]);
// UartTxd(8,&WinDat[k][2]);
val = 0;
flg=1;
RxdFlg=0;
break;
}
}
if(flg==1)break;
case 5: //输入BCD码;
val = GetBcd((CurLn-StartLn)*16,InputLocation[k],&WinDat[k][2],WinDat[k][1]|0x80,key);
key[0] = KeyPress;;
break;
default:val = ScanNumber(0,0,0,0);
if(val<11)continue;
break;
}
// val&=0x7F;
switch(val)
{
case K_UP: if(CurLn>StartLn)
CurLn--;
else
{
CurLn--;
StartLn--;
if((CurLn<1) || (StartLn<1))
{
CurLn = MenuLen;
if(MenuLen>3)
{
StartLn = MenuLen - 3;
}
else
{
StartLn = 1;
}
}
}
break;
case K_DOWN: if(CurLn<(StartLn+3))
{
CurLn++;
if(CurLn>MenuLen)
{
CurLn = 1;
StartLn = 1;
}
}
else
{
CurLn++; StartLn++;
if((CurLn>MenuLen) || (StartLn>MenuLen))
{
CurLn = 1;
StartLn = 1;
}
}
break;
case K_LEFT: if(StartLn>4) //不在第一页
{
StartLn-=4;
CurLn-=4;
}
else
{
StartLn = 1;
CurLn = 1;
}
break;
case K_RIGHT: if(MenuLen>4)
{
if((StartLn+4)<=MenuLen)
{
if((StartLn+4)<=(MenuLen-4))
{
StartLn+=4;
CurLn+=4;
}
else
{
StartLn = MenuLen-3;
CurLn = MenuLen-3;
}
}
else
{
StartLn = MenuLen-3;
CurLn = MenuLen;
}
}
break;
case K_SR: SelectInput++;
if(SelectInput>=TotalInput) SelectInput = 0;
break;
case K_LJ: DelGb18030(&WinDat[k][2]);
break;
case K_QC: if(WinDat[k][0]==3)
{
j = strlen(&WinDat[k][2]);
for(i=0;i<j;i++)
WinDat[k][i+2]=0;
}
break;
default: j=0;
while(key[j]!=0)
{
if(key[j]==val)
{
key[0]=val;
return val;
}
j++;
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -