#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define ulint unsigned long int
#define uint unsigned int
#define AD9851 XBYTE[0x8000] //CS0
#define KEY_H XBYTE[0xFC00]
#define KEY_L XBYTE[0xFE00]
#define LCD_CW XBYTE[0xFB00]
#define LCD_DW XBYTE[0xFB01]
#define LCD_CR XBYTE[0xFB02]
#define led XBYTE[0xFF00]
sbit A0=P1^0;
sbit A1=P1^1;
sbit A2=P1^2;
sbit RESET=P1^3
;
#define WHILE_BUSY while(LCD_CR & 0x80) //读LCD状态字,若为0x80,则等待/LCD_CR & 0x80
uchar W0,W1,W2,W3,W4,F1,F2,F3,F4,F5,F6,F7,F8,n;
long i,k;
ulint num1,num2,num3,F,num;
uint x,y,z;
float F9,num4;
void nint_LCD()//LCD初始化
{
LCD_CW=0x0c; //00001100,开显示,不显示光标,光标不闪烁/
WHILE_BUSY; //忙等待/
LCD_CW=0x38; //设置16×2显示,5×7点阵,8位数据接口
}
void print(uchar *str,uchar addr)//LCD字符串输出
{
WHILE_BUSY; //忙等待,不能少!!!/
LCD_CW = 0x80 | addr; //向LCD写入地址,数据指针初始地址为0x80/
while(*str!='\0') //写到字符串结束/
{
WHILE_BUSY; //忙等待/
LCD_DW=*str; //向LCD写入数据/
str++; //写下一个字符/
}
}
void dis_LCD(uchar date,uchar addr)//LCD字符输出
{
WHILE_BUSY; //忙等待,不能少!!!/
LCD_CW = 0x80 | addr; //向LCD写入地址,数据指针初始地址为0x80/
WHILE_BUSY; //忙等待/
LCD_DW = date; //向LCD写入数据/
}
void delay(z)
{
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write()
{
//RESET=0;
AD9851=W0;
AD9851=W1;
AD9851=W2;
AD9851=W3;
AD9851=W4;
k=AD9851;
delay(1);
}
void nint()
{
num=477+239*i;//频率控制字
num1=num>>24;
num2=num>>16;
num3=num>>8;
W0=0x01; //工作在6倍参考时钟倍乘器方式下,并行方式,非掉电方式,初始相位为0
W1=num1&0xff;
W2=num2&0xff;
W3=num3&0xff;
W4=num&0xff;
write();
}
void anjian()
{
KEY_H=0xfe;
delay(55);
if(KEY_L==0xfe) //按键S1,10Hz
{
delay(55);
if(KEY_L==0xfe)
{
led=0xfe;
i++;
if(i>99999980)
{
i=0;
}
}
}
if(KEY_L==0xfd) //按键S2
{
delay(60);
if(KEY_L==0xfd)
{
led=0xfd;
i--;
if(i<0)
{
i=0;
}
}
}
KEY_H=0xfd;
delay(55);
if(KEY_L==0xfe) //按键S3,100Hz
{
delay(55);
if(KEY_L==0xfe)
{
led=0xfb;
i=i+10;
if(i>10000000)
i=0;
}
}
if(KEY_L==0xfd) //按键S4
{
delay(60);
if(KEY_L==0xfd)
{
led=0xf7;
i=i-10;
if(i<0)
{
i=0;
}
}
}
KEY_H=0xfb;
delay(55);
if(KEY_L==0xfe) //按键S5,1KHz
{
delay(55);
if(KEY_L==0xfe)
{
led=0xef;
i=i+100;
if(i>1000000)
i=0;
}
}
if(KEY_L==0xfd) //按键S6
{
delay(60);
if(KEY_L==0xfd)
{
led=0xdf;
i=i-100;
if(i<0)
{
i=0;
}
}
}
KEY_H=0xf7;
delay(55);
if(KEY_L==0xfe) //按键S7,10KHz
{
delay(55);
if(KEY_L==0xfe)
{
led=0xbf;
i=i+1000;
if(i>100000)
i=0;
}
}
if(KEY_L==0xfd) //按键S8
{
delay(60);
if(KEY_L==0xfd)
{
led=0x7f;
i=i-1000;
if(i<0)
{
i=0;
}
}
}
KEY_H=0xef; //按键S9
delay(50);
if(KEY_L==0xfe)
{
delay(50);
if(KEY_L==0xfe)
{
n++;
if(n%6==1)
{
A2=0,A1=0,A0=0;
print("000 ",0x40);
}
if(n%6==2)
{
A2=0,A1=0,A0=1;
print("001 ",0x40);
}
if(n%6==3)
{
A2=0,A1=1,A0=0;
print("010 ",0x40);
}
if(n%6==4)
{
A2=0,A1=1,A0=1;
print("011 ",0x40);
}
if(n%6==5)
{
A2=1,A1=0,A0=0;
print("100 ",0x40);
}
if(n%6==0)
{
A2=1,A1=0,A0=1;
print("101 ",0x40);
}
}
}
}
void jisuan()
{
num4=(float)num;
F9=0.042*num4; //0.042=180MHz除以2^32
F=(ulint)F9;
F1=F/10000000%10;
F2=F/1000000%10;
F3=F/100000%10;
F4=F/10000%10;
F5=F/1000%10;
F6=F/100%10;
F7=F/10%10;
F8=F%10;
}
void display()
{
print("F=",0x00);
dis_LCD(F1+0x30,0x02);
dis_LCD(F2+0x30,0x03);
print(",",0x04);
dis_LCD(F3+0x30,0x05);
dis_LCD(F4+0x30,0x06);
dis_LCD(F5+0x30,0x07);
print(",",0x08);
dis_LCD(F6+0x30,0x09);
dis_LCD(F7+0x30,0x0a);
dis_LCD(F8+0x30,0x0b);
print("Hz",0x0c);
}
void main()
{
nint_LCD();
//nint();
num=0;
i=0;
RESET=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
RESET=0;
_nop_();
_nop_();
while(1)
{
nint();
RESET=1;
RESET=0;
anjian();
jisuan();
display();
}
}