📄 main.c
字号:
#include <intrinsics.h>
#include <AD9851_CONFIG.h>
#include <ina90.h>/*包含inavr.h文件,inavr.h文件中有两个库函数可直接调用来读写EEPROM*/
void fq_display(void); //将当前频率显示在液晶上
void factor_display(void); //将当前的修正系数显示在液晶上
void correction_set(void); //设置修正系数的子函数
unsigned long fq,fq1; //存放当前频率,在设置修正系数时将fq的值暂存到fq1中,设置完毕后写回fq
uchar frequency[6]; //存放当前频率显示数据
uchar mode=1; //为1时进入频率设置状态,为零时处于等待状态
unsigned long con_word; //存放当前频率对应的控制字的十进制格式数据
float con_word_temp; //控制字的计算过程可能会出现在大于32位的中间量
uchar con_word_array[5]={0x00,0x00,0x00,0x00,0x00};//控制字保存数组
uchar key_num=0; //键值
uchar corrected; //修正系数是否有效的标志
unsigned long correction1=10000000; //保留在E2PROM中的修正系数对应的正整数形式
float correction_temp; //存放修正系数,用于计算频率控制字
uchar factor[9]={0x00,'.',0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //存放修正系数的显示数据,在设置完修正系数后将该数组中除小数点外的其他八位数据存入EEPROM中
void main(void)
{
fq=800000; //初始频率设为800KHZ
con_word=4294967295;
/*********************液晶初始化,并将DDS置成串行控制模式******************************/
LCD_init();
//showstring(0,0," ");
//delay_nms(100);
//showstring(0,1," ");
//delay_nms(100);
showstring(0,0,"LCD_INI FINISH"); //提示液晶初始化完成
set_dds_to_serial(); //将DDS设置成串行控制工作模式
delay_nms(1000);
showstring(0, 0,"DDS SERIAL MODE"); //提示DDS工作在串行工作模式
delay_nms(1000);
/**************判断修正系数是否已经保留在E2PROM中,是则读出,否则进行设置*****************/
_EEGET(corrected,0x00); //读出EEPROM中修正系数是否有效的标志,为1是有效
if(corrected == 1) //修正系数有效时读出八位的修正系数,存放在数据factor的相应位中
{
_EEGET(factor[0],0x01);
_EEGET(factor[2],0x02);
_EEGET(factor[3],0x03);
_EEGET(factor[4],0x04);
_EEGET(factor[5],0x05);
_EEGET(factor[6],0x06);
_EEGET(factor[7],0x07);
_EEGET(factor[8],0x08);
correction1 = factor[0]*10000000+factor[2]*1000000+factor[3]*100000+factor[4]*10000+factor[5]*1000+factor[6]*100+factor[7]*10+factor[8];
correction_temp =correction1/10000000.0;//计算出上一次保存的修正系数的值,精确到小数点后七位
factor_display(); //在液晶上显示当前系统所用的修正系数
delay_nms(1000);
}
else
{
correction_set();
}
/**********以下到FOR循环前输出初始的信号***************/
con_word_temp=fq*4294967296*correction_temp/Fosc;
con_word=con_word_temp;
con_word_array[0]=con_word%256;
con_word_array[1]=con_word/256%256;
con_word_array[2]=con_word/256/256%256;
con_word_array[3]=con_word/256/256/256;
write_word(con_word_array);
fq_display(); //显示出DDS产生的信号的频率
showstring(0,1,"set frequency ");
/****************进入循环状态*****************/
for(;;)
{
while(mode) //mode=1时进入重置频率状态
{
key_num = get_key();
switch(key_num)
{
case '*': mode = 0; //频率设置完毕后按下'*'键进行确定,并将新的频率字写入DDS中
con_word_temp=fq*4294967296*correction_temp/Fosc;
con_word=con_word_temp;
con_word_array[0]=con_word%256;
con_word_array[1]=con_word/256%256;
con_word_array[2]=con_word/256/256%256;
con_word_array[3]=con_word/256/256/256;
write_word(con_word_array);
showstring(0,1,"new word downed ");
break;
case '1': fq += 1; //按1号键加1
fq_display();
break;
case '4': fq -= 1; //按4号键减1
fq_display();
break;
case '2': fq += 10; //按2号键加10
fq_display();
break;
case '5': fq -= 10; //按5号键减10
fq_display();
break;
case '3': fq += 100; //按3号键加100
fq_display();
break;
case '6': fq -= 100; //按6号键减100
fq_display();
break;
case 'A': fq += 1000; //按A键加1000
fq_display();
break;
case 'B': fq -= 1000; //按B键减1000
fq_display();
break;
case '#': correction_set();
delay_nms(1000);
showstring(0,1,"set frequency ");
break;
default:break;
}
}
while(!mode) //mode=0时可以对DDS进行关闭与唤醒,
{
key_num = get_key();
switch(key_num)
{
case '*':mode=1;
showstring(0,1,"set frequency ");
break;
case '#': correction_set();
//delay_nms(1000);
showstring(0,1,"new word downed ");
break;
case '0':con_word_array[4]=0x04; //POWER_DOWN
write_word(con_word_array);
break;
case '8':con_word_array[4]=0x00; //POWER_UP
write_word(con_word_array);
break;
default:break;
}
}
}
}
void fq_display(void) //调用函数将当前的频率显示出来
{
uchar i;
showstring(0,0,"F: Hz ");
frequency[5]=fq%10; //最低位
frequency[4]=fq/10%10;
frequency[3]=fq/100%10;
frequency[2]=fq/1000%10;
frequency[1]=fq/10000%10;
frequency[0]=fq/100000; //最高位
for(i=0;i<6;i++) //显示6位数据
{
switch(frequency[i])
{
case 0:showchar(i+3,0,'0');break;
case 1:showchar(i+3,0,'1');break;
case 2:showchar(i+3,0,'2');break;
case 3:showchar(i+3,0,'3');break;
case 4:showchar(i+3,0,'4');break;
case 5:showchar(i+3,0,'5');break;
case 6:showchar(i+3,0,'6');break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -