📄 dds.c
字号:
//--------------------------------头文件
#include<reg52.h>
#include <stdlib.h>
//----------------------------------自定义
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
#define send_fpga P0
#define key_port P1
#define control P2
sbit cp=P2^0;
sbit ad=P2^1;
sbit db7=P2^2;
sbit en=P3^5;
sbit rw=P3^6;
sbit rs=P3^7;
bit fre_mode=0; //1在频率模式下
bit ran_mode=0; //1在幅度模式下
bit mut_mode=0; //1在调相模式下
bit no_data=0; //0表示没有输入数据
uchar keycode; //键值
uchar scancode;
uchar wave_one_data=0; //第一路波形控制,0表Sine
uchar wave_two_data=0; //第二路波形控制,0表Sine
uchar road_mode=1; //1表第一路
uchar line[8]; //连接字字符
uchar p=0; //连字符指针
//----------------------
void da_clr(void)
{ uchar i;
for (i=0;i<8;i++)
{line[i]=0;}
}
//----------------------------------串行输入并行输出数据
void da_out(uchar num)
{
uchar i;
for(i=8;i>0;i--)
{
CY=0;
num<<=1;
ad=CY;
cp=0;
cp=1;
}
}
//--------------------------------------忙信号延时
void busy_delay(void)
{ uchar i = 20;
while(i--);
}
//-----------------------------写指令
void write_inst(uchar x)
{
da_out(x);
busy_delay();
rs=0;
rw=0;
en=1;
en=0;
}
//-----------------------------写数据
void write_data(void)
{
da_out(ACC);
busy_delay();
rs=1;
rw=0;
en=1;
en=0;
}
//--------------------------------清屏
void cls(void)
{
write_inst(0x01);
}
//---------------------------------重新定义显示方式
void initial(void)
{
write_inst(0x38); //用8位传输数据,显示用5*7
write_inst(0x0e); //显示器显示,光标显示并闪烁
write_inst(0x06); //每次输入,光标向右移动一格
}
//---------------------------------------查表输入菜单数据
void lcd_show( uchar *see )
{
while(*see)
{
ACC=*see++;
write_data();
}
}
//---------------------------------------显示菜单
void t_first(void)
{cls();
write_inst(0x80); lcd_show(" The ");
write_inst(0xc0); lcd_show(" first road ");
}
//-------------------------------------
void t_second(void)
{cls();
write_inst(0x80); lcd_show(" The ");
write_inst(0xc0); lcd_show(" second road ");
}
//-------------------------------------------
void sine_wave(void)
{cls();
write_inst(0x80); lcd_show(" choose the way ");
write_inst(0xc0); lcd_show(" Sine wave ");
}
//-------------------------------------
void square_wave(void)
{cls();
write_inst(0x80); lcd_show(" choose the way ");
write_inst(0xc0); lcd_show(" Square wave ");
}
//-----------------------------------------
void triangle_wave(void)
{cls();
write_inst(0x80); lcd_show(" choose the way ");
write_inst(0xc0); lcd_show(" Triangle wave ");
}
//-----------------------------------
void teeth_wave(void)
{cls();
write_inst(0x80); lcd_show(" choose the way ");
write_inst(0xc0); lcd_show(" Teeth wave ");
}
//-----------------------------------
void fre_port(void)
{cls();
write_inst(0x80); lcd_show("importation data");
write_inst(0xc0); lcd_show(" Fre: (Hz)"); write_inst(0xc5);
}
//------------------------------------------
void ran_port(void)
{cls();
write_inst(0x80); lcd_show("importation data");
write_inst(0xc0); lcd_show(" Ran: (v) "); write_inst(0xc7);
}
//-----------------------------------------
void mut_port(void)
{cls();
write_inst(0x80); lcd_show("importation data");
write_inst(0xc0); lcd_show("Mut: (Ran) "); write_inst(0xc4);
}
//---------------------------------------------
void is_right(void)
{cls();
write_inst(0x80); lcd_show(" The operation ");
write_inst(0xc0); lcd_show(" is right ");
}
//----------------------------------------------------------
void of_scope(void)
{cls();
write_inst(0x80); lcd_show(" Sorry ");
write_inst(0xc0); lcd_show("beyond of scope ");
}
//--------------------------------------------------
void none_data(void)
{cls();
write_inst(0x80); lcd_show(" Please input ");
write_inst(0xc0); lcd_show(" first the data ");
}
//-------------------------------------------送第一路频率数据
void send_one_fre(ulong x)
{
ulong *y; uchar *a; uchar *b; uchar *c; uchar *d;
y=0x40; a=0x40; b=0x41; c=0x42; d=0x43; *y=x;
control=control|0xf0; //无操作
send_fpga=*d; //先送低字节
control=control&0x07; //送低字节控制数据
control=control|0xf0;
send_fpga=*c;
control=control&0x87;
control=control|0xf0;
send_fpga=*b;
control=control&0x47;
control=control|0xf0;
send_fpga=*a;
control=control&0xc7;
control=control|0xf0;
control=control&0x27; //完成频率发确认信号
}
//-------------------------------------------送第二路频率数据
void send_two_fre(ulong x)
{
ulong *y; uchar *a; uchar *b; uchar *c; uchar *d;
y=0x40; a=0x40; b=0x41; c=0x42; d=0x43; *y=x;
control=control|0xf8; //无操作
send_fpga=*d; //先送低字节
control=control&0x0f; //送低字节控制数据
control=control|0xf8;
send_fpga=*c;
control=control&0x8f;
control=control|0xf8;
send_fpga=*b;
control=control&0x4f;
control=control|0xf8;
send_fpga=*a;
control=control&0xcf;
control=control|0xf8;
control=control&0x2f; //完成频率发确认信号
}
//------------------------------------------送第一路幅度数据
void send_one_ran(uchar x)
{
control=control|0xf8;
send_fpga=x;
control=control&0x67; //送控制字
control=control|0xf0;
}
//---------------------------------------送第二路幅度数据
void send_two_ran(uchar x)
{
control=control|0xf8;
send_fpga=x;
control=control&0x6f; //送控制字
control=control|0xf8;
}
//------------------------------------------送第一路波形
void send_one_wave(uchar x)
{
control=control|0xf8;
send_fpga=x;
control=control&0xa7; //送控制字
control=control|0xf8;
}
//------------------------------------------送第二路波形
void send_two_wave(uchar x)
{
control=control|0xf8;
send_fpga=x;
control=control&0xaf; //送控制字
control=control|0xf8;
}
//----------------------------------------送相位数据
void send_mut(uint x)
{
uint *y; uchar *a; uchar*b;
y=0x40;a=0x40;b=0x41; *y=x;
control=control|0xf8;
send_fpga=*b;
control=control&0xe7;
control=control|0xf8;
send_fpga=*a;
control=control&0x17;
control=control|0xf8;
control=control&0x97;
}
//------------------------------------------输出完数据后全部清零
void clrs(void)
{ulong *z;
z=0x40;
*z=0x00;
}
//---------------------------------------------------------各按键功能
void zero(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='0'; lcd_show("0");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='0'; lcd_show("0");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='0'; lcd_show("0");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void one(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='1'; lcd_show("1");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='1'; lcd_show("1");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='1'; lcd_show("1");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void two(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='2'; lcd_show("2");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='2'; lcd_show("2");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='2'; lcd_show("2");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void three(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='3'; lcd_show("3");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='3'; lcd_show("3");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='3'; lcd_show("3");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void four(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='4'; lcd_show("4");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='4'; lcd_show("4");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='4'; lcd_show("4");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void five(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='5'; lcd_show("5");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='5'; lcd_show("5");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='5'; lcd_show("5");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void six(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='6'; lcd_show("6");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='6'; lcd_show("6");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='6'; lcd_show("6");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void seven(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='7'; lcd_show("7");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='7'; lcd_show("7");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='7'; lcd_show("7");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void eight(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='8'; lcd_show("8");no_data=1;}else{write_inst(0x0c);}}
else if(ran_mode==1)
{if(p<=2) {line[p++]='8'; lcd_show("8");no_data=1;}else{write_inst(0x0c);}}
else if(mut_mode==1)
{if(p<=5) {line[p++]='8'; lcd_show("8");no_data=1;}else{write_inst(0x0c);}}
}
//----------------------------------
void nine(void)
{
if(fre_mode==1)
{if(p<=6) {line[p++]='9'; lcd_show("9");no_data=1;}else{write_inst(0x0c);}}
else if (ran_mode==1)
{if(p<=2) {line[p++]='9'; lcd_show("9");no_data=1;}else{write_inst(0x0c);}}
else if (mut_mode==1)
{if(p<=5) {line[p++]='9'; lcd_show("9");no_data=1;}else{write_inst(0x0c);}}
}
//---------------------------------------------
void point_road(void)
{
if((ran_mode==1)||(mut_mode==1))
{
line[p++]='.';
lcd_show(".");
}
else
{fre_mode=0;ran_mode=0;mut_mode=0;
road_mode++;
if(road_mode==3){road_mode=1;}
switch(road_mode)
{case 1:{t_first();}break;
case 2:{t_second();}break;}
}
}
//-------------------------------------------------选择波形
void ch_wave(void)
{
fre_mode=0;ran_mode=0;mut_mode=0;
if(road_mode==1)
{
wave_one_data++;
if(wave_one_data==4) {wave_one_data=0;}
switch(wave_one_data)
{case 0:{send_one_wave(0x00);sine_wave();}break;
case 1:{send_one_wave(0x01);square_wave();}break;
case 2:{send_one_wave(0x02);triangle_wave();}break;
case 3:{send_one_wave(0x03);teeth_wave();}break;}
}
else if(road_mode==2)
{
wave_two_data++;
if(wave_two_data==4) {wave_two_data=0;}
switch(wave_two_data)
{case 0:{send_two_wave(0x00);sine_wave();}break;
case 1:{send_two_wave(0x01);square_wave();}break;
case 2:{send_two_wave(0x02);triangle_wave();}break;
case 3:{send_two_wave(0x03);teeth_wave();}break;}
}
}
//------------------------
void ch_fre(void)
{
fre_mode=1;ran_mode=0;mut_mode=0; fre_port(); p=0;no_data=0;clrs();da_clr();
}
//-----------------------------
void ch_ran(void)
{
ran_mode=1;fre_mode=0;mut_mode=0; ran_port(); p=0;no_data=0;
}
//---------------------------------------
void ch_mut(void)
{
mut_mode=1;fre_mode=0;ran_mode=0; mut_port(); p=0;no_data=0;clrs(); da_clr();
}
//-------------------------------
void enter(void)
{
ulong y=0;
uint z;
uchar t;
float x;
float n;
y=0;
if(no_data==0){none_data();}else{
switch(road_mode)
{case 1:{if(fre_mode==1)
{y=atol(line)/0.003725;
if(y>268456644){of_scope();}else{is_right();send_one_fre(y);}}
else if(ran_mode==1)
{x=atof(line);t=x*50;
if(t>250){of_scope();}else{is_right(); send_one_ran(t);}}
else if(mut_mode==1)
{n=atof(line);z=n/0.09;
if(z>4000){of_scope();}else{is_right();send_mut(z);}}
} break;
case 2:{if(fre_mode==1)
{y=atol(line)/0.003725;
if(y>268456644){of_scope();}else{is_right(); send_two_fre(y);}}
else if(ran_mode==1)
{x=atof(line);t=x*50;
if(t>250){of_scope();}else{is_right(); send_two_ran(t);}}
}break;
}
}
p=0;fre_mode=0;ran_mode=0;mut_mode=0; clrs();da_clr();
}
//----------------------------------各按键功能
void key_pass(void)
{
switch(keycode)
{
case 0xe7:{zero();}break; case 0xeb:{one();}break; case 0xed:{two();}break;
case 0xee:{three();}break; case 0xd7:{four();}break; case 0xdb:{five();}break;
case 0xdd:{six();}break; case 0xde:{seven();}break; case 0xb7:{eight();}break;
case 0xbb:{nine();}break; case 0xbd:{point_road();}break; case 0xbe:{ch_wave();}break;
case 0x77:{ch_fre();}break; case 0x7b:{ch_ran();}break; case 0x7d:{ch_mut();}break;
case 0x7e:{enter();}break; default:{}
}
}
//---------------------------------按键延时
void key_delay (void)
{
uint i;
for(i=3000;i>0;i--){}
}
//----------------------------------计算键值
void key()
{scancode=0xef;
while(1)
{key_port=scancode;key_delay();
keycode=key_port;
if((keycode&0x0f)!=0x0f){key_pass();}
scancode=((scancode<<=1)|0x0f);
if(key_port==0xff)break;}
}
//--------------------------------------------上电初始化
void begin(void)
{
initial(); //重新定义显示方式
t_first(); //显示The firat road
send_one_fre(0x000418a8); //1KHZ
send_two_fre(0x000418a8);
send_one_ran(0x64); //2V
send_two_ran(0x64);
send_one_wave(0x00); //正弦波
send_two_wave(0x00);
send_mut(0x0000); //零相移
}
//-----------------------------------------------主程序
main()
{
en=0;
key_delay ();
key_delay ();
key_delay ();
key_delay ();
begin();
while(1)
{
key();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -