📄 body.c
字号:
#include "lp.h"
#include "lpregs.h"
#include "syncdly.h"
#include "disram.h"
#include "dds.h"
#include "math.h"
sbit OE=IOC^0;
sbit E=IOC^1;
sbit RW=IOC^2;
sbit RS=IOC^3;
//#define DisCon IOD
#define SysFre 210e6
#define MaxAmp 10
#define MaxPha 360
extern struct DDSSpace volatile xdata dds[16];//定义实际设备的DDS空间
extern void ddsdefault();
struct disramtype xdata disram;
//-------------write ---------//
void DisWrite(BOOL mode,unsigned char ddata)
{
DataDir=0xff;
OE=0;
RS=mode;
RW=0;
DisData=ddata;
EZUSB_Delay(0.1);//等待地址线有效
E=1;
EZUSB_Delay(1);//等待数据线有效
E=0;//锁存数据
EZUSB_Delay(0.1);//等待一个周期结束
RS=0;
OE=1;
EZUSB_Delay(0.1);
DataDir=0x00;
EZUSB_Delay(0.1);//等待一个周期结束;//设置下一个写间隔时间
}
//-------------write ---------//
//---------judging the direction of rotation-------//
/* static unsigned char state=0;
unsigned char rotation(unsigned char key)
{
//unsigned char a;
switch(state)
{
case 0:
if(key==0xdf)
state=0x01;
else if(key==0xbf)
state=0x11;
else
state=0;
break;
case 0x01:
if(key==0x9f)
state=0x02;
else
state=0;
break;
case 0x02:
if(key==0xbf)
state=0x03;
else
state=0;
break;
case 0x11:
if(key==0x9f)
state=0x12;
else
state=0;
break;
case 0x12:
if(key==0xdf)
state=0x13;
else
state=0;
break;
default:
state=0;
break;
}
if(state== 0x03)
return key_RIGHT;
else
return key_LEFT;
state=0;
/*
switch(key)
{
case 0xdf:
if(state==0)
state=0x01;
else if(state==0x12)
state=0x13;
else
{
a=0xff;
state=0;
}
break;
case 0x9f:
if(0x01==state)
state=0x02;
else if(state==0x11)
state=0x12;
else
{
a=0xff;
state=0;
}
break;
case 0xbf:
if(state==0x00)
state=0x11;
else if(0x02==state)
state=0x03;
else
{
a=0xff;
state=0 ;
}
break;
default:
a=0xff;
break;
}
if(a==0xff)
{state=0;
return 0xff;
}
//switch结束
if(state==0x13)
{a=key_LEFT;//左旋
state=0;
}
else if (state==0x03)
{
a=key_RIGHT;//右旋
state=0;
}
return a;
}//函数结束 */
//---------judging the direction of rotation-------//
//-------------transfer disdata to dds------------//
void Disdata2DDS()
{
unsigned char num;
double temp;
num= disram.ddsnum;
temp=disram.disdata;
switch(disram.ddsstatue)
{
case 1:
temp=disram.disdata*pow(2,48)/SysFre;
dds[num].frequency1_high=temp/pow(2,32);
dds[num].frequency1_low= temp-dds[num].frequency1_high*pow(2,32);
break;
case 2:
temp= disram.disdata*pow(2,12)/MaxAmp;
dds[num].output_shape_key_i_mult=temp;
break;
case 3:
temp= disram.disdata*pow(2,12)/MaxPha;
dds[num].phase1=temp;
break;
default:
break;
}
}
//-------------transfer disdata to dds------------//
//-------read from dds---------------------//
void DDS2Disdata()
{
unsigned char num;
double temp;
num=disram.ddsnum;
switch(disram.ddsstatue)
{
case key_FRE:
temp=dds[num].frequency1_high*pow(2,32)+dds[num].frequency1_low;
temp=SysFre*temp/pow(2,48);
break;
case key_AMP:
temp=dds[num].output_shape_key_i_mult;
temp=MaxAmp*temp/pow(2,12);
break;
case key_PHA:
temp=dds[num].phase1;
temp=MaxPha*temp/pow(2,12);
break;
default:
break;
}
disram.disdata=temp;
}
//-------read from dds---------------------//
void data2dis();
void left()
{
if(disram.ddsstatue==key_NUM)
{
if(disram.ddsnum==0)
disram.ddsnum=15;
else
disram.ddsnum=disram.ddsnum-1;
}
else if(disram.ddsstatue!=key_NUM){
switch(disram.unitshift)
{
case Bp1://小书店后1位
disram.disdata-=0.001;
break;
case B1p://小书店前1位
disram.disdata-=1;
break;
case B2p://小书店前2位
disram.disdata-=1000;
break;
case B3p:
disram.disdata-=1000000;
break;
default:
break;
}
}
}
void right()
{
if(disram.ddsstatue==key_NUM)
disram.ddsnum=disram.ddsnum+1;
if(disram.ddsnum==16)
disram.ddsnum=0;
else if(disram.ddsstatue!=key_NUM)
{
switch(disram.unitshift)
{
case Bp1://小书店后1位
disram.disdata+=0.001;
break;
case B1p://小书店前1位
disram.disdata+=1;
break;
case B2p://小书店前2位
disram.disdata+=1000;
break;
case B3p:
disram.disdata+=1000000;
break;
default:
break;
}
}
}
//---------transfer disdata to displaydata-------//
void data2dis()
{
unsigned char i;
double a;
double temp=disram.disdata;
a=1e7;
for(i=0;i<11;i++)
{
disram.displaydata[i]=temp/a;
temp-=disram.displaydata[i]*a;
a/=10;
}
}
//---------transfer disdata to displaydata-------//
//-----------------display1---------------------//
void display1()
{
unsigned char i;
disram.displaystatue[0]=0x30+disram.ddsnum/10;
disram.displaystatue[1]=0x30+disram.ddsnum%10;
disram.displaystatue[2]=0x20;
disram.displaystatue[6]=0x20;
switch(disram.ddsstatue)
{
case key_FRE:
disram.displaystatue[3]='F';//F
disram.displaystatue[4]='R';//R
disram.displaystatue[5]='E';//E
disram.displaystatue[7]='H';//H
disram.displaystatue[8]='Z';//Z
break;
case key_AMP:
disram.displaystatue[3]='A';//A
disram.displaystatue[4]='M';//M
disram.displaystatue[5]='P';//P
disram.displaystatue[7]='V';//V
disram.displaystatue[8]=' ';//_
break;
case key_PHA:
disram.displaystatue[3]='P';//P
disram.displaystatue[4]='H';//H
disram.displaystatue[5]='A';//A
disram.displaystatue[7]=0xdf;//degree
disram.displaystatue[8]=' ';
break;
default:
break;
}
DisWrite(0,0x84);
for(i=0;i<=8;i++)
DisWrite(1,disram.displaystatue[i]);
DisWrite(0,0x81);
DisWrite(1,'D');//D
DisWrite(1,'D');//D
DisWrite(1,'S');//S
}
void cursorflash()
{
if(disram.ddsstatue==key_NUM)
DisWrite(0,0x85);
else
{
switch(disram.unitshift)
{
case Bp1:
DisWrite(0,0xce);
break;
case B1p:
DisWrite(0,0xca);
break;
case B2p:
DisWrite(0,0xc6);
break;
case B3p:
DisWrite(0,0xc2) ;
break;
default:
break;
}
DisWrite(0,0x0F);
}
}
//-----------------display2---------------------//
void display2()
{
unsigned char i=0;
DisWrite(0,0xc1);
for(i=0;i<2;i++)
DisWrite(1,disram.displaydata[i]+0x30);
DisWrite(1,0x2c);
for(;i<5;i++)
DisWrite(1,disram.displaydata[i]+0x30);
DisWrite(1,0x2c);
for(;i<8;i++)
DisWrite(1,disram.displaydata[i]+0x30);
DisWrite(1,0x2e);
for(;i<11;i++)
DisWrite(1,disram.displaydata[i]+0x30);
/********************************************
光标闪烁的程序需要改进,直接获得光标的地址,调用光标地址显示就可以了
**********************************************/
/* switch(disram.unitshift)
{
case 1:
i=0xce;
break;
case 2:
i=0xca;
break;
case 3:
i=0xc7;
break;
case 4:
i=0xc3;
break;
default:
break;
}
DisWrite(0,i);
DisWrite(0,0x0F); */
}
//-----------------display2---------------------//
//-------------processing datus in disram-----------//
void disramprocess(unsigned char keystore)
{
unsigned char i;
switch(keystore)
{
case key_NUM:
disram.ddsstatue=key_NUM;
DDS2Disdata();
data2dis();
break;
case key_FRE:
disram.ddsstatue=key_FRE;
disram.unitshift=2;
DDS2Disdata();
data2dis();
break;
case key_AMP:
disram.ddsstatue=key_AMP;
disram.unitshift=2;
DDS2Disdata();
data2dis();
break;
case key_PHA:
disram.ddsstatue=key_PHA;
disram.unitshift=2;
DDS2Disdata();
data2dis();
break;
case key_LEFT:
left();
data2dis();
Disdata2DDS();
break;
case key_RIGHT:
right();
data2dis();
Disdata2DDS();
break;
case key_UNIT:
// disram.ddsstatue=key_UNIT;
if(disram.ddsstatue==key_FRE)
{ if(disram.unitshift==4)
disram.unitshift=1;
else
disram.unitshift=1+disram.unitshift;}
else if(disram.ddsstatue!=key_FRE)
{ if(disram.unitshift==2)
disram.unitshift=1;
else
disram.unitshift=1+disram.unitshift; }
//disram.unitshift=2;
break;
case key_RESET:
disram.ddsnum=0;
disram.ddsstatue=key_FRE;
disram.unitshift=2;
disram.disdata=5000000;
for(i=0;i<=10;i++)
disram.displaydata[i]=0;
ddsdefault();
data2dis();
break;
default:
break;
}//the end of switch(keystore)
}
//-------------process datus in disram-----------//
//--------initialization------//
void initialization()
{
OED=0xff;
OEA=0x00;
OEB=0x00;
OEC=0xff;
OE=1;//关闭显示
E=0;//无效
RS=0;//控制
RW=0;//写状态
//disram.ddsnum=1; //选择dds
//disram.ddsstatue=1;//1频率/2幅度/3相位
//disram.unitshift=2;//段位
disram.ddsnum=0;
disram.disdata=5000000;
disram.ddsstatue=key_FRE;
disram.unitshift=B1p;
EZUSB_Delay(4);
DisWrite(0,1);//清屏
EZUSB_Delay(4);
DisWrite(0,0x02);
EZUSB_Delay(4);
DisWrite(0,0x0e);//开显示,开光标
DisWrite(0,0x06);//增量,移动光标
EZUSB_Delay(4);
DisWrite(0,0x38);//两行显示,与上一条命令选择使用
data2dis();
display1();
display2();
cursorflash();
}
//-------the end of initialization-----//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -