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

📄 windows.c.bak

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/*
* 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 + -