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

📄 adda.c

📁 C8051FTest.rar 是C8051F系列处理器的基本测试程序
💻 C
📖 第 1 页 / 共 2 页
字号:
					DACdata[2*i]=((0xFFF-(unsigned long)(0xFFF/(ADDAParaList[5]*0.64)*(i-(ADDAParaList[3]+ADDAParaList[4])*0.64)))*ADDAParaList[2]/24)>>8;
					DACdata[2*i+1]=((0xFFF-(unsigned long)(0xFFF/(ADDAParaList[5]*0.64)*(i-(ADDAParaList[3]+ADDAParaList[4])*0.64)))*ADDAParaList[2]/24);				
				}
				for(;i<64;i++)		//低电平
				DACdata[2*i]=DACdata[2*i+1]=0;
			}
			return;					
		}	
	}//while(1)
}

void DrawScale()					//在3区绘制坐标刻度
{	
	int i,j;
	unsigned int TriggerLine=176-TriggerValue*16/300;;		//触发线坐标
	CS=0;
	LCD_RAM_ORG=LCD_Area3;
	
	//纵轴
	CmdWrite(CSRDIR_DOWN);
	for(i=0;i<7;i++)
	{
		unsigned char Mode=0x80;
		Locatexy((10+50*i)/8,16);
		for(j=0;j<(10+50*i)%8;j++)
		Mode=Mode>>1;
		CmdWrite(MWRITE);
		for(j=0;j<80;j++)
		{
			DataWrite(Mode);
			DataWrite(0);
		}
	}
	//横轴
	CmdWrite(CSRDIR_RIGHT);
	for(i=0;i<7;i++)
	{
		Locatexy(1,176-i*27);
		CmdWrite(MWRITE);
		for(j=0;j<38;j++)
		DataWrite(0xAA);
	}
	//绘制触发线
	Locatexy(1,TriggerLine);
	CmdWrite(MWRITE);
	for(i=0;i<38;i++)
	DataWrite(0xFF);

	LCD_RAM_ORG=LCD_Area1;
	CS=1;
}

void ADC0_ISR() interrupt 15		//采集AD数据
{
	char Stats=0;			//0:<  1:>
	AD0INT=0;
	if(ADcounter==0)
	{
		if(ADC0H>ADH_TriggerValue)
		Stats=1;
		if(ADC0H==ADH_TriggerValue)
		{
			if(ADC0L>ADL_TriggerValue)
			Stats=1;
		}

		if(TriggerMode==0)
		{
			if(LastStats==0 && Stats==1)
			{
				ADCdata[ADcounter]=ADC0H;
				ADcounter++;
			}
		}
		if(TriggerMode==1)
		{
			if(LastStats==1 && Stats==0)
			{
				ADCdata[ADcounter]=ADC0H;
				ADcounter++;
			}
		}
		if(TriggerMode==2)
		{
			if(LastStats+Stats==1)
			{
				ADCdata[ADcounter]=ADC0H;
				ADcounter++;
			}
		}
		LastStats=Stats;
	}
	else
	{
		if(ADcounter<304)
		{
			ADCdata[ADcounter]=ADC0H;
			ADcounter++;
		}
		else
		{
			LastStats=2;
			ready=1;
		}
	}

}

void DrawGraph()			//根据ADCdata中数据绘制曲线
{
	unsigned char row,col,k;
	CS=0;
	Locatexy(0,17);						//定位在显示区(16~176行)
	CmdWrite(CSRDIR_RIGHT);
	CmdWrite(MWRITE);					//发写命令
	for(row=16;row<=176;row++)			//对16~176行绘图
	{
		unsigned char value=176-row;	//第row行所对应的ADC值
		for(col=0;col<40;col++)			//每行40个字节
		{
			unsigned char Data=0;
			unsigned char M=0x80;
			if(col==0 || col==39)		//第一列和最后一列不使用
			{
				DataWrite(Data);
				continue;
			}
			for(k=0;k<8;k++)			//分析每个字节应写入的数值
			{
				if(ADCdata[(col-1)*8+k]==value)
				Data|=M;
				else
				{
					char m=0;
					if(ADCdata[(col-1)*8+k]<value)	//value>当前值 m++
					m++;
					if(ADCdata[(col-1)*8+k+1]>value)//value<下一值 m--
					m--;
					if(m==0)		//m=0说明value在两值之间,该位应该置一
					Data|=M;
				}
				M=M>>1;
			}
			DataWrite(Data);
		}
	}
	CS=1;
}

void ADDA()
{
	ADDASetUp();						//设置
	Clear(0,240);
	DrawScale();
	//界面
    Udprintf(0,192," 16KHz       0mv     钬                 ");
	putufig(10,192,TriggerValue,4,1,' ');
	dprintf(0,208,"采样频率  触发电平  触发            退出");
	dprintf(0,224,"柽2 刍2    芗  兦   模式            实验");
	if(ADDAParaList[0]==0)
	;//显示正弦波
	if(ADDAParaList[0]==1)
	;//显示梯形波
	ADC0_Init();						//AD初始化
	AD_T3_INIT();						//T3初始化,驱动AD
	EIE2|=0x02;							//开ADC0中断		
	while(1)
	{
		if(CheckKeyF==1)				//键盘检测
		{
			CheckKey();
			CheckKeyF=0;
		}

		if(Key[0].pressed==1)				//检测到*2键
		{
			if(ADDAParaList[6]<64)
			{	
				unsigned int T3Value;
				ADDAParaList[6]*=2;
				T3Value=0xFFFF-(unsigned int)22118/ADDAParaList[6];
				SFRPAGE = TMR3_PAGE;
				TR3=0;
 				TMR3L=T3Value;
    			TMR3H=T3Value>>8;
    			RCAP3L=TMR3L;
    			RCAP3H=TMR3H;
				TR3=1;
				SFRPAGE = CONFIG_PAGE;	
				putufig(1,192,ADDAParaList[6],2,1,' ');
			}
			Key[0].pressed=0;
		}

		if(Key[1].pressed==1)				//检测到/2键
		{
			if(ADDAParaList[6]>2)
			{
				unsigned int T3Value;
				ADDAParaList[6]/=2;
				T3Value=0xFFFF-(unsigned int)22118/ADDAParaList[6];
				SFRPAGE = TMR3_PAGE;
				TR3=0;
 				TMR3L=T3Value;
    			TMR3H=T3Value>>8;
    			RCAP3L=TMR3L;
    			RCAP3H=TMR3H;
				TR3=1;	
				SFRPAGE = CONFIG_PAGE;
				putufig(1,192,ADDAParaList[6],2,1,' ');
			}
			Key[1].pressed=0;
		}

		if(Key[2].pressed==1)				//提高触发电平
		{
			Key[2].pressed=0;
			if(TriggerValue<3000)			//触发值0~3000mv
			{
				TriggerValue+=100;			//步长100mv
				//调整TriggerValue对应的ADC值 (TriggerValue/3000mv*(1.5v/2.4v*4096))
				ADH_TriggerValue=((unsigned long)TriggerValue*64/75)>>4;
				ADL_TriggerValue=((unsigned long)TriggerValue*64/75)<<4;
				Clear(240+14,240+176);
				DrawScale();
				putufig(10,192,TriggerValue,4,1,' ');
			}
		}

		if(Key[3].pressed==1)				//降低触发电平
		{
			Key[3].pressed=0;
			if(TriggerValue>0)
			{			
				TriggerValue-=100;
				ADH_TriggerValue=((unsigned long)TriggerValue*64/75)>>4;
				ADL_TriggerValue=((unsigned long)TriggerValue*64/75)<<4;			
				Clear(240+14,240+176);
				DrawScale();
				putufig(10,192,TriggerValue,4,1,' ');
			}
		}

		if(Key[4].pressed==1)				//改变触发模式
		{
			TriggerMode=(++TriggerMode)%3;
			if(TriggerMode==0)
			Udprintf(21,192,"牲");
			if(TriggerMode==1)
			Udprintf(21,192,"豇");
			if(TriggerMode==2)
			Udprintf(21,192,"钬");
			Key[4].pressed=0;
		}

		if(ready==1)
		{
			DrawGraph();
			ready=0;
			ADcounter=0;
		}
	
		if(Key[7].pressed==1)       	//检测到退出键
		{
			char SFRPAGE_SAVE;
			SFRPAGE_SAVE=SFRPAGE;
   		 	SFRPAGE = DAC0_PAGE;		//关DAC
			DAC0CN&=0x7f;
   		 	SFRPAGE = ADC0_PAGE;		//关DAC
			ADC0CN&=0x7f;			
			SFRPAGE = TMR3_PAGE;		//关T3				                  
			TR3=0;
			SFRPAGE = TMR4_PAGE;		//关T4				                  
			TR4=0;					
			SFRPAGE=SFRPAGE_SAVE;
			ClearKey();
			Clear(0,480);
			return;
		}
	}
}

/*
		if(ready==1)
		{
			int i,j;
			int p=700;
			Clear(16,176);
			for(i=0;i<700;i++)				//每次选择零点为显示起始点,找不到零点则显示后300个点
			{
				if(ADCdata[i]==0 && ADCdata[i+1]>0 && ADCdata[i+2]>0)			
				{
					p=i;
					break;	
				}		
			}
			for(i=1;i<300;i++)
			{
				if(ADCdata[p+i]==ADCdata[p+i-1])
				Point(10+i,176-ADCdata[p+i]);
				if(ADCdata[p+i]<ADCdata[p+i-1])
				{
					for(j=ADCdata[p+i-1]-1;j>=ADCdata[p+i];j--)
					Point(10+i,176-j);
				}
				if(ADCdata[p+i]>ADCdata[p+i-1])
				{
					for(j=ADCdata[p+i-1]+1;j<=ADCdata[p+i];j++)
					Point(10+i,176-j);
				}
			}
			ready=0;
			ADcounter=0;
		}

		*/

⌨️ 快捷键说明

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