📄 ad9851.c.c
字号:
//#include <reg51.h>
#include <at89X52.H>
#define uchar unsigned char
/*#define set_fq_ud fq_ud=1;
#define clr_fq_ud fq_ud=0;
#define set_clk clk=1;
#define clr_clk clk=0;
#define set_din din=1;
#define clr_din din=0;
*/
sbit P34=P3^3;
sbit fud=P2^7;
sbit sdio=P2^6;
sbit sclk=P2^5;
sbit reset=P2^4;
sbit LCM_RS=P2^0; //定义引脚
sbit LCM_RW=P2^1;
sbit LCM_E=P2^2;
#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
uchar i, j, k, second, tcount, minute, hour;
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadDataLCM(void);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void DisplayqListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
void delay();
uchar disp[10]=" 1000 ";
uchar flag=0;
//void send(uchar x);
//unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};//数码管数字编码
//unsigned char code MyNo[] = {"OK"};
uchar temp=5;
/******************************************************************************************
** 函数名称:delay()
** 功能描述:延时子程序,大约延时 n MS
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
/*void delaynms(uchar n)
{uchar i,j,k;
for(i=2;i>0;i--)
for(j=n;j>0;j--)
for(k=125;k>0;k--);
}*/
/******************************************************************************************
函数名称:delay10ms()
功能:延时10MS
*******************************************************************************************/
void delay10ms()
{
uchar i,j;
for(i=0;i<100;i++)
for(j=0;j<50;j++);
}
/******************************************************************************************
** 函数名称:lcd()
** 功能描述:液晶初始化,然后在液晶屏第二行显示提示信息
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:Delay400Ms(),LCMInit(),DisplayListChar()
********************************************************************************************/
void lcd(void)
{
Delay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
}
/******************************************************************************************
** 函数名称:WriteDataLCM()
** 功能描述:写数据
** 输 入: WDLCM
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在这后加小的延时
LCM_E = 0; //延时
LCM_E = 1;
}
/******************************************************************************************
** 函数名称:WriteCommandLCM()
** 功能描述:写指令
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
{
if (BuysC) ReadStatusLCM(); //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/******************************************************************************************
** 函数名称:ReadDataLCM()
** 功能描述:读数据
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
/*unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}*/
/******************************************************************************************
** 函数名称:ReadStatusLCM()
** 功能描述:读状态
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //检测忙信号
return(LCM_Data);
}
/******************************************************************************************
** 函数名称:LCMInit()
** 功能描述:LCM初始化
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,0);
Delay5Ms();
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WriteCommandLCM(0x08,1); //关闭显示
WriteCommandLCM(0x01,1); //显示清屏
WriteCommandLCM(0x06,1); // 显示光标移动设置
WriteCommandLCM(0x0C,1); // 显示开及光标设置
}
/******************************************************************************************
** 函数名称:DisplayOneChar()
** 功能描述:按指定位置显示一个字符
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
WriteDataLCM(DData);
delay();
}
/******************************************************************************************
** 函数名称:DisplayListChar()
** 功能描述:按指定位置显示一串字符
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
/*void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}*/
/******************************************************************************************
** 函数名称:Delay5Ms()
** 功能描述:5ms延时
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
/******************************************************************************************
** 函数名称:Delay400Ms()
** 功能描述:400ms延时
** 输 入:
** 输 出:
** 全局变量:
** 调用模块:
********************************************************************************************/
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
void delay()
{
uchar i;
for(i=0;i<10;i++);
}
/******************************************************************************************
函数名称:Key1()
功能: 键的判别
******************************************************************************************/
void display(uchar x)
{
uchar code str1[]="Set frency: ";
uchar code str2[]="Out frency: ";
uchar code str4[]="Set Voltage: ";
uchar code str5[]="Out Voltage: ";
uchar i;
switch(x)
{
case 1:
// DisplayOneChar(14, 1, 'H');DisplayOneChar(15, 1, 'z');
for(i=0;i<9;i++)
{
DisplayOneChar(i+5, 1, disp[i]);
}
;
break;
case 2:
DisplayOneChar(14, 1, 'H');DisplayOneChar(15, 1, 'z');
for(i=0;i<16;i++)
{
DisplayOneChar(i, 0, str1[i]);
}
;
break;
case 3:
DisplayOneChar(14, 1, 'H');DisplayOneChar(15, 1, 'z');;
for(i=0;i<16;i++)
{
DisplayOneChar(i, 0, str2[i]);
}
;
break;
case 4:
DisplayOneChar(14, 1, 'm');
DisplayOneChar(15, 1, 'V');;
;
for(i=0;i<16;i++)
{
DisplayOneChar(i, 0, str4[i]);
}
break;
case 5:
DisplayOneChar(14, 1, 'm');
DisplayOneChar(15, 1, 'V');
for(i=0;i<16;i++)
{
DisplayOneChar(i, 0, str5[i]);
}
;
break;
}
}
/*void transad9851(unsigned long f,unsigned char p)
{
long temp;
uchar i,temp2;
clk();//关掉全局中断
temp=f*;//计算32位频率控制字
temp2=p;
clr_fq_ud;
clr_clk;
delay_1us();
for(i=0;i<32;i++)//将32位频率控制字移入dds芯片寄存器
{
if(temp&0x000000200)
set_din;
else
clr_din;
delay_1us();
set_clk;
delay_1us();
temp=temp>>1;
clr_clk;
clr_din;
delay_1us();
}
for(i=0;i<8;i++) //将5位相位控制字及两个(power\reset)控制位移入dds芯片寄存器
{
if(temp2&0x014A)
set_din;
else
clr_din;
delay_1us();
set_clk;
delay_1us();
temp2=temp2>>1;
clr_clk;
clr_din;
delay_1us();
}
set_fq_ud;
delay_nus(3);
clr_fq_ud;
delay_nus(3);
sei();
} */
void writebyte(uchar ch)
{
uchar i;
for(i=0;i<8;i++)
{
if(ch&0x80) sdio=1;else sdio=0;
sclk=0;sclk=0;sclk=1;
ch=ch<<1;
}
}
void init()
{
//int i;
//int j;
reset=0;
delay();
reset=1;
delay();
/*writebyte(0x00);writebyte(0x84);;writebyte(0x00);writebyte(0x00);writebyte(0x00);
//fud=0;delay();fud=1;delay();fud=0;
delay();delay();delay();delay();delay();delay();
//0x00 00 00 20
//
writebyte(0x07);writebyte(0x01);;writebyte(0x00);writebyte(0x63);writebyte(0x00);;writebyte(0x20);
// 0x0100630020;
writebyte(0x08);writebyte(0x01);;writebyte(0x00);writebyte(0xc7);writebyte(0x90);;writebyte(0x21);
//0x0100C79021
writebyte(0x0B);
for(j=0;j<511;j++){writebyte(j/256); writebyte(j%256);writebyte(0x00);writebyte(00); }
for(j=511;j>0;j--){writebyte(j/256); writebyte(j%256);writebyte(0x00);writebyte(00); }
fud=0;delay();fud=1;delay();fud=0;
delay();delay();delay();delay();delay();delay();
*/
writebyte(0x01);writebyte(0x00);writebyte(00);writebyte(0x50);
delay();delay();delay();delay();delay();delay();
writebyte(0x02);writebyte(0x88);writebyte(10);
fud=0;delay();fud=1;delay();fud=0;
delay();delay();delay();delay();delay();delay();
/**/
}
void setfrency(unsigned long f)
{
uchar fo[4],i;
// int f;
unsigned long fw;
// f=12346;
double fww;
fww=f*17.179869184;
fw=fww;
for(i=0;i<4;i++)
{
fo[i]=fw%256;
fw=fw/256;
}
writebyte(0x04);writebyte(fo[3]);writebyte(fo[2]);writebyte(fo[1]);writebyte(fo[0]);
fud=0;delay();fud=1;delay();fud=0;
}
uchar inkey()
{
uchar i,k,j=1;
uchar key_table[16]={0x18,0x11,0x21,0x41,0x12,0x22,0x42,0x14,0x24,0x44,0x81,0x82,0x84,0x28,0x48,0x88};
for (i=0;i<4;i++)
{
P1=~j;
k=~P1;
k=k&0xf0;
if (k!=0) break;
j=j<<1;
}
k=k+j;
for (i=0;i<16;i++)
{
if (key_table[i]==k) break;
}
return i;
}
void key(uchar x)
{
uchar i,k;
unsigned long y;
switch (x)
{
case 15:
if(flag==1)
{
flag=0;
y=0;
for(i=1;i<8;i++)
{
if(disp[i]!=' ')
{
k=disp[i]&0x0f;
y=y*10+k;
}
}
init();
setfrency(y);
display(3);
}
break;
case 14:
display(2);for(i=0;i<8;i++)disp[i]=' ';
flag=2;
break;
case 13:
break;
case 12:
break;
case 10:
display(4);
for(i=0;i<8;i++)disp[i]=' ';
flag=5;
break;
case 11:
display(5);
if(flag==5)
{
k=disp[4]&0x0f;
i=disp[5]&0x0f;
y=k*10+i;
i=disp[6]&0x0f;
//yk=k*5;
//i=i>>1;
//k=k+i;
y=y*10+i;
i=disp[7]&0x0f;
y=y*10+i;
y=y*568/12800;
P3=y;
P34=0;
P34=1;
}
flag=4;
break;
default:
if(flag==2)
{
flag=1;
}
if(flag==1)
{
for(i=1;i<7;i++) disp[i]=disp[i+1];
disp[7]=x+'0';
}
if(flag==5)
{
for(i=4;i<7;i++) disp[i]=disp[i+1];
disp[7]=x+'0';
}
display(1);
}
}
void main()
{
uchar k;
lcd();
/*
sclk=0;
fud=0;
sclk=1;sclk=0;
fud=1;fud=0;
*/
//sclk=0;
// ps1=0;ps0=0;
//fud=0;
//cs=1;
//
init();
//printf(2222);
setfrency(1000);
display(3);
display(1);
P3=255;
P34=0;
P34=1;
while(1)
{
k=inkey();
if(k!=16)
{
delay10ms();
if(k==inkey())
{
key(k);
while(k==inkey());
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -