📄 oscilloscope3.c
字号:
distab[3]=0x10;
distab[4]=0x10;
distab[5]=0x10;
distab[6]=0x10;
distab[7]=0x04;
}
//***************************************************************************************
void Vertical_MoveB()
{
Shift_Flag=1;
LED_CURSOR=2;
Key_Flag=7;
lcd_clear();
Led_On=1;
Glint_Flag=1;
lcd_write_sentence(1,0,"请输入纵向平移值");
lcd_write_sentence(2,1,"B 路波形");
distab[0]=0x00;
distab[1]=0x00;
distab[2]=0x00;
distab[3]=0x10;
distab[4]=0x10;
distab[5]=0x10;
distab[6]=0x10;
distab[7]=0x05;
}
//***************************************************************************************
void Frequence_Measure() //测量当前波形的频率和波形
{
long temph,templ;
unint temp;
//Frequence_Measure_Flag=!Frequence_Measure_Flag;
//while(Frequence_Measure_Flag)
//{
unint i=5000;
Frequence_Start=1;
Frequence_Start=0;
while(--i);
temph=Wave_Frequence_High;
templ=Wave_Frequence_Low;
//templ=(templ+temph<<8)*3052/100;
//temph=temph<<8;
//temp=(templ+temph)*61;
//Wave_Frequence=temp>>1;
Wave_Frequence=(templ+temph*0x100)*2;
//Wave_Frequence=10000000/(templ+temph*0x100);
lcd_clear();
lcd_write_sentence(1,0,"当前频率: ");
//lcd_write_sentence(2,1,"A 路波形");
lcd_write_command(0x91);
temp=Wave_Frequence/10000;
lcd_write_data(0x30+temp);
Wave_Frequence%=10000;
temp=Wave_Frequence/1000;
lcd_write_data(0x30+temp);
Wave_Frequence%=1000;
temp=Wave_Frequence/100;
lcd_write_data(0x30+temp);
Wave_Frequence%=100;
temp=Wave_Frequence/10;
lcd_write_data(0x30+temp);
Wave_Frequence%=10;
temp=Wave_Frequence;
lcd_write_data(0x30+temp);
//Wave_Frequence%=10000;
lcd_write_sentence(2,4," HZ");
//}
//lcd_write_sentence(2,5,"暂停");
//以下为测量幅度
temp=Wave_Amplitude_Add;
switch(Vertical_Gain_B_Grade)
{
case 0:
Wave_Amplitude=(temp*8)/255;
break;
case 1:
Wave_Amplitude=(temp*16)/255;
break;
case 2:
Wave_Amplitude=(temp*40)/255;
break;
case 3:
Wave_Amplitude=(temp*100)/255;
break;
case 4:
Wave_Amplitude=(temp*160)/255;
break;
case 5:
Wave_Amplitude=(temp*500)/255;
break;
case 6:
Wave_Amplitude=(temp*800)/255;
break;
case 7:
Wave_Amplitude=(temp*1600)/255;
break;
default:
break;
}
//Wave_Amplitude=temp;
lcd_write_sentence(3,0,"当前幅度: ");
lcd_write_command(0x99);
temp=Wave_Amplitude/100;
lcd_write_data(0x30+temp);
lcd_write_sentence(4,2,".");
Wave_Amplitude%=100;
temp=Wave_Amplitude/10;
lcd_write_data(0x30+temp);
Wave_Amplitude%=10;
temp=Wave_Amplitude;
lcd_write_data(0x30+temp);
//Wave_Frequence%=10000;
lcd_write_sentence(4,4," V");
}
//***************************************************************************************
void ENTER_down() //ENTER键按下,根据特殊功能号,执行相应的功能
{
unint temp;
ENTER=!ENTER;
//Led_On=0;
Glint_Flag=!Glint_Flag;
Shift_Flag=0;
switch(Key_Flag)
{
case 1:
X_Frequence=distab[4]*10000+distab[3]*1000+distab[2]*100+distab[1]*10+distab[0];
//Frequence*=5;
temp=_iror_(X_Frequence,8);
X_Freq_High=temp;
temp=X_Frequence%256;
X_Freq_Low=temp;
ENTER=0;
lcd_clear();
lcd_write_sentence(1,0,"频率设置成功!");
lcd_write_sentence(2,1,"当前频率:");
lcd_write_command(0x89);
lcd_write_data(0x30+distab[4]);
lcd_write_data(0x30+distab[3]);
lcd_write_data(0x30+distab[2]);
lcd_write_data(0x30+distab[1]);
lcd_write_data(0x30+distab[0]);
lcd_write_sentence(3,4,"HZ");
break;
case 2:
ENTER=0;
lcd_clear();
X_Pos=distab[2]*100+distab[1]*10+distab[0];
if(X_Pos>200)
{
X_Pos=0;
lcd_write_sentence(2,0,"输入范围太大!");
}
else
{
X_Move=X_Pos;
lcd_write_sentence(1,0,"水平移相成功");
lcd_write_sentence(2,1,"当前水平偏移:");
lcd_write_command(0x8a);
lcd_write_data(0x30+distab[2]);
lcd_write_data(0x30+distab[1]);
lcd_write_data(0x30+distab[0]);
}
break;
case 3:
ENTER=0;
lcd_clear();
Trigger_V=distab[2]*100+distab[1]*10+distab[0];
if(Trigger_V>500)
{
lcd_write_sentence(1,0,"电平输入太大!");
lcd_write_sentence(2,0,"请重新输入!");
Trigger_V=0;
}
else
{
Trigger_Voltage=Trigger_V/2;
lcd_write_sentence(1,0,"触发电平设置成功");
lcd_write_sentence(2,1,"当前触发电平:");
lcd_write_command(0x89);
lcd_write_data(0x30+distab[2]);
lcd_write_sentence(3,2,".");
lcd_write_data(0x30+distab[1]);
lcd_write_data(0x30+distab[0]);
lcd_write_sentence(3,4,"V");
}
break;
case 6:
Vertical_Pos_A=distab[2]*100+distab[1]*10+distab[0];
Vertical_Move_A=Vertical_Pos_A;
lcd_clear();
lcd_write_sentence(1,1,"当前垂直偏移A:");
lcd_write_command(0x91);
lcd_write_data(0x30+distab[2]);
lcd_write_data(0x30+distab[1]);
lcd_write_data(0x30+distab[0]);
break;
case 7:
Vertical_Pos_B=distab[2]*100+distab[1]*10+distab[0];
Vertical_Move_B=Vertical_Pos_B;
lcd_clear();
lcd_write_sentence(1,1,"当前垂直偏移B:");
lcd_write_command(0x91);
lcd_write_data(0x30+distab[2]);
lcd_write_data(0x30+distab[1]);
lcd_write_data(0x30+distab[0]);
break;
default:
break;
}
}
//***************************************************************************************
void keyprg(unchar key) //键盘键值执行的程序
{
//unchar i;
if((key<=9)&Shift_Flag)
{
distab[LED_CURSOR]=KEYNUM; //键值送入distab最低位保存
if(LED_CURSOR>0) //光标移位
LED_CURSOR--;
else
LED_CURSOR=0;
display(0); //显示键值
}
else
{
switch(key)
{
case 0x00:
Set_X_Freq();
break;
case 0x01:
Set_X_Pos();
break;
case 0x02:
Set_Trigger_Voltage();
break;
case 0x03:
Lock_Current_Wave();
break;
case 0x04:
Single_Select();
break;
case 0x05:
Vertical_GainA();
break;
case 0x06:
//Vertical_GainB();
Frequence_Measure();
break;
case 0x07:
Vertical_MoveA();
break;
case 0x08:
Vertical_MoveB();
break;
case 0x09:
//Select_AB_Channel();
Input_Select();
break;
case 0x0A:
//Reset();
//Input_Select();
//Frequence_Measure();
break;
case 0x0B: //功能键F2
Shift_Flag=!Shift_Flag;
break;
case 0x0C: //KeyprgBack();
if(LED_CURSOR<7) //光标移位
LED_CURSOR++;
else
LED_CURSOR=0;
display(0); //显示键值
break;
case 0x0D: //加
if(distab[LED_CURSOR]<0x09)
distab[LED_CURSOR]++;
else
distab[LED_CURSOR]=0;
display(0); //显示键值
break;
case 0x0E: //减
if(distab[LED_CURSOR]>0)
distab[LED_CURSOR]--;
else
distab[LED_CURSOR]=9;
display(0); //显示键值
break;
case 0x0F:
ENTER_down();
break;
default:
break;
}
}
}
//**************************************************************************************
void intt0() interrupt 0 //键盘中断
{
//EX0=0; //关键盘中断,禁止相应其他按键
KEYNUM=P1; //从p1口读入键盘值
KEYNUM=KEYNUM&0x0f; //取低四位;
keyprg(KEYNUM);
//if(ENTER) //不是ENTER键,屏蔽中断
//EX0=1;
}
//**************************************************************************************
void Initial8155() //8155初始化程序
{
CMD8155=0x0f; //PA,PB基本输出方式,PC作为控制信号
}
//**************************************************************************************
void clock0_initial() //定时器0初始化
{
TMOD=0x01;
TF0=0;
TH0=00;
TL0=00;
TR0=1;
}
void clock0_int() interrupt 1 //定时器0中断,向FPGA送入连续触发脉冲
{
TH0=00;
TL0=00;
tempflag=!tempflag;
//if(Single_Flag)
Single_Auto_Select=tempflag;
//PA8155=tempflag;
//PB8155=tempflag;
}
//**************************************************************************************
void main()
{
//uint i;
//while(i--);
EX0=1;
ET0=1;
EA=1;
PX0=1;
lcd_init();
Initial8155();
Led_On=1;
display(0);
lcd_write_passage("南开大学信科院电信系:史永杰,余建伟,岳文赫-- 简易示波器");
//lcd_clear();
//lcd_write_sentence(4,4,"南开大学");
FpgaInitial();
clock0_initial();
while(1)
{
if(Glint_Flag)
glint();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -