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

📄 main.#2

📁 TS12864液晶驱动
💻 #2
字号:
#include"main.h"



#define DEPTH 80                                  //存储深度设置


/********************************************
函数声明
*********************************************/
void Ext0_Interrupt_Init(void);
void GetChannel(void);
void PlaceWindow(void);



/*********************************************
全局变量定义
*********************************************/
//unsigned char xdata trig_word[8];                       //触发字
//unsigned char trig_ch;                            //3级触发时的触发通道
//unsigned char thresholdW;                          //门限电压
unsigned char xdata buf[8];                             //用作临时存储
unsigned char xdata ch[2];                              //存储触发通道号
unsigned char xdata ADC_data[8];                             




void main(void)
{
	unsigned char i;

	Init_Device();
	Init_Max7219();

	Show_Max7219(0000,0000);

	showScreen();                     //用户接口,读取控制字


	SFRPAGE   = TIMER01_PAGE;
    TR0 = 0;                          //关Timer0

	GetChannel();
	Set_Threshold(thresholdW);              //设置门限电压
	FIFO_Init();                      //FIFO初始化
	Ext0_Interrupt_Init();            //外部中断初始化
    
 

    while(FIFO_length()!=40) {}

    if(FIFO_length()==40)
	{
		SFRPAGE = TIMER01_PAGE;
		EA = 0;                       //关所有外部中断
        PlaceWindow();                //放置fifowindow
        
		while((uart_keyboard())==0x0000){}    //等待按键
        keyW = uart_keyboard();
		if(keyW==0x4000)
		{
			for(i=0;i<8;i++)
				Write_Max7219(8-i,fifowindow[i][time_flag]);
			DisplayLogicWave(1);
			PlaceWindow();
			for(i=0;i<8;i++)
				Write_Max7219(8-i,fifowindow[i][time_flag]);
			DisplayLogicWave(65535);
		}

		else if((keyW==0x2000)||(keyW==0x1000))
		{
			while(1)
			{
				for(i=0;i<8;i++)
					Write_Max7219(8-i,fifowindow[i][time_flag]);
				DisplayLogicWave(1);
				while((uart_keyboard())==0x0000){}    //等待按键
        			keyW = uart_keyboard();
				if(keyW==0x1000)
				{
					time_flag++;
					for(i=0;i<8;i++)
						Write_Max7219(8-i,fifowindow[i][time_flag]);
					DisplayLogicWave(1);
				}
				if(keyW==0x2000)
				{
					time_flag--;
					for(i=0;i<8;i++)
						Write_Max7219(8-i,fifowindow[i][time_flag]);
					DisplayLogicWave(1);
				}					
			}
		}
		else 
		{
			while(1)
			{
				for(i=0;i<8;i++)
					Write_Max7219(8-i,fifowindow[i][time_flag]);                //在数码管上显示
				DisplayLogicWave(65535); 
			}          //在示波器上显示
		}

	}
	

                                    
}

/******************************************
外部中断初始化
******************************************/
void Ext0_Interrupt_Init(void)
{
   char SFRPAGE_SAVE = SFRPAGE;

   SFRPAGE = TIMER01_PAGE;

   TCON = 0x01;                        // /INT 0  are falling edge triggered

   EX0 = 1;                            // Enable /INT0 interrupts

   EA  = 1;                            // Enable all interrupts 

   SFRPAGE = SFRPAGE_SAVE;
}

/*******************************************
将trig_ch转换为ch[2]
*******************************************/
void GetChannel(void)
{
	unsigned char i,j;

	j = 0;

	for(i=0;i<8;i++)
	{
		if((trig_ch>>i)&0x01)
        {
			ch[j] = i;
			j++;
    	}
	}
}

/*******************************************
INT0服务函数,将数据按控制字要求采集到fifo中
********************************************/
void GetLogic(void) interrupt 0 
{
    static unsigned char wflag,a;         //写FIFO标志,置1时写FIFO
//	static unsigned char jflag = 1;     //判断标志,置1时判断采到的数据是否与触发字相同
//  static unsigned char len;           //写入FIFO的数据量 
	unsigned char i,k = 0,m = 0,h;              //k:始端触发 识别单级触发字时计数
                                                 //a:识别三级触发字时计数
	                                             //m:非始端触发 识别单级触发字时计数




//采8个通道的逻辑值
//////////////////////////////////////////

	SFRPAGE  = ADC2_PAGE;

	EIP2|=0x10;

	AMX2SL = 0;	
	AD2INT = 0;//清转换中断标志
	AD2BUSY = 1;//置1启动ADC2

	for(i=0;i<7;i++)



	ADC_data[AMX2SL] = AD2WINT;          //AD2WINT;
	AD2WINT = 0;

	do
	{
		AMX2SL++;
		AD2INT = 0;//清转换中断标志
		AD2BUSY = 1;//置1启动ADC2
		for(i=0;i<7;i++)


		ADC_data[AMX2SL] = AD2WINT;//获取比较器的值
		AD2WINT = 0;//清比较器

	}while(AMX2SL!=7);

//////////////////////////////////////////
    k = 0;
   

///////////////////////////////////////////////////////////////////
    if(!trig_delay)               //始端触发
	{
		if(!trig_ch)                       //设置的触发字为单级触发字
		{	
           
			if(!wflag)	                   //尚未开始写FIFO
			{
            	for(i=0;i<8;i++)           //判断所采数据是否与触发字相同
				{
					if(ADC_data[i]!=trig_word[i])
						break;
                    else k++;
				}
				if(k==8)
					wflag = 1; 
			}
			

			if(wflag)  //写FIFO
			{    
	            if(FIFO_length()<DEPTH)
				{
					WriteFIFO(ADC_data);
				}
			}	
		}
////////////////////////////////////////////////////////////////////////////
		else                               //if(trig_ch)   设置的触发字为三级触发字   
		{
			if(wflag!=3)
			{
				for(i=0;i<2;i++)
				{
					if(ADC_data[ch[i]]!=trig_word[a])
						break;
					else a++; 
				}
				if(((a==2)&&(wflag==0))||((a==4)&&(wflag==1))||((a==6)&&(wflag==2)))
				{
					wflag++;
				    WriteFIFO(ADC_data);	
				} 
				else if(a==1) a = 0;
				else if((a==3)||((a==2)&&(wflag==1))) {a = 0; ReadFIFO(buf);wflag--;}
			    else if((a==5)||((a==4)&&(wflag==2))) {a = 0; ReadFIFO(buf);ReadFIFO(buf);wflag-=2;}			 		
			}
			else
			{
				if(FIFO_length()<DEPTH)
				{
					WriteFIFO(ADC_data);
				}
			}
			if(a==6)
				a = 0;	
			h = FIFO_length();		
		}
	}
/////////////////////////////////////////////////////////////////////////
	else                          //if(trig_delay)     非始端触发
	{
		if(!trig_ch)                                   //单级触发
		{
			if(wflag!=trig_delay)
			{
				WriteFIFO(ADC_data);
				wflag++;		
			}
			else
			{
			    for(i=0;i<8;i++)           //判断所采数据是否与触发字相同
				{
					if(ADC_data[i]!=trig_word[i])
						break;
                    else m++;
				}
				if(m==8)
					wflag++;
				else {WriteFIFO(ADC_data);ReadFIFO(buf);}
				if(wflag==trig_delay+1)
				{   
					if(FIFO_length()<DEPTH)
						WriteFIFO(ADC_data);
				}
			}
		}
	
/////////////////////////////////////////////////////////////////////////
		else                                          //三级触发
		{
			if(wflag<trig_delay)
			{
				WriteFIFO(ADC_data);
				wflag++;
			}
			else
			{
				if(wflag!=2+trig_delay)
				{
					for(i=0;i<2;i++)
					{
						if(ADC_data[ch[i]]!=trig_word[a])
							break;
						else a++; 
					}
					if(((a==2)&&(wflag==trig_delay-1))||((a==4)&&(wflag==trig_delay))||((a==6)&&(wflag==1+trig_delay)))
					{
						wflag++;
					    WriteFIFO(ADC_data);	
					} 
					else 
					{
						a = 0;
						wflag = 0;
						FIFO_Init();
					}
			 		
				}
				else
				{
					if(FIFO_length()<DEPTH)
					{
						WriteFIFO(ADC_data);
					}
				}
				if(a==6)
					a = 0;
				
			}	
		}
	}                                
}







/********************************************
放置fifowindow            (未测试)
*********************************************/
void PlaceWindow(void)
{
	unsigned char i,j;

	for(i=0;i<20;i++)
	{
		ReadFIFO(buf);
        for(j=0;j<8;j++)
		{
			fifowindow[j][i] = buf[j];
		}
	}
}

⌨️ 快捷键说明

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