📄 oscilloscope1.c
字号:
#include<AT89X52.H>
#include<absacc.h>
#include<intrins.h>
#define unchar unsigned char
#define unint unsigned int
#define DisCmd XBYTE [0xC100] //7218控制字地址
#define DisData XBYTE [0xC000] //7218数据口地址
#define LedMode P1_5
#define scode 0xb0 //7218软件译码方式命令字
#define bcode 0x90 //B码译码方式命令字
#define hexcode 0xd0 //软件译码方式命令字
#define CMD8155 XBYTE[0XEFF0] //8155命令口
#define PA8155 XBYTE[0XEFF1] //8155PA口
#define PB8155 XBYTE[0XEFF2] //8155PB口
#define PC8155 XBYTE[0XEFF3] //8155PC口
//*****************************************************************************************************
#define Wave_Frequence_Low XBYTE[0XA0F0] //测量波形频率低位
#define Wave_Frequence_High XBYTE[0XA0F1] //测量波形频率高位
//#define Wave_Amplitude_Add XBYTE[0XA0F2] //测量波形幅度
//#define Select_A XBYTE[0xA0F3] //|A路选通/断路 | 01/00
#define Select_AB XBYTE[0xA0F3] //|A,B路选通/断路 | 01/02/03(A,B,AB)
#define Frequence_Start XBYTE[0XA0F4] //频率测量控制字口
//#define Vertical_Gain_A XBYTE[0xA0F4] //|A垂直增益挡位(三挡) | 00/01/02
#define Vertical_Move_A XBYTE[0xA0F5] //|A垂直移动波形 | 00 ~ FF
//#define Select_B XBYTE[0xA0F6] //|B路选通/断路 | 01/00
//#define Vertical_Gain_B XBYTE[0xA0F7] //|B垂直增益挡位(三挡) | 00/01/02
#define Vertical_Move_B XBYTE[0xA0F8] //|B垂直移动波形 | 00 ~ FF
#define Single_Auto_Select XBYTE[0xA0F9] //|单次/连续触发方式切换; | 01/00
#define Trigger_Voltage XBYTE[0xA0FA] //|单次触发电平值 | 00 ~ FF
#define Lock_Wave XBYTE[0xA0FB] //|锁存当前波形; | 先01后00
#define X_Freq_High XBYTE[0xA0FC] //|水平增益频率高八位; | 00 ~ 3F
#define X_Freq_Low XBYTE[0xA0FD] //|水平增益频率低八位; | 00 ~ FF
#define X_Move XBYTE[0xA0FE] //|水平移动相位八位; | 00 ~ C7
#define RESET XBYTE[0xA0FF] //|重置信号reset; | 置01
//*****************************************************************************************************
bit Enter; //enter键按下标志
bit Glint_Flag; //闪烁标志位
bit Special_Down_Flag;
bit Shift_Flag;
bit Lock_Wave_Flag;
//bit Select_A_Flag;
//bit Select_B_Flag;
//bit Lock_Wave;
bit Led_On=1;
bit tempflag;
unchar Select_Flag;
unchar AD_Channel;
//unchar AD_Controll;
long Wave_Frequence;
//unchar Wave_Amplitude;
//unchar Frequence_Measure_Flag; //波形频率测量标志
unchar keynum;
unchar Single_Flag; //单步标志
unchar Vertical_Pos_A; //垂直偏移位置A
unchar Vertical_Pos_B; //垂直偏移位置B
unchar Vertical_Gain_A_Grade; //垂直增益等级A
unchar Vertical_Gain_B_Grade; //垂直增益等B
unint X_Frequence; //X轴扫描频率
unint X_Pos; //X轴平移位置
unint Trigger_V; //触发电平
unchar Key_Flag; //功能键按键标志
unchar ledcursor=7; //保存光标当前位置
unchar distab[8]={0x12,0x13,0x14,0x00,0x12,0x12,0x0e,0x11}; //要显示的内容 hello-pp
unchar code ledtab[]={ 0xfb,0xb0,0xed,0xf5,0xb6,0xd7,0xdf,0xf0,
//0, 1, 2, 3, 4, 5, 6, 7
0xff,0xf7,0xfe,0x9f,0xcb,0xbd,0xcf,0xce,
//8 ,9 ,a ,b ,c ,d ,e ,f
0x80,0xbe,0x8b,0xee,0x84 };
//熄灭 H L P -
//*****************************************************************************************************
extern void lcd_init();
extern void lcd_write_passage(unchar *string);
extern void lcd_write_sentence(unchar row,unchar col,unchar *string);
extern void lcd_write_command(unchar c);
extern void lcd_write_data(unchar ddata); //向LCD模块的字符发生器或显存写一个字节data。
extern void lcd_clear();
//*****************************************************************************************************
void delay200ms()
{
int i=10000,j=1000;
for(;i>0;i--)
for(;j>0;j--);
}
//***************************************************************************************
void display(unchar dot)
{
unchar i;
LedMode=1;
DisCmd=scode; //采用软件译码
LedMode=0;
if(Led_On)
{
for(i=0;i<8;i++) //将distab中的数据送如7218
{
if((i==dot)&(dot!=0))
DisData=ledtab[distab[i]]+0x80; //查表转化并将字型送入7218
else
DisData=ledtab[distab[i]]; //查表转化并将字型送入7218
}
}
}
//***************************************************************************************
void distab_clear()
{
unchar i;
for(i=0;i<8;i++)
{
distab[i]=0x10;
}
}
//***************************************************************************************
void glint() //glintflag为1闪烁,flag为0,不闪烁;
{
unchar i;
while(Glint_Flag&Led_On) //光标位置闪烁
{
LedMode=1;
DisCmd=scode; //采用软件译码
LedMode=0;
for(i=0;i<8;i++) //将distab中的数据送如7218
{
if(i==ledcursor)
DisData=0x80; //查表转化并将字型送入7218
else
DisData=ledtab[distab[i]]; //查表转化并将字型送入7218
}
delay200ms();
LedMode=1;
DisCmd=scode;
display(0);
delay200ms();
}
}
//***************************************************************************************
/*初始化:A0F3:1, A0F4:2, A0F5:00, A0F6:0, A0F7:2, A0F8:00, A0F9:0,
A0FA:00, A0FB:0, A0FC:40, A0FD:00;初始挡位, A0FE:00 */
void FpgaInitial() //初始化程序
{
Select_AB=1;
// Vertical_Gain_A=2;
Vertical_Move_A=0;
//Select_A=0;
//Vertical_Gain_B=2;
Vertical_Move_B=0;
Single_Auto_Select=0;
Trigger_Voltage=0;
Lock_Wave=0;
X_Freq_High=0x03;
X_Freq_Low=0xE8;
X_Move=0;
Frequence_Start=0;
}
//***************************************************************************************
void Reset() //Fpga复位
{
//Special_Down_Flag=1;
RESET=00;
}
//***************************************************************************************
void Set_X_Freq() //设置X轴扫描频率,Key_Flag:1
{
Shift_Flag=1;
//unint Freq,temp;
Led_On=1;
Key_Flag=1;
ledcursor=4;
Glint_Flag=1;
distab[0]=0x00;
distab[1]=0x00;
distab[2]=0x00;
distab[3]=0x00;
distab[4]=0x00;
distab[5]=0x10;
distab[6]=0x10;
distab[7]=0x01;
display(0);
lcd_clear();
lcd_write_sentence(1,0,"请输X 轴扫描频率");
lcd_write_sentence(2,1,"频率范围:");
lcd_write_sentence(3,1,"0-100KHZ");
}
//***************************************************************************************
void Set_X_Pos()
{
Shift_Flag=1;
lcd_clear();
Key_Flag=2;
ledcursor=2;
Glint_Flag=1;
Led_On=1;
distab[0]=0x00;
distab[1]=0x00;
distab[2]=0x00;
distab[3]=0x10;
distab[4]=0x10;
distab[5]=0x10;
distab[6]=0x10;
distab[7]=0x02;
display(0);
lcd_write_sentence(1,0,"请输入水平移相");
lcd_write_sentence(2,1,"位置范围:");
lcd_write_sentence(3,2,"0-200");
}
void Set_Trigger_Voltage()
{
Shift_Flag=1;
lcd_clear();
Key_Flag=3;
ledcursor=2;
Led_On=1;
Glint_Flag=1;
distab[0]=0x00;
distab[1]=0x00;
distab[2]=0x00;
distab[3]=0x10;
distab[4]=0x10;
distab[5]=0x10;
distab[6]=0x10;
distab[7]=0x03;
//display(2);
lcd_write_sentence(1,0,"请输入触发电平");
lcd_write_sentence(2,1,"电平范围:");
lcd_write_sentence(3,2,"0-5V");
}
//***************************************************************************************
void Lock_Current_Wave()
{
//Special_Down_Flag;
Lock_Wave_Flag=!Lock_Wave_Flag;
Led_On=0;
//Lock_Wave=Lock_Wave_Flag;
lcd_clear();
if(Lock_Wave_Flag)
{
lcd_write_sentence(2,1,"波形锁存成功!");
Lock_Wave=1;
}
else
{
lcd_write_sentence(2,1,"波形解除锁定!");
Lock_Wave=0;
}
}
//***************************************************************************************
void Single_Select()
{
//Special_Down_Flag
lcd_clear();
Led_On=0;
Single_Flag=!Single_Flag;
//Single_Auto_Select=Single_Flag;
lcd_clear();
lcd_write_sentence(1,0,"当前触发状态:");
if(Single_Flag)
{
lcd_write_sentence(2,1,"单步");
TR0=0;
Single_Auto_Select=1;
Single_Auto_Select=0;
}
else
{
lcd_write_sentence(2,1,"连续");
TR0=1;
}
}
//***************************************************************************************
/*
void Select_AB_Channel()
{
lcd_clear();
Led_On=0;
// if(Select_Flag%3)
// Select_Flag=0;
// else
// {
if(AD_Controll)
{
switch(Select_Flag%3)
{
case 0:
Select_AB=1;
//Select_B=0;
lcd_clear();
lcd_write_sentence(2,1,"A 路选通");
lcd_write_sentence(3,1,"B 路关闭");
break;
case 1:
Select_AB=2;
//Select_B=1;
lcd_clear();
lcd_write_sentence(2,1,"A 路关闭");
lcd_write_sentence(3,1,"B 路选通");
break;
case 2:
Select_AB=3;
//Select_B=1;
lcd_clear();
lcd_write_sentence(2,1,"A 路选通");
lcd_write_sentence(3,1,"B 路选通");
break;
default:
break;
// }
}
Select_Flag++;
}
}
*/
//***************************************************************************************
void Input_Select() //AD114输入选择
{
unchar temp1,temp2;
temp1=AD_Channel%3;
temp2=PB8155;
temp2=temp2&0xFC;
switch(temp1)
{
case 0:
//AD_Controll=0;
PB8155=temp2;
lcd_clear();
lcd_write_sentence(2,1,"A 路选通");
lcd_write_sentence(3,1,"B 路关闭");
Select_AB=1;
break;
case 1:
//AD_Controll=0;
PB8155=temp2+2;
Select_AB=2;
lcd_clear();
lcd_write_sentence(2,1,"A 路关闭");
lcd_write_sentence(3,1,"B 路选通");
break;
case 2:
//AD_Controll=1;
lcd_clear();
PB8155=temp2+1;
lcd_write_sentence(2,1,"A 路选通");
lcd_write_sentence(3,1,"B 路选通");
Select_AB=3;
break;
}
AD_Channel++;
}
//***************************************************************************************
void Vertical_GainA()
{
unchar temp;
Led_On=1;
Key_Flag=4;
if(Vertical_Gain_A_Grade<7)
{
Vertical_Gain_A_Grade++;
}
else
Vertical_Gain_A_Grade=0;
distab_clear();
distab[0]=Vertical_Gain_A_Grade;
display(0);
temp=PB8155;
temp=temp&0x03;
PB8155=temp+_crol_(Vertical_Gain_A_Grade,5);
//if(Vertical_Gain_A_Grade>2)
//Vertical_Gain_A_Grade=0;
//else
//{
// Vertical_Gain_B=Vertical_Gain_B_Grade;
lcd_clear();
lcd_write_sentence(1,0,"当前垂直增益档位");
lcd_write_sentence(2,2,"A 路");
//lcd_write_sentence(3,1,"0.01V/div");
//lcd_write_command(0x8A);
//lcd_write_data(0x30+Vertical_Gain_B_Grade);
switch(Vertical_Gain_A_Grade)
{
case 0:
lcd_write_sentence(3,1,"10mV/div");
break;
case 1:
lcd_write_sentence(3,1,"20mV/div");
break;
case 2:
lcd_write_sentence(3,1,"50mv/div");
break;
case 3:
lcd_write_sentence(3,1,"0.1V/div");
break;
case 4:
lcd_write_sentence(3,1,"0.2V/div");
break;
case 5:
lcd_write_sentence(3,1,"0.5v/div");
break;
case 6:
lcd_write_sentence(3,1,"1V/div");
break;
case 7:
lcd_write_sentence(3,1,"2v/div");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -