📄 signalmain.c
字号:
/**************************************************************************/
/******** Signal Sourse *********************************/
/* Capable to output Sin, Square,and Triangular Wave Form
/* IOB0-5 For Rotator Key1,Key2
/* IOB2 As Ext1(Rising Edge) For PhaseA of Key1,IOB1 For PhaseB Of Key1,IOB0 For Key Of Key1
/* IOB3 AS EXt2(Rising Edge) For PhaseA of Key2,IOB4 For PhaseB Of Key2,IOB5 For Key Of Key2
/* IOB14 As CLK,IOB15 As Data For LCD
/* IOB6 As BackLight Switch For LCD
/* IOB9 As FSYNC,IOB10 As SCLK,IOB11 As SDATA,IOB12 As RESET,
/* IOB13 As MCLK Select For AD9834,Low as 20M,High as 1M
/*************************************************************************/
#include "SPCE061.h"
#include "math.h"
/*************************************************************************/
#define DDS_CONTROL_LOW_WRITE 0x0000
#define DDS_CONTROL_HIGH_WRITE 0x1000
#define DDS_CONTROL_SIN 0x0000
#define DDS_CONTROL_TRIANGULAR 0x0002
#define DDS_CONTROL_SQUARE 0x0028
#define FREQUENCY_COEFFICIENT_1M 268.435456
#define FREQUENCY_COEFFICIENT_20M 13.4217728
#define CRYSTAL_1M_SELECT *P_IOB_Data|=0x2000
#define CRYSTAL_20M_SELECT *P_IOB_Data&=0xdfff
#define FSYNC_SET *P_IOB_Data|=0x0200
#define FSYNC_CLEAR *P_IOB_Data&=0xfdff
#define SCLK_SET *P_IOB_Data|=0x0400
#define SCLK_CLEAR *P_IOB_Data&=0xfbff
#define DATA_SET *P_IOB_Data|=0x0800
#define DATA_CLEAR *P_IOB_Data&=0xf7ff
#define RESET_ON *P_IOB_Data|=0x1000;
#define RESET_OFF *P_IOB_Data&=0xefff;
/**************************************************************************/
/* Overall Varibles Declearation *****************************************/
int Function=0; // 0:WaveForm,1:HZ/KHZ,2:0.1f,3:1f,4:100f,5:10000f,6:0.1V,7:1V
int WaveForm=0; // 0 As Sine Wave; 1 As Triangle Wave; 2 As Square Wave
int AmplitudeFrac=0; // Fractional part of Frequency
int AmplitudeOne=5; // Integer part of Amplitude
double AmplitudeDB; // float fromat Amplitude
int AmplitudeDA;
int FrequencyRange=1; // 0 As 1HZ-1KHZ; 2 As 1KHZ-2MHZ
int CrystalSelect=1; // 0 As 1MHZ; 1 As 20MHZ
int FrequencyFrac=0; // Fractional part of Frequency
int FrequencyOne=20; // 0-99 part of Frequency
int FrequencyHundred=0; //100-9900 part of Frequency
double Frequency; // float format Frequency
long int FrequencyRegister; // Data Write into DDS
/* */
int WaveFormString[3][5]={{"正弦"},{"三角"},{"方波"}};
int FrequencyRangeString[2][3]={{"HZ"},{"K "}};
int FunctionPosition[7]={0x96,0x8f,0x8d,0x8c,0x8b,0x9d,0x9c};
/**************************************************************************/
/* Sub Function Declearaiton */
/*DDS*/
void DDSInit(void);
void WordWriteDDS(int WordToWrite);
void FrequencyUpdate(void);
void WaveFormUpdate(void);
/*VGA*/
void DACInit(void);
void AmplitudeUpdate(void);
/*LCD*/
void lcd_init_usual(void);
void set_position(int position);
void chinese_series(int *series);
void code_write(int code);
void data_write(int data);
void DisplayInit(void);
/*Key */
void KeyInit(void);
void KeyIncreaseProsses(void);
void KeyDecreaseProsses(void);
/*Data Transform*/
int int_to_series(unsigned int data);
/**************************************************************************/
/* Main Function */
void main(void)
{
KeyInit();
DisplayInit();
DDSInit();
DACInit();
FrequencyUpdate();
AmplitudeUpdate();
__asm("IRQ ON");
while(1)
{
*P_Watchdog_Clear=1;
// WordWriteDDS(DDS_CONTROL_WORD);
}
}
/**************************************************************************/
/* Interrupt Service */
void IRQ3(void)__attribute__((ISR));
void IRQ3(void)
{
int i=*P_INT_Ctrl;
__asm("IRQ OFF");
if(*P_INT_Ctrl&0x0200) //Ex2 for KeyFunction
{
*P_INT_Clear|=0x0200;
if(*P_IOB_Data&0x0010)
{
Function++;
if(Function>6)
{
Function=0;
}
}
else
{
Function--;
if(Function<0)
{
Function=6;
}
}
code_write(FunctionPosition[Function]); //Refresh disp
}
if(*P_INT_Ctrl&0x0100) //Ex1 For KeySet
{
*P_INT_Clear|=0x0100;
if(*P_IOB_Data&0x0002)
{
KeyDecreaseProsses();
}
else
{
KeyIncreaseProsses();
}
}
*P_INT_Clear|=0x0300;
__asm("IRQ ON");
}
/**************************************************************************/
/* Sub Function Zone */
void KeyInit(void)
{
*P_IOB_Data|=0x003f;
*P_IOB_Attrib|=0x003f;
*P_IOB_Dir&=0xffc0; //Set IOB0-5 As High-Pulled Input
*P_INT_Ctrl|=0x0300; //Open Ext1 and Ext2;
}
/**/
void KeyIncreaseProsses(void)
{
switch(Function)
{
case 0: //WaveForm Change
WaveForm++;
if(WaveForm>2)
{
WaveForm=0;
}
WaveFormUpdate();
code_write(0x94); //set position
chinese_series(WaveFormString[WaveForm]); //Refresh WaveForm Disp
break;
case 1: //Frequency Range Change
FrequencyRange++;
if(FrequencyRange>1)
{
FrequencyRange=0;
}
FrequencyUpdate();
chinese_series(FrequencyRangeString[FrequencyRange]);
code_write(0x8f);
break;
case 2: //Frequency Frac increase
FrequencyFrac++;
if(FrequencyFrac>9)
{
FrequencyFrac=0;
}
FrequencyUpdate();
data_write('.');
data_write(FrequencyFrac+0x30);
code_write(0x8d);
break;
case 3: //Frequency one-99 part
FrequencyOne++;
if(FrequencyOne>99)
{
FrequencyOne=0;
}
FrequencyUpdate();
data_write(FrequencyOne/10+0x30);
data_write(FrequencyOne%10+0x30);
code_write(0x8c);
break;
case 4: //Frequency 100-9900 part
FrequencyHundred++;
if(FrequencyHundred>99)
{
FrequencyHundred=0;
}
FrequencyUpdate();
data_write(FrequencyHundred/10+0x30);
data_write(FrequencyHundred%10+0x30);
code_write(0x8b);
break;
case 5: //Amplitude Fractional part
AmplitudeFrac++;
if(AmplitudeFrac>9)
{
AmplitudeFrac=0;
}
AmplitudeUpdate();
data_write('.');
data_write(AmplitudeFrac+0x30);
code_write(0x9d);
break;
case 6: //Amplitude Integer part
AmplitudeOne++;
if(AmplitudeOne>5)
{
AmplitudeOne=0;
}
AmplitudeUpdate();
data_write(' ');
data_write(AmplitudeOne+0x30);
code_write(0x9c);
break;
default:break;
}//switch(Function)
}
/**/
void KeyDecreaseProsses(void)
{
switch(Function)
{
case 0: //WaveForm Change
WaveForm--;
if(WaveForm<0)
{
WaveForm=2;
}
WaveFormUpdate();
code_write(0x94); //set position
chinese_series(WaveFormString[WaveForm]); //Refresh WaveForm Disp
break;
case 1: //Frequency Range Change
FrequencyRange--;
if(FrequencyRange<0)
{
FrequencyRange=1;
}
FrequencyUpdate();
chinese_series(FrequencyRangeString[FrequencyRange]);
code_write(0x8f);
break;
case 2: //Frequency Frac increase
FrequencyFrac--;
if(FrequencyFrac<0)
{
FrequencyFrac=9;
}
FrequencyUpdate();
data_write('.');
data_write(FrequencyFrac+0x30);
code_write(0x8d);
break;
case 3: //Frequency one-99 part
FrequencyOne--;
if(FrequencyOne<0)
{
FrequencyOne=99;
}
FrequencyUpdate();
data_write(FrequencyOne/10+0x30);
data_write(FrequencyOne%10+0x30);
code_write(0x8c);
break;
case 4: //Frequency 100-9900 part
FrequencyHundred--;
if(FrequencyHundred<0)
{
FrequencyHundred=99;
}
FrequencyUpdate();
data_write(FrequencyHundred/10+0x30);
data_write(FrequencyHundred%10+0x30);
code_write(0x8b);
break;
case 5: //Amplitude Fractional part
AmplitudeFrac--;
if(AmplitudeFrac<0)
{
AmplitudeFrac=9;
}
AmplitudeUpdate();
data_write('.');
data_write(AmplitudeFrac+0x30);
code_write(0x9d);
break;
case 6: //Amplitude Integer part
AmplitudeOne--;
if(AmplitudeOne<0)
{
AmplitudeOne=5;
}
AmplitudeUpdate();
data_write(' ');
data_write(AmplitudeOne+0x30);
code_write(0x9c);
break;
default:break;
}//switch(Function)
}
/*******************************/
void DisplayInit(void)
{
lcd_init_usual();
chinese_series(" Signal Sourse");
code_write(0x90); //Line 2
chinese_series("波型: 正弦");
code_write(0x88);
chinese_series("频率: 0020.0 K");
code_write(0x98);
chinese_series("峰峰值: 5.0 V");
code_write(0x96);
}
/*******************************/
/*******************************/
void DACInit(void) //Init DAC
{
*P_DAC_Ctrl=0x00;
*P_ADC_Ctrl&=0xffbf; //3.3mA
//*P_ADC_Ctrl|=0x0040;
}
/*******************************/
void DDSInit(void)
{
*P_IOB_Data&=0xc1ff;
*P_IOB_Data|=0x1600;
*P_IOB_Attrib|=0x3e00;
*P_IOB_Dir|=0x3e00; //Set IOB9-13 For DDS
}
/*******************************/
void WordWriteDDS(int WordToWrite)
{
int i;
SCLK_SET;
FSYNC_CLEAR;
for(i=0;i<16;i++)
{
SCLK_SET;
if(WordToWrite&0x8000)
{
DATA_SET;
}
else
{
DATA_CLEAR;
}
SCLK_CLEAR;
WordToWrite<<=1;
}
FSYNC_SET;
SCLK_SET;
}
/******************************/
void FrequencyUpdate(void)
{
int FrequencyLow,FrequencyHigh;
Frequency=FrequencyFrac/10+FrequencyOne+FrequencyHundred*100;
if(FrequencyRange==1)
{
Frequency*=1000;
}
if(Frequency<5000)
{
CRYSTAL_1M_SELECT;
FrequencyRegister=Frequency*FREQUENCY_COEFFICIENT_1M;
}
else
{
CRYSTAL_20M_SELECT;
FrequencyRegister=Frequency*FREQUENCY_COEFFICIENT_20M;
}
FrequencyLow=(FrequencyRegister&0x3fff)|0x4000;
FrequencyHigh=((FrequencyRegister>>14)&0x3fff)|0x4000;
WordWriteDDS(DDS_CONTROL_LOW_WRITE);
WordWriteDDS(FrequencyLow);
WordWriteDDS(DDS_CONTROL_HIGH_WRITE);
WordWriteDDS(FrequencyHigh);
WaveFormUpdate();
}
/******************************/
void WaveFormUpdate(void)
{
if(WaveForm==0)
{
WordWriteDDS(DDS_CONTROL_SIN);
}
if(WaveForm==1)
{
WordWriteDDS(DDS_CONTROL_TRIANGULAR);
}
if(WaveForm==2)
{
WordWriteDDS(DDS_CONTROL_SQUARE);
}
}
/******************************/
void AmplitudeUpdate(void)
{
AmplitudeDB=20*log10(AmplitudeFrac+AmplitudeOne*10);
if(Frequency>500000)
{
}
AmplitudeDA=1024*(AmplitudeDB/40);
*P_DAC2=AmplitudeDA<<6;
}
/******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -