📄 9850.c
字号:
//-----------
//调用头文件
//-----------
#include<c8051f020.h>
#include<intrins.h>
#include<CH452CMD.H>
#include"PIN.H"
#include"math.h"
//-------
//宏定义
//-------
#define uchar unsigned char
#define uint unsigned int
//---------------------
//AD9850控制线连接声明
//---------------------
#define set_WCLK {P4|=0x02;}
#define reset_WCLK {P4&=0xfd;}
#define set_FQUD {P4|=0x01;}
#define reset_FQUD {P4&=0xfe;}
#define reset {P4|=0x08;}
#define set {P4&=0xf7;}
#define AUTO 0
//sbit WCLK=P4^1;//sbit WCLK_9850=P4^1;
//sbit FQUD=P4^0//sbit FQUD_9850=P4^0;
//-----------
//子函数声明
//-----------
void initial_9850(void);
void start_9850(void);
void Port_IO_Init(void);
void CH452_Write(unsigned short );
unsigned char CH452_Read( void );
void DDS_TURNINGWORD(unsigned char);
void jishuang(unsigned char *step);
void key_value(void);
//void delay1(uchar x);
unsigned char key,keyvalue,keyintFlag;
uchar turningWord[5]={0x00,0x00,0x00,0x0d,0x6b}; //-------设置起始频率为0
unsigned char step_10[5]={0x00,0x00,0x00,0x01,0x57}; //扫频步进设置
unsigned char step_100[5]={0x00,0x00,0x00,0x0d,0x6b};
unsigned char step_1k[5]={0x00,0x00,0x00,0x86,0x37};
unsigned char step_10k[5]={0x00,0x00,0x05,0x2e,0x3d};
unsigned char step_100k[5]={0x00,0x00,0x34,0x6d,0xc5};
//-------
//主函数
//-------
main()
{ static unsigned long i=0;
unsigned char j;
WDTCN = 0xde;
WDTCN = 0xad; //关看门狗
EA=0;
Port_IO_Init();
initial_9850();
EA=1;
CH452_Write(CH452_SYSON2);//打开键盘显示
CH452_Write(CH452_BCD);
CH452_Write(CH452_DIG0|0);
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
NEXT: ENABLE_KEY_INTERRUPT;
keyintFlag=0;
while(keyintFlag==0){;}
DISABLE_KEY_INTERRUPT;
key_value();
if(keyvalue!=AUTO)
{
DDS_TURNINGWORD(keyvalue);
start_9850();
goto NEXT;
}
else{ ENABLE_KEY_INTERRUPT;
for(;i<=300000;i++) //------从0到30MHZ自动扫频
{ //DISABLE_KEY_INTERRUPT;
//if(keyintFlag==1){goto NEXT;}
DDS_TURNINGWORD(1);
// ENABLE_KEY_INTERRUPT;
start_9850();
for(j=0;j<200;j++);
for(j=0;j<200;j++);
for(j=0;j<200;j++);
for(j=0;j<200;j++);
for(j=0;j<200;j++);}
}
}
/*---------------9850初始化--------------------*/
void initial_9850(void)
{reset_WCLK;
reset_FQUD;
reset;
_nop_();
_nop_();
set;
}
/*--------------向9850输入40位控制字,并刷新输出------*/
void start_9850(void)
{uchar i;
for(i=5;i>0;i--)
{reset_WCLK;
// delay1(2);
P7=turningWord[5-i];
set_WCLK;}
// delay1(2);}
reset_WCLK;
set_FQUD;
// delay1(6);
reset_FQUD;
}
/*----------------单片机端口初始化-----------------------*/
void Port_IO_Init()
{
// P0.0 - Unassigned, Open-Drain, Digital
// P0.1 - Unassigned, Open-Drain, Digital
// P0.2 - Unassigned, Open-Drain, Digital
// P0.3 - Unassigned, Open-Drain, Digital
// P0.4 - Unassigned, Open-Drain, Digital
// P0.5 - Unassigned, Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital
// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital
// P2.0 - Unassigned, Open-Drain, Digital
// P2.1 - Unassigned, Open-Drain, Digital
// P2.2 - Unassigned, Open-Drain, Digital
// P2.3 - Unassigned, Open-Drain, Digital
// P2.4 - Unassigned, Open-Drain, Digital
// P2.5 - Unassigned, Open-Drain, Digital
// P2.6 - Unassigned, Open-Drain, Digital
// P2.7 - Unassigned, Open-Drain, Digital
// P3.0 - Unassigned, Open-Drain, Digital
// P3.1 - Unassigned, Open-Drain, Digital
// P3.2 - Unassigned, Open-Drain, Digital
// P3.3 - Unassigned, Open-Drain, Digital
// P3.4 - Unassigned, Open-Drain, Digital
// P3.5 - Unassigned, Open-Drain, Digital
// P3.6 - Unassigned, Open-Drain, Digital
// P3.7 - Unassigned, Open-Drain, Digital
XBR2 = 0x40;
}
/*--------------------向CH452写入命令或数据------------------*/
void CH452_Write(unsigned short cmd)
{
unsigned char i;
DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
CH452_LOAD_CLR; //命令开始,LOAD=0
CH452_LOAD_D_OUT; // 设置LOAD为输出方向
CH452_DOUT_D_IN; // 设置DOUT为输入方向
CH452_DIN_D_OUT; // 设置DIN为输出方向
CH452_DCLK_D_OUT; // 设置DCLK为输出方向
for(i=0;i!=12;i++) //送入12位数据,低位在前
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;} // 输出位数据
// 另外的表达CH452_DIN=cmd&1;
CH452_DCLK_CLR;
cmd>>=1;
DELAY_1US;
DELAY_1US;
CH452_DCLK_SET; //上升沿有效
}
CH452_LOAD=1;//CH452_LOAD_SET; //加载数据,LOAD上升沿
DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US; //命令数据加载周期不小于6US,CH451不需要该周期
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
ENABLE_KEY_INTERRUPT;
}
//*************************************************
//输入按键代码子程序,从CH452读取
unsigned char CH452_Read( void )
{
unsigned char i;
unsigned char cmd,keycode; //定义命令字,和数据存储器
DISABLE_KEY_INTERRUPT; //禁止键盘中断,防止传输过程中被CH452中断而进入中断服务程序中再次传输
cmd=0x07; //读按键的命令字
CH452_LOAD_CLR;
for(i=0;i!=4;i++) // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
{
if (cmd&1) {CH452_DIN_SET;}
else {CH452_DIN_CLR;} // 输出位数据
// CH452_DIN=cmd&1; //送入最低位
CH452_DCLK_CLR;
cmd>>=1; //往右移一位
CH452_DCLK_SET; //产生时钟上升沿锁通知CH451输入位数据
}
CH452_LOAD_SET; //产生加载上升沿通知CH451处理命令数据
keycode=0; //清除keycode
for(i=0;i!=7;i++)
{
keycode<<=1; //数据移入keycode,高位在前,低位在后
if (CH452_DOUT) keycode++; //从高到低读入451的数据
// keycode|=CH452_DOUT;
CH452_DCLK_CLR; //产生时钟下升沿通知CH451输出下一位
CH452_DCLK_SET;
}
CLEAR_KEY_INTER_FLAG; //清中断标志
ENABLE_KEY_INTERRUPT;
return(keycode); //反回键值
}
void DDS_TURNINGWORD(unsigned char a)
{
switch(a)
{case 1:{jishuang(step_10);break;}
case 2:{jishuang(step_100);break;}
case 3:{jishuang(step_1k);break;}
case 4:{jishuang(step_10k);break;}
case 5:{jishuang(step_100k);break;}
default:break;
}
}
void jishuang(unsigned char *step)
{ unsigned char i, temp2=0;
unsigned int temp1=0;
for(i=4;i>0;i--)
{temp1=turningWord[i]+step[i]+temp2;
turningWord[i]=(unsigned char)temp1;
temp2=(unsigned char)(temp1>>8);
}
}
/*--------------键值处理------------------*/
void key_value(void)
{
switch(key)
{case 0x78:{keyvalue=0;break;}
case 0x50:{keyvalue=1;break;}
case 0x58:{keyvalue=2;break;}
case 0x60:{keyvalue=3;break;}
case 0x73:{keyvalue=4;break;}
case 0x51:{keyvalue=5;break;}
case 0x59:{keyvalue=6;break;}
case 0x61:{keyvalue=7;break;}
case 0x7a:{keyvalue=8;break;}
case 0x52:{keyvalue=9;break;}
default:{keyvalue=10;break;}
}
}
/*--------------键盘中断处理-----------------------------*/
void keyint_iso(void)interrupt 19
{ DISABLE_KEY_INTERRUPT;
CLEAR_KEY_INTER_FLAG;
key=CH452_Read();
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
DELAY_1US;
keyintFlag=1;
}
/*void delay1(uchar x)
{uchar i;
for(i=x;i>0;i--);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -