📄 main.#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 + -