📄 main.c
字号:
#include <SPCE061V004.H>
#define Set_IOB_Bit(x) (*P_IOB_Data = *P_IOB_Buffer | x) //置高
#define Clear_IOB_Bit(x) (*P_IOB_Data = *P_IOB_Buffer & ~x) //置低
#define Set_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer | x)
#define Clear_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer & ~x)
#define HaveKey 1
#define NoKey 0
#define FM 1
#define AM 0
#define normal 2
#define OUTB 0x0000 //OUTB and buffer
#define OUTA 0x0001 //OUTA
#define TIMER_DATA_FOR_32KHZ (0xffff - 384) // 时钟频率为Fosc/2,采样率为32kHz
unsigned int state; //FM 和AM 的状态区别
unsigned int FM_flag; //调频开始结束的标志
unsigned int data_name; //数组名首地址
unsigned int KeyVal; //键值
unsigned int KeyFlag; //按键标识
unsigned int wei_flag; //显示频率的位标志
unsigned int V_value=0; //单片机测得的电压幅值
unsigned int Sound=0; //调频时的AD采样数值
unsigned int Ctrl_val=0; //幅度的控制变量
unsigned int data_val; //AGC的控制字
unsigned int key_num; //数字键的键值
unsigned long int fre_val; //输入的频率值
unsigned int ma[10] = {25,50,75,100,125,150,175,200,225,255}; //AM的调制系数,待调整
unsigned int pinpian; //FM时,对于不同频偏AD采样值乘的系数
unsigned long int frequence,fo; //AD9851频率控制字的实际值,和调频的中心频率
extern unsigned int pin[],lv[],Hz[],A[],M[],F[],m[],a[],K[],baifenhao[],pian[],zui[],da[],
denghao[],maohao[],blank[]; //用到的字母和符号
extern unsigned int zero[],one[],two[],three[],four[],five[],six[],seven[],eight[],nine[];//0~9十个数字
//*******************************************************************************//
//名称:Page()
//功能:开机显示默认频率为1000Hz的界面
//*******************************************************************************//
void Page()
{
*P_Watchdog_Clear=1;
Display_hanzi1(1,0,pin);
Display_hanzi1(1,16,lv);
Display_num1(1,32,maohao);
// Display_num1(1,40,zero);
// Display_num1(1,48,zero);
// Display_num1(1,56,zero);
// Display_num2(1,0,zero);
Display_num2(1,8,one);
Display_num2(1,16,zero);
Display_num2(1,24,zero);
Display_num2(1,32,zero);
Display_hanzi2(1,48,Hz);
}
//***************************************************************//
//函数名称:DisplayFreq()
//功能:显示频率值
//***************************************************************//
void DisplayFreq()
{
unsigned long int tempv;
unsigned int k,reg,*pointer;
*P_Watchdog_Clear=1;
tempv = fre_val;
k = tempv / 10000000;
pointer = num_view(k);
Display_num1(1,40,pointer);
reg = tempv / 1000000;
k = reg %10;
pointer = num_view(k);
Display_num1(1,48,pointer);
reg = tempv / 100000;
k = reg % 10;
pointer = num_view(k);
Display_num1(1,56,pointer);
reg = tempv / 10000;
k = reg % 10;
pointer = num_view(k);
Display_num2(1,0,pointer);
reg = tempv / 1000;
k = reg % 10;
pointer = num_view(k);
Display_num2(1,8,pointer);
reg = tempv / 100;
k = reg % 10;
pointer = num_view(k);
Display_num2(1,16,pointer);
reg = tempv / 10;
k = reg % 10;
pointer = num_view(k);
Display_num2(1,24,pointer);
k = tempv % 10;
pointer = num_view(k);
Display_num2(1,32,pointer);
Display_hanzi2(1,48,Hz);
}
//*******************************************************************************//
//函数名称:num_view()
//函数功能:将数字转换成相应的数组名
//入口参数:所要转换的数字
//返回参数:相应的数组名(字库首地址)
//*******************************************************************************//
num_view(int i)
{
unsigned int *data_name;
*P_Watchdog_Clear=1;
switch(i)
{
case 0: data_name=zero; break;
case 1: data_name=one; break;
case 2: data_name=two; break;
case 3: data_name=three; break;
case 4: data_name=four; break;
case 5: data_name=five; break;
case 6: data_name=six; break;
case 7: data_name=seven; break;
case 8: data_name=eight; break;
case 9: data_name=nine; break;
default:
break;
}
return data_name;
}
//*******************************************************************
//延时函数
//******************************************************************
void delay()
{
unsigned int i;
for(i=0;i<1000;i++)
{
*P_Watchdog_Clear=1;
}
}
//***********************************************************************************
//函数名称:num_press()
//功能:对数字键进行处理
//参数:通过全局变量key_num,state_flag和wei_flag传递
//***********************************************************************************
void num_press()
{
unsigned int *pointer;
*P_Watchdog_Clear = 0x0001;
switch(wei_flag)
{
case 0:
pointer = num_view(key_num);
Display_num1(1,40,pointer);
break;
case 1:
pointer = num_view(key_num);
Display_num1(1,48,pointer);
break;
case 2:
pointer = num_view(key_num);
Display_num1(1,56,pointer);
break;
case 3:
pointer = num_view(key_num);
Display_num2(1,0,pointer);
break;
case 4:
pointer = num_view(key_num);
Display_num2(1,8,pointer);
break;
case 5:
pointer = num_view(key_num);
Display_num2(1,16,pointer);
break;
case 6:
pointer = num_view(key_num);
Display_num2(1,24,pointer);
break;
case 7:
pointer = num_view(key_num);
Display_num2(1,32,pointer);
Display_hanzi2(1,48,Hz);
break;
default:
break;
}
fre_val = fre_val * 10 + key_num;
WriteAD9851(fre_val);
delay();
delay();
}
//***********************************************************************************//
//函数名称:WriteAD9851()
//功能:向AD9851写频率控制字
//参数:实际频率值,长整形
//***********************************************************************************//
void WriteAD9851(unsigned long int Frequency)
{
unsigned long int tempfrequence;
unsigned int H_16bit,L_16bit;
*P_Watchdog_Clear=1;
Frequency = (unsigned long int)Frequency * 35.79139413;
tempfrequence = Frequency >>8;
H_16bit = (unsigned int)(tempfrequence>>8);
L_16bit = (unsigned int)(Frequency & 0x0000ffff);
WriteFreq(H_16bit,H_16bit);
}
//***********************************************************************************//
//函数名称:InitialSystem()
//功能:初始化IO口,LCD,AD9851,键盘,
//************************************************************************************//
void InitialSystem()
{
*P_IOA_Dir = 0xffe7;
*P_IOA_Attrib = 0xffe7;
*P_IOA_Data = 0x0000;
*P_SystemClock = 0x0000; //设置系统时钟为最快
Init9851();
Initial_lcd();
KeyInit();
*P_TimerA_Ctrl = 0x0030; // 时钟频率为CLKA的Fosc/2
*P_TimerA_Data = TIMER_DATA_FOR_32KHZ; // 置入计数初值,数据采样率为 32kHz
Page();
KeyFlag = NoKey;
wei_flag = 0;
state = normal;
FM_flag = 0;
V_value = 0;
Ctrl_val = 0;
fre_val = 0;
fo = 3579140; //初始中心频率默认为100K
WriteAD9851(1000); //开机默认输出1000Hz
}
//************************************************************************************************//
// 函数: main()
// 描述:主函数
//************************************************************************************************//
main()
{
unsigned int j,k,*showtemp;
*P_Watchdog_Clear=1;
InitialSystem(); //系统初始化
//***************************************//
ma[0] = 0x00f0;
CtrlAM(ma[0]);
WriteAD9851(1000);
WriteAD9851(100000);
WriteAD9851(1000000);
WriteAD9851(5000000);
WriteAD9851(10000000);
WriteAD9851(15000000);
//***************************************//
while(1) //扫描键盘
{
// AGC();
KeyFlag = KeyScan();
if(KeyFlag)
{
KeyVal = GetKey();
switch (KeyVal)
//**********************************************************************************************//
{ case 1:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -