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

📄 page2.c

📁 在采样的基础上实现数码管显示和利用TI公司的FFT算法进行运算
💻 C
字号:
#include "zimo.h"
#include "data.h"
#include "dataChange.h"
#include "spwm.h"
#include "page2.h"
#include "System.h"

int Page2_order=0;     //PAGE2级数
int Page2_col=-1;       //栏目
int Page2_bit=-1;       //位,显示与存储脱节,应该纠正
int Hamanic_num=3;       //几次谐波
int Amp_Angle[2][BitNum]={{0,1,2,3,10,4},{0,1,2,3,10,4}};      //幅度相位
int PAGE_TWO(void) {
	int i,num;
	num = 2;
	LCDDELAY;	
/*	LCDPORTCMD = LCD_CSRFORM;	
	for(i=0;i<2;i++){	//设置块状光标
		LCDDELAY;	
		LCDPORTDATA = PCsrBlock[i];
	}	*/
	
	LCDDELAY;	
	LCDPORTCMD = LCD_OVLAY;	
	LCDDELAY;	
//	LCDPORTDATA = 9;	//设置一、为文本属性,三区为图形属性
	LCDPORTDATA = 9;
	LCDDELAY;	
	LCDPORTCMD = LCD_DISPON;	
	LCDDELAY;	
	LCDPORTDATA = 0x15;	//设置一~四区开显示,三关闭
//	line(312,24,312,120,LCD_SET);
//	line(288,24,288,120,LCD_SET);
//	line(264,24,264,120,LCD_SET);
//	line(240,24,240,120,LCD_SET);
//	line(240,24,312,24,LCD_SET);
//	line(240,48,312,48,LCD_SET);
//	line(240,72,312,72,LCD_SET);
//	line(240,96,312,96,LCD_SET);
//	line(240,120,312,120,LCD_SET);
//    line(244,40,260,40,LCD_SET);
	
//***************************
//	writechar(31,4,'1',0);
//	writechar(34,4,'2',0);
//	writechar(37,4,'3',0);
//	writechar(31,7,'4',0);
//	writechar(34,7,'5',0);
//	writechar(37,7,'6',0);
//	writechar(31,10,'7',0);
//	writechar(34,10,'8',0);
//	writechar(37,10,'9',0);
//	writechar(31,13,'-',0);
//	writechar(34,13,'0',0);
//	writechar(37,13,'.',0);

//****************************

//*********************************
    writechar(4,3,'P',0);
    writechar(5,3,'I',0);
    writechar(6,3,'D',0);
	DisplyCh(56,20,char56,0);
	DisplyCh(72,20,char18,0);
	DisplyCh(88,20,char52,0);
	DisplyCh(104,20,char48,0);
	writechar(11,3,':',0);
//********************************		
	DisplyCh(40,46,char60,0);
	DisplyCh(56,46,char61,0);
	DisplyCh(72,46,char46,0);
	DisplyCh(88,46,char18,0);
	writechar(13,7,'K',0);
	writechar(14,7,'p',0);
	writechar(15,7,':',0);
//	DispData(104,54,CodeVolValueA,6);
//********************************
    DisplyCh(40,72,char62,0);
	DisplyCh(56,72,char63,0);
	DisplyCh(72,72,char46,0);
	DisplyCh(88,72,char18,0);
	writechar(13,10,'K',0);
	writechar(14,10,'i',0);
	writechar(15,10,':',0);
//*********************************
    DisplyCh(40,98,char64,0);
	DisplyCh(56,98,char63,0);
	DisplyCh(72,98,char46,0);
	DisplyCh(88,98,char18,0);
	writechar(13,13,'K',0);
	writechar(14,13,'d',0);
	writechar(15,13,':',0);
//**********************************
//	DisplyCh(24,124,char25,0);  //变
//	DisplyCh(40,124,char14,0);
//	DisplyCh(56,124,char11,0);
//	DisplyCh(72,124,char25,0);
//	DisplyCh(88,124,char60,0);
//	DisplyCh(104,124,char52,0);
//	DisplyCh(120,124,char48,0);
//	writechar(17,17,':',0);
//*********************************
//    DisplyCh(40,150,char6,0);
//	DisplyCh(56,150,char15,0);
//	DisplyCh(72,150,char25,0);
//	DisplyCh(88,150,char18,0);
//	DisplyCh(104,150,char11,0);
//	writechar(15,20,':',0);
//**********************************
//    DisplyCh(40,176,char6,0);
//	DisplyCh(56,176,char16,0);
//	DisplyCh(72,176,char25,0);
//	DisplyCh(88,176,char18,0);
//	DisplyCh(104,176,char11,0);

//	writechar(15,23,':',0);
//***********************************
//************************************
//    DisplyCh(144,204,char22,0);    //
//	DisplyCh(160,204,char24,0);   //取消按钮
	
	DisplyCh(40,130,char1,0);    //谐波次数
	DisplyCh(56,130,char2,0);
		
	DisplyCh(40,156,char68,0);    //幅值
	DisplyCh(56,156,char69,0);
	
	DisplyCh(40,182,char10,0);    //频率
	DisplyCh(56,182,char12,0);
	
	//默认参数
	Page2_order=0;     //PAGE2级数
    Page2_col=-1;       //栏目
    Page2_bit=-1;       //位
    Hamanic_num=3;       //几次谐波
	//获取数据
	
	Flash_Open_Data(LCD_Z);
	ShowPrameter();
	return(num);
}

//显示PID三个参数
void ShowPrameter()
{
  int Prameter;
  //显示P
  Prameter=spwm_moudle.Kp;
  Display_Value(130,62,Prameter,6,MaxP);
  
  Prameter=spwm_moudle.Ki;
  Display_Value(130,86,Prameter,6,MaxI);
  
  Prameter=spwm_moudle.Kd;
  Display_Value(130,104,Prameter,6,MaxD);
}

int* KeyServePage2(int code, int *CsrFlag )	
{
   
	switch(code)	{
	
		case KeyEnter:  
	//		CLEAR();
//			PageNum = LCDPAGE0();
            
           if(Page2_order<PAGE2_DEPTH)   
            {
                Enter_Page2_Process();
             }
			break;
			
		case KeyEsc:
			DispData(40,220,(unsigned int *)"                                ",31);		
	        if(Page2_order>0)   
            {
                Esc_Page2_Process();
            }
            else
             {                    //返回主界面
                CLEAR();
	    	    PageNum = LCDPAGE0();
	            FillRect(29,201,99,223,LCD_TOG);
	    	    *CsrFlag=1;
	    	    
	    	    ReCacuPWM=1;   //重新计算PWM
	    	 }
			break;
			
		case KeyUp:
		
		    if(Page2_col==0 && Hamanic_num<MaxHamnic )
		     {
		         Hamanic_num+=2;
		         Flash_Open_Data(LCD_F);
		               //保存信息等
		         
		         break;
		      }
		    if(Page2_order!=2)
		       break;
		    switch(Page2_col)
		    {		           
		        case 1:
		                //进行上限检查
		        case 2:
		           Amp_Angle[Page2_col-1][BitLast-Page2_bit]++;
                   ReCheckNum(Amp_Angle[Page2_col-1],BitNum);
		           ShowNum(Page2_col);     //显示数据
		           break;
		        default:
		           break;   
		    }
			break;
			
		case KeyDown:
		    if(Page2_col==0 && Hamanic_num>MinHamnic  )
		     {
		           Hamanic_num-=2;
		           Flash_Open_Data(LCD_F);
		                        //保存信息等
		           break;
		      }
		    if(Page2_order!=2)
		       break;
		    switch(Page2_col)
		    {
		       
		        case 1:
		        case 2:
		           Amp_Angle[Page2_col-1][BitLast-Page2_bit]--;
		           ReCheckNum(Amp_Angle[Page2_col-1],BitNum);
		           ShowNum(Page2_col);     //显示数据
		           break;
		        default:
		           break;   
		    }		
			break;
			
		case KeyLeft:
		    if(Page2_order==1)
		    {
		       SelectCol(LCD_TOG);
		       Page2_col=(Page2_col+2)%3;    //位置为0,1,2
		       SelectCol(LCD_TOG);
		    }
		    else
		    if(Page2_order==2)
		    {
		      if(Page2_bit<BitLast-1) 
                      {
                         if(++Page2_bit==1)   //小数点
		                     Page2_bit++;
		                 ShowNum(Page2_col);
                       }
		     }
		    
			break;
			
		case KeyRight:
		    if(Page2_order==1)
		    {
		       SelectCol(LCD_TOG);
		       Page2_col=(Page2_col+1)%3;
		       SelectCol(LCD_TOG);
		    }
		    else
		    if(Page2_order==2)
		    {
               if(Page2_bit>0)
		       {
                   if(--Page2_bit==1)   //小数点
		                 Page2_bit--;
		           ShowNum(Page2_col);
                }
		    }
			break;
		default:
			break;
	}
	return(CsrFlag);
}

void Enter_Page2_Process()
{
   switch(Page2_order++)
   {
       case 0:
          Page2_col=0;
          SelectCol(LCD_TOG);    
          break;               //默认选中区域1,谐波次数
       case 1:
          if(Page2_col==0)
          {
           //保存数据
           //上限检测 360度
             if(Limitation(Amp_Angle[0],BitNum,MaxSetV,0)!=0 || Limitation(Amp_Angle[1],BitNum,3600,0)!=0)
             {
                //提示越界
                Page2_order=1;
               	DispData(40,220,(unsigned int *)"limition error,please reinput!",31);
             }
             else
             {
                 spwm_moudle.Ample[(Hamanic_num>>1)-1]=DataToFloat((unsigned int *)Amp_Angle[0],BitNum ,InvMaxHam) ;
                 spwm_moudle.Angle[(Hamanic_num>>1)-1]=DataToFloat((unsigned int *)Amp_Angle[1],BitNum ,InvMaxAngle) ;                
                 Page2_order=0;
                 SelectCol(LCD_TOG); 
              }
          }  
          else
         {
           Page2_bit=0;
           ShowNum(Page2_col);
         }
          break; 
   
   }
}

void Esc_Page2_Process()
{
   switch(Page2_order)
   {
       case 2:
          Page2_bit=-1;
          Page2_order--;
          ShowNum(Page2_col); 
          SelectCol(LCD_TOG);    
          break;               //默认选中区域1,谐波次数
       case 1:
          break;               //隐藏选中
   }
}

void   SelectCol(int flag)     //选中栏
{
   switch(Page2_col)
   {
     case 0:
            FillRect(136,130,143,145,flag);
            break;
     case 1:
            FillRect(136,156,175,171,flag);
            break;
     case 2:
            FillRect(136,182,175,197,flag);
            break;
   }
      
}

   
void  ShowNum(int col)         //显示数据
{
  int i;
  for(i=1;i<BitNum;i++)       //第1位符号位省去
  {
     if((i==BitLast-Page2_bit)||(i==BitPoint))   //1为符号位
        DisplyBigNum(128+i*8,130+col*26,int0[Amp_Angle[col-1][i]],LCD_F); 
     else
        DisplyBigNum(128+i*8,130+col*26,int0[Amp_Angle[col-1][i]],LCD_Z);
  }
}

int ReCheckNum(int *Array,int num)
{

   int i=0,flag=0;
   int *pdata=Array+num-1;  //指向个位
   for(;i<num-1;i++)    //不包括符号位
   {
     if(i==1)         //小数点
     {
        pdata--;
        continue;
     }
   
     *pdata+=flag;
     flag=0;               //进位    

     if(*pdata>=10)
     {
        *pdata-=10;
        flag=1;
     }
     else
     if(*pdata<0)
     {
        *pdata+=10;
        flag=-1;
     }
     pdata--; 
  }
  
  //下限处理
  if(flag==-1)
  {
     pdata++;
     for(i=0;i<num;i++)
     {
        if(i!=(num-3))
           *pdata=0; 
        pdata++;
      }
    }
   return 0;
}

//限幅处理
int  Limitation(int *Array,int num,int Uplimit,int Lowlimit)
{
    int sum=SumArray((unsigned int*)Array,num);
    if(sum>=Uplimit) 
       return ERROR_UPLIMIT;
    else
    if(sum<Lowlimit)
       return ERROR_DOWNLIMIT;
    else 
       return  0;
}

void Flash_Open_Data(int mode)
{
    DataChange(spwm_moudle.Ample[(Hamanic_num>>1)-1],(unsigned int *)Amp_Angle[0], BitNum,MaxHamanicVout);
	//
	DataChange(spwm_moudle.Angle[(Hamanic_num>>1)-1],(unsigned int *)Amp_Angle[1], BitNum,360);
	//
	DisplyBigNum(136,130,int0[Hamanic_num],mode);
	ReCheckNum(Amp_Angle[0],BitNum);                                                                                                                                                
	ShowNum(1);
	ReCheckNum(Amp_Angle[1],BitNum);
	ShowNum(2);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -