📄 app.c
字号:
//********************************************************//
#include "includes.h"
#define I2C_BUF_LEN 10
#define BUF_LEN 16
#define Config_ADD 0 //配置寄存器
//工作模式
#define Start_Mode 0 //启动模式,等待选择
#define Serial_Mode 1 //通过串口控制输出频率
#define Select_Mode 2 //从已编程存储器中选择频率
#define Prog_Mode 3 //对频率寄存器进行编程
#define FRQ_N 10 //用户已编程频点数
#define FRQ_ADD 16 //用户编程频率存储器开始地址,连续4个字节
uint8 COM_IN; //指令输入有效,1
uint8 Work_mode; //当前工作模式
uint8 I2C_BUF[I2C_BUF_LEN]; //I2C读写缓冲区
uint32 FRQ_Now; //系统当前的输出频率
extern uint8 UART_BUF[BUF_LEN+1];
union DDS
{
uint32 FW_W;
uint8 FW_B[4];
};
union DDS FRQ; //第一频率控制字
//*******************************************************//
void Read(uint8 Length,uint16 Addr)
{
EA = 0;
SDA = 1;
RW24xx(I2C_BUF,Length,Addr,0xa1);
EA = 1;
}
//******************************************************//
void Wri(uint8 Length,uint16 Addr)
{
EA = 0;
WP = 0;
SDA = 1;
RW24xx(I2C_BUF,Length,Addr,0xa0);
WP = 1;
EA = 1;
}
//*******************************************************//
uint32 ASC2INT(uint8 *buf) //ASCII
{
uint32 F_In;
uint8 i;
F_In=0;
for(i=1;i<(buf[0]+1);i++)
{
F_In=F_In * 10 + buf[i]-'0';
}
UART_BUF[1]='0';
UART_BUF[0]=0;
return (F_In);
}
//*******************************************************//
FRQ_Set(uint32 f,uint8 con) //AD9851频率控制,单位Hz
//con==0:f为实际的频率值
//con==其他:f为频率控制字
{
if(con==0)
{
FRQ.FW_W = (uint32)f*(uint32)23+(uint32)f*(uint32)86/(uint32)100
+(uint32)f/1000;
}
else
{
FRQ.FW_W = f;
}
AD9851_SET(0x01,FRQ.FW_B);
}
//*******************************************************//
void Main_Menu() //正常工作时候的界面
{
print_str("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
print_str("Pocketable Sine Wave Generator\n");
print_str("\n");
print_str("\n");
print_str("Output Frequency: ");
print_uint32(FRQ_Now);
print_str("Hz\n");
print_str("\n");
print_str("Please selce the mode:\n");
print_str("1: Control with serial\n");
print_str("2: Select frequency from table\n");
print_str("3: Programme frequency table\n");
}
//*******************************************************//
void Serial_Process(void)
{
print_str("\nPlease input the frequency(Hz):");
while(COM_IN==0); //等待输入待编程的频率序号
COM_IN=0;
FRQ_Now=ASC2INT(UART_BUF);
FRQ_Set(FRQ_Now,0);
Main_Menu();
}
//******************************************************//
void Select_Process(void)
{
uint8 i;
uint32 temp,*p;
print_str("Num Frequecncy(Hz)\n");
for(i=0;i<10;i++) //读取并显示全部的可编程频率
{
Read(4,(FRQ_ADD + (i<<2)));
print_uint32(i);
print_str("---->");
p=(uint32)I2C_BUF;
print_uint32(*p);
print_str("Hz\n");
}
print_str("Please select the frequency:");
while(COM_IN==0); //等待输入待编程的频率序号
COM_IN=0;
temp=ASC2INT(UART_BUF);//获取选择的索引信息
if((uint8)temp>=FRQ_N)
{
print_str("\nThe frequency you selected is not existed!\n");
for(i=0;i<2;i++) //延时显示
{
temp=60000;
while(temp--)
{
EA = 0;
}
EA = 1;
}
}
else
{
Read(4,(FRQ_ADD + ((uint8)temp<<2)));//读取频率值
p=(uint32)I2C_BUF;
FRQ_Now = *p;
FRQ_Set(FRQ_Now,0);
}
Main_Menu();
}
//*******************************************************//
void EEROM_Prog(void)
{
uint8 i,num,*buf;
uint32 temp,*p;
print_str("The frequency stored is:\n");
print_str("Num Frequecncy\n");
for(i=0;i<10;i++) //读取并显示全部的可编程频率
{
Read(4,(FRQ_ADD + (i<<2)));
print_uint32(i);
print_str("---->");
p=(uint32)I2C_BUF;
print_uint32(*p);
print_str("Hz\n");
}
while(1)
{
print_str("Select the num you want to programme:\n");
print_str("To finish,input any number more than 10\n");
UART_BUF[0]=0; //清除接收计数器
while(COM_IN==0); //等待输入待编程的频率序号
COM_IN=0;
num=ASC2INT(UART_BUF);//获取输入的值
if(num>10)
{
print_str("\nProgramme finished\n");
print_str("The frequency table is:\n");
print_str("Num Frequecncy(Hz)\n");
for(i=0;i<10;i++) //读取并显示全部的可编程频率
{
Read(4,(FRQ_ADD + (i<<2)));
print_uint32(i);
print_str("---->");
p=(uint32)I2C_BUF;
print_uint32(*p);
print_str("Hz\n");
}
for(i=0;i<2;i++) //延时显示频率表
{
temp=60000;
while(temp--)
{
EA = 0;
}
EA = 1;
}
Main_Menu(); //显示主菜单
break;
}
else
{
print_str("\nYou select ");
print_uint32((uint32)num);
print_str("\nPlease input the frequency:\n");
UART_BUF[0]=0; //清除接收计数器
while(COM_IN==0); //等待输入待编程的频率序号
COM_IN=0;
temp=ASC2INT(UART_BUF);
print_str("\nprogramming num ");
print_uint32((uint32)num);
print_str(" frequency is ");
print_uint32(temp);
print_str("Hz\n");
print_str("Please wait...\n");
buf=&temp;
for(i=0;i<4;i++)
{
I2C_BUF[i]=*(buf+i);
}
Wri(4,(FRQ_ADD + (num<<2)));
print_str("OK\n");
}
}
}
//*******************************************************//
void Init_Sys(void)
{
UART0_Init();
AD9851_RST();
FRQ_Now= 38000;
Main_Menu();
FRQ_Set(FRQ_Now,0);
WP = 1;
EA = 1;
}
//*******************************************************//
void main(void)
{
uint8 temp;
Init_Sys();
while(1)
{
if(COM_IN)
{
COM_IN=0;
temp=ASC2INT(UART_BUF);
switch(temp)
{
case 1:
{
print_str("\n");
Serial_Process();
}
break;
case 2:
{
print_str("\n");
Select_Process();
}
break;
case 3:
{
print_str("\n");
EEROM_Prog();
}
break;
default:
{
Main_Menu();
}
}
}
}
}
//*******************************************************//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -