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

📄 windows.c

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 C
📖 第 1 页 / 共 2 页
字号:
		}        
	}
}

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 + -