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

📄 subdisply.c

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



int DisplyCh(int x,int y,const int *chinese,int mode) {
	int i;
	int SetX,SetY;
	
	SetY=y;
	SetX=(x-x%8)/8;	
	LCDDELAY;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) >> 8 ;
	
	LCDDELAY;		
	LCDPORTCMD = LCD_CSRDOWN;
	LCDDELAY;	
	LCDPORTCMD = LCD_MWRITE;
	
	for( i=0;i<8;i++)
	{
		LCDDELAY;	
		LCDPORTDATA = chinese[i];		
		vramValue[SetY++][SetX]=chinese[i];	     //保存图形区信息,左上
	}
	
	
	SetY=y;
	SetX=(x-x%8)/8+1;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) >> 8 ;
	LCDDELAY;
	LCDPORTCMD = LCD_CSRDOWN;
	LCDPORTCMD = LCD_MWRITE;
	for(i=8; i<16; i++) {
		LCDDELAY;	
		LCDPORTDATA = chinese[i];
		vramValue[SetY++][SetX]=chinese[i];	     //保存图形区信息,右上
	}
	
	SetY=y+8;
	SetX=(x-x%8)/8;
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) >> 8 ;
	LCDDELAY;	
	LCDPORTCMD = LCD_CSRDOWN;
	LCDPORTCMD = LCD_MWRITE;
	for(i=16; i<24; i++) {
		LCDDELAY;	
		LCDPORTDATA = chinese[i];
		vramValue[SetY++][SetX]=chinese[i];	     //保存图形区信息,左下
	}
	
	
	SetY=y+8;
	SetX=(x-x%8)/8+1;
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y+8)*PSystemSet[6]+SetX) >> 8 ;
	LCDPORTCMD = LCD_MWRITE;
	for(i=24; i<32; i++) {
		LCDDELAY;	
		LCDPORTDATA = chinese[i];
		vramValue[SetY++][SetX]=chinese[i];	     //保存图形区信息,右下
	}
	return 0;
}


int DisplyBigNum(int x,int y,const int *chinese,int mode) {
	int i,MaxX=0;
	int SetX,SetY;
	
	if(mode==LCD_Z)
	   i=0;
	else
	if (mode==LCD_F)
	 {
	   i=16;
	   MaxX=16;
	 }
	SetY=y;
	SetX=(x-x%8)/8;	
	LCDDELAY;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+SetX) >> 8 ;
	
	LCDDELAY;		
	LCDPORTCMD = LCD_CSRDOWN;
	LCDDELAY;	
	LCDPORTCMD = LCD_MWRITE;
	
	for( ;i<8+MaxX;i++)
	{
		LCDDELAY;	
		LCDPORTDATA = chinese[i];		
		vramValue[SetY++][SetX]=chinese[i];	     //保存图形区信息,左上
	}
	
	
	SetY=y+8;
	SetX=(x-x%8)/8;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+SetY*PSystemSet[6]+SetX) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+SetY*PSystemSet[6]+SetX) >> 8 ;
	LCDDELAY;
	LCDPORTCMD = LCD_CSRDOWN;
	LCDPORTCMD = LCD_MWRITE;
	for(; i<16+MaxX; i++) {
		LCDDELAY;	
		LCDPORTDATA = chinese[i];
		vramValue[SetY++][SetX]=chinese[i];	     //保存图形区信息,左下
	}
	
	
}
//汉字图形方式显示子程序

int writechar(int x,int y,int codeno,int mode){
	int i;
	
	if( x < 0 || x >= PSystemSet[6] || y < 0 || y >= LCD_MAXY )
		return -1; 
	if( codeno > 0x0ff || codeno < 0 )
		return -1;
	
	if(codeno < 0x80){			//写ASCII字符
		LCDDELAY;	
		LCDPORTCMD = LCD_CSRW;	
		LCDDELAY;	
		LCDPORTDATA = (y*PSystemSet[6] + x) & 0x0ff;	//
		LCDDELAY;	
		LCDPORTDATA = (y*PSystemSet[6] + x) >> 8;	//
		
		LCDDELAY;	
		LCDPORTCMD = LCD_CSRRIGHT;	
		
		LCDDELAY;	
		LCDPORTCMD = LCD_MWRITE;	//
		LCDDELAY;			
		LCDPORTDATA = codeno;
					
		return 0;
	
	}
}	

//英文以及数字显示子程序,文本方式,字源来于液晶内部的ROM


int line(int x1, int y1, int x2, int y2, int mode){
	int i,value;
			
	if( x1 < 0 || x1 >= LCD_MAXX || y1 < 0 || y1 >= LCD_MAXY )
		return -1; 
	if( x2 < 0 || x2 >= LCD_MAXX || y2 < 0 || y2 >= LCD_MAXY )
		return -1; 
					
	if( x1 != x2 && y1 != y2 ) 	//非水平或垂直直线。
		return -1;
							
	if( x1 == x2 ){				//垂直直线
		if( y1 > y2 ){
			value = y1;
			y1 = y2;
			y2 = value;
		}
		switch (mode){
			case LCD_SET:
				for(i=y1;i<=y2;i++)
					vramValue[i][(x1-x1%8)/8] = vramValue[i][(x1-x1%8)/8] | (1<<(7-x1%8));
				break;
			case LCD_CLR:
				for(i=y1;i<=y2;i++)
					vramValue[i][(x1-x1%8)/8] = vramValue[i][(x1-x1%8)/8] & (0x0ff-(1<<(7-x1%8)));
				break;
			case LCD_TOG:
				for(i=y1;i<=y2;i++)
					vramValue[i][(x1-x1%8)/8] = vramValue[i][(x1-x1%8)/8] ^ (1<<(7-x1%8));
				break;	
		}
	}else if( y1 == y2 ){		//水平直线
		if( x1 > x2 ){
			value = x1;
			x1 = x2;
			x2 = value;
		}

		switch (mode){
			case LCD_SET:
				for(i=x1;i<=x2;i++)
					vramValue[y1][(i-i%8)/8] = vramValue[y1][(i-i%8)/8] | (1<<(7-i%8));
				break;
			case LCD_CLR:
				for(i=x1;i<=x2;i++)
					vramValue[y1][(i-i%8)/8] = vramValue[y1][(i-i%8)/8] & (0x0ff-(1<<(7-i%8)));
				break;
			case LCD_TOG:
				for(i=x1;i<=x2;i++)
					vramValue[y1][(i-i%8)/8] = vramValue[y1][(i-i%8)/8] ^ (1<<(7-i%8));
				break;	
		}
	}	
			
	LCDDELAY;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y1)*PSystemSet[6]+(x1-x1%8)/8) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y1)*PSystemSet[6]+(x1-x1%8)/8) >> 8 ;	//

	if( x1 == x2 ){
		LCDDELAY;	
		LCDPORTCMD = LCD_CSRDOWN;	
	}else if( y1 == y2 ){
		LCDDELAY;	
		LCDPORTCMD = LCD_CSRRIGHT;		
	}
	
	LCDDELAY;	
	LCDPORTCMD = LCD_MWRITE;	//

	if( x1 == x2 ){
		for(i=y1;i<=y2;i++){
			LCDDELAY;	
			LCDPORTDATA = vramValue[i][(x1-x1%8)/8];		
		}		
	}else if( y1 == y2 ){
		for(i=(x1-x1%8)/8;i<=(x2+7-(x2+7)%8)/8;i++){
			LCDDELAY;	
			LCDPORTDATA = vramValue[y1][i];		
		}		
	}		


	LCDDELAY;	
	LCDPORTCMD = LCD_CSRR;	
	LCDDELAY;
	value = LCDPORTDATA;
	LCDDELAY;	
	value = LCDPORTDATA;	

	return 0;
	
	}

//画线子程序:水平或者垂直直线



//画任意直线的程序
int DrawLine(int StartX,int StartY,int EndX,int EndY,int mode)
{
   int Error=0;
   int temp,Addx,Addy;
   int X,Y;
   //首先判断Y值大者
   if(StartY>EndY)
   {
       temp=StartX;
       StartX=EndX;
       EndX=temp;
       
       temp=StartY;
       StartY=EndY;
       EndY=temp;
   }  //交换
   
   Addx=EndX-StartX;
   Addy=EndY-StartY;
   
   X=StartX;
   Y=StartY;
   
   if(Addx>=Addy && Addx>=0)    //  0<k<1
   {      temp=Addy-Addx;
      do
      {
        dot(X, Y,  mode);
        if(Error>0)
        {
          X++;
          Y++;
          Error+=temp;
        }
        else
        {
          X++;
          Error+=Addy;
        } 
      }
      while(X<=EndX);
   }
   
   else
   if(Addx<Addy && Addx>=0)    //  1<k
   {
      temp=Addy-Addx;
      do
      {
        dot(X, Y,  mode);
        if(Error<0)
        {
          X++;
          Y++;
          Error+=temp;
        }
        else
        {
          Y++;
          Error-=Addx;
        } 
      }
      while(Y<=EndY);
   }
   
   else
   if(abs(Addx)>=Addy && Addx<0)    //  -1<k<0
   {
      temp=Addy-abs(Addx);
      do
      {
        dot(X, Y,  mode);
        if(Error<0)
        {
          X--;
          Error+=Addy;
        }
        else
        {
          X--;
          Y++;
          Error+=temp;
        } 
      }
      while(X>=EndX);
   }
   
   else
   if(abs(Addx)<Addy && Addx<0)    //  k<-1
   {
      temp=Addy-abs(Addx);
      do
      {
        dot(X, Y,  mode);
        if(Error<0)
        {
          X--;
          Y++;
          Error+=temp;
        }
        else
        {
          Y++;
          Error+=Addx;
        } 
      }
      while(Y<=EndY);
   }
   
   return 0;
}

//填充矩形
int FillRect(int LeftTopX,int LeftTopY,int RightBottomX,int RightBottomY,int mode)
{
 
 /*  for(;LeftTopY<=RightBottomY;LeftTopY++)
       line(LeftTopX,LeftTopY,RightBottomX,LeftTopY,mode); */
       
  //以下部分原来打算另写一个程序来改善效率,感觉差不多

  int LineX,LineY,XStartRemain,XEndRemain;   //
  ////////////////////////// 
  LCDPORTCMD = LCD_CSRDOWN;    //关标向下
  
  
  XStartRemain=((LeftTopX>>3)<<3)+7-LeftTopX;
  LeftTopX>>=3;
  
  XEndRemain=RightBottomX-((RightBottomX>>3)<<3);
  RightBottomX>>=3;
  
  //设置关标位置
  
  if(XStartRemain<=7)
  {
     LCDPORTCMD = LCD_CSRW;        //设置关标位置	
     LCDDELAY;	
     LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LeftTopX) & 0x0ff ;	//
     LCDDELAY;	
     LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LeftTopX) >> 8 ;
     LCDDELAY;
     
     LCDPORTCMD = LCD_MWRITE;
     
     if(LeftTopX<RightBottomX)
     {
         for(LineY=LeftTopY;LineY<=RightBottomY;LineY++)   //画左边界      
         {
            Set_Varam_Code(&vramValue[LineY][LeftTopX],0,XStartRemain,mode);
            LCDDELAY;	
	 	    LCDPORTDATA = vramValue[LineY][LeftTopX];    
          }
      }
      else                             //处于同一块区域
      {
         for(LineY=LeftTopY;LineY<=RightBottomY;LineY++)   //画左边界      
         {
            Set_Varam_Code(&vramValue[LineY][LeftTopX],7-XEndRemain,XStartRemain,mode);
            LCDDELAY;	
	 	    LCDPORTDATA = vramValue[LineY][LeftTopX];     
          }
          return 0;
      }
     LeftTopX++; 
  }
  
  //中间区域
  for(LineX=LeftTopX;LineX<RightBottomX;LineX++)
  {
      //设置光标位置
      LCDPORTCMD = LCD_CSRW;        //设置关标位置	
      LCDDELAY;	
      LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LineX) & 0x0ff ;	//
      LCDDELAY;	
      LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+LineX) >> 8 ;
      LCDDELAY;
     
      LCDPORTCMD = LCD_MWRITE;
      for(LineY=LeftTopY;LineY<=RightBottomY;LineY++)   //画左边界      
      {
            Set_Varam_Code(&vramValue[LineY][LineX],0,7,mode);
            LCDDELAY;	
	 	    LCDPORTDATA = vramValue[LineY][LineX];     
      }
  }
  
  //右边区域
  if(XEndRemain>0)
  {
      //设置关标位置
      LCDPORTCMD = LCD_CSRW;        //设置关标位置	
      LCDDELAY;	
      LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+RightBottomX) & 0x0ff ;	//
      LCDDELAY;	
      LCDPORTDATA = ((PScroll[4]<<8)+LeftTopY*PSystemSet[6]+RightBottomX) >> 8 ;
      LCDDELAY;
      
      LCDPORTCMD = LCD_MWRITE;
      for(LineY=LeftTopY;LineY<=RightBottomY;LineY++)   //画左边界      
      {
            Set_Varam_Code(&vramValue[LineY][RightBottomX],7-XEndRemain,7,mode);
            LCDDELAY;	
	 	    LCDPORTDATA = vramValue[LineY][RightBottomX];   
      }
  } 
  return 0;
}

//打点子程序
int dot(int x, int y, int mode){
	int value;				

	if( x < 0 || x >= LCD_MAXX || y < 0 || y >= LCD_MAXY )
		return -1; 
				
/*	LCDDELAY;	
	LCDPORTCMD = LCD_CSRW;	
		
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) >> 8 ;	//

	LCDDELAY;	
	LCDPORTCMD = LCD_MREAD;	//

	LCDDELAY;	
	value = LCDPORTDATA ;   */     

	value = vramValue[y][(x-x%8)/8];
	switch (mode){
		case LCD_SET:
			value = value | (1<<(7-x%8));
			break;
		case LCD_CLR:
			value = value & (0x0ff-(1<<(7-x%8)));
			break;
		case LCD_TOG:
			value = value ^ (1<<(7-x%8));
			break;	
	}
	vramValue[y][(x-x%8)/8] = value;	
			
	LCDDELAY;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) & 0x0ff ;	//
	LCDDELAY;	
	LCDPORTDATA = ((PScroll[4]<<8)+(y)*PSystemSet[6]+(x-x%8)/8) >> 8 ;	//

	LCDDELAY;	
	LCDPORTCMD = LCD_MWRITE;	//

	LCDDELAY;	
	LCDPORTDATA = value;


	LCDDELAY;	
	LCDPORTCMD = LCD_CSRR;	//
	LCDDELAY;
	value = LCDPORTDATA;
	LCDDELAY;	
	value = LCDPORTDATA;	

	return value;
	
	}
	
//打点子程序


void CLEAR(void){
	long i,j; 
	LCDDELAY;	
	LCDPORTCMD = LCD_CSRRIGHT;	

	LCDDELAY;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = 0;	//
	LCDDELAY;	
	LCDPORTDATA = 0;	//

	LCDDELAY;	
	LCDPORTCMD = LCD_MWRITE;	//
	
	for(i=0;i<32768;i++){             //清缓冲内存240×40 
		LCDDELAY;	
		LCDPORTDATA = 0X00;
	}
	
	for(i=0;i<LCD_MAXY;i++)
        for(j=0;j<LCD_MAXX/8;j++)
               vramValue[i][j]=0;

}

//清除液晶显示RAM缓冲区

void Black(void){
	long i; 
	LCDDELAY;	
	LCDPORTCMD = LCD_CSRRIGHT;	

	LCDDELAY;	
	LCDPORTCMD = LCD_CSRW;	
	LCDDELAY;	
	LCDPORTDATA = 0;	//
	LCDDELAY;	
	LCDPORTDATA = 0;	//

	LCDDELAY;	
	LCDPORTCMD = LCD_MWRITE;	//
	
	for(i=0;i<32768;i++){
		LCDDELAY;	
		LCDPORTDATA = 0xFf;
	}
    
    
}

//刷新显示RAM缓冲区

void Delay_ns(int time)
{	int i;

	for(i=0;i<time;i++)
		asm("	nop"); 
		
	return;	
}

void Set_Varam_Code(unsigned int *Code,int Startbit,int Endbit,int Mode)
{
  int i,StartCode,MaskCode;
  StartCode=(1<<Startbit);
  MaskCode=StartCode;
  for(i=Startbit;i<Endbit;i++)
  {
     MaskCode<<=1;
     MaskCode+=StartCode; 
  } 
  switch(Mode)
  {
     case LCD_SET:
		  *Code = *Code | MaskCode;
		  break;
	 case LCD_CLR:
		 *Code = *Code & (0xff-MaskCode);
		  break;
	 case LCD_TOG:
		  *Code = *Code ^ MaskCode;
		  break;	
    
  } 
}

void PHANTOM() {

}

⌨️ 快捷键说明

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