📄 signal.c
字号:
/**************************************************************************
File Name: signal.c
Author: liuxinfa
Created: 2008/15/1
Modified: NO
Revision: 1.0
Email: mc22@163.com
***************************************************************************/
#include<reg52.h>
#include<LCD12864.h>
#include<AD9850.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
ulong F_data=1000,S_data=10;
uchar P_data=0; //频率,步进,相位
uchar code buf1[14] ={0xd5,0xfd,0xcf,0xd2,0xd0,0xc5,0xba,0xc5,0xb7,0xa2,0xc9,0xfa,0xc6,0xf7};//正弦信号发生器
//Port Definitions*********************************************************
sbit LCDLED=P2^7; //LCD背光
//Delay*******************************************************************
void Delay(uint ms)
{
uchar i;
while(ms--)
{
for(i=126;i>1;i--);
}
}
//LCD显示***************************************************************
//开机画面
void LCD_Begin()
{
print(0,0,"毕业设计");
printstr(0,1,buf1,14); //显示正弦信号发生器
print(5,2,"刘新发");
print(3,3,"2008/01/12");
Delay(6000);
}
//文字说明
void LCD_Display()
{
ClearLCD();
print(0,0," DDS信号源");
print(0,1,"当前频率:");
print(0,3,"调谐步进");
}
//数字显示程序(ASCII转换)
void xianshu(ulong a)
{
ulong c,p=0;
c=a/1000000000;
if(c!=0)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%1000000000)/100000000;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%100000000)/10000000;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%10000000)/1000000;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%1000000)/100000;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%100000)/10000;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%10000)/1000;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%1000)/100;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
p=1;
}
c=(a%100)/10;
if(c!=0 || p==1)
{
LCD_Write(LCD_DATA,c+0x30);
}
c=a%10+0x30;
LCD_Write(LCD_DATA,c);
}
//当前参数显示
void Data_Display(ulong a,ulong b)
{
uchar fs,ps;
ulong A=a;
ulong B=b;
if(a%1000==0)
{
fs='K';
a/=1000;
if(a%1000==0)
{
fs='M';
a/=1000;
}
}
else {fs=' ';}
if(b%1000==0)
{
ps='K';
b/=1000;
if(b%1000==0)
{
ps='M';
b/=1000;
}
}
else {ps=' ';}
switch(fs)
{
case 'M':A/=1000000;break;
case 'K':A/=1000;break;
default: break;
}
Set_xy(0,2);
xianshu(A); //显示当前频率
switch(ps)
{
case 'M':B/=1000000;break;
case 'K':B/=1000;break;
default: break;
}
Set_xy(4,3);
xianshu(B); //显示当前步进值
Set_xy(6,2);
LCD_Write(LCD_DATA,0x20); //写个空格
LCD_Write(LCD_DATA,fs);
Set_xy(6,3);
LCD_Write(LCD_DATA,0x20); //写个空格
LCD_Write(LCD_DATA,ps);
print(7,2,"Hz");
print(7,3,"Hz");
}
//按键程序****************************************************************
void Get_key(void)
{
uchar temp;
Delay(10); //延时消抖
if(P1==0xff)return;
temp=P1;
switch(temp)
{
case 0xfe: break;
case 0xfd: {S_data*=10;if(S_data>10000000)S_data=1; break;} //步进调整
case 0xfb: {F_data+=S_data;if(F_data>40000000)F_data=1; break;} //频率加调整
case 0xf7: {F_data-=S_data;if(F_data<1)F_data=40000000;break;} //频率减
default: break;
}
//while(!(P1==0xff)); //等待按键释放
Delay(200);
}
//主程序******************************************************************
main()
{
LCD_Initial();
AD9850_Initial();
LCD_Begin();
LCD_Display();
while(1)
{
LCD_Display();
Data_Display(F_data,S_data); //当前值显示
AD9850_Write(F_data,P_data); //输出频率相位控制字
while(P1==0xff); //等待按键按下
Get_key(); //读键并处理
ClearLCD();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -