?? 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 + -