📄 dds.c
字号:
#include <reg52.h>
#include <intrins.h>
#include<absacc.h>
#define uchar unsigned char //类型重定义
#define uint unsigned int //类型重定义
sbit CS=P3^5; // LCD_4 选通
sbit SID=P3^6; // LCD_5 串行数据输入端
sbit SCLK=P3^7; // LCD_6 串行时钟
uchar code line1[14]={"频率步进:100Hz"};
uchar code line5[2]={"Hz"};
uchar code line2[14]={"频率: "};
uchar code line3[16]={"幅值: V"};
uchar code line4[16]={"波形: "};
uchar code line6[16]={" "};
uchar sb[]={"."};
uchar code table[]={"0123456789 "}; //半字符数字码表
uchar a[8]={0,0,0,0,0,0,0,0}; //装载要显示频率的数组
long int f=0; //输入的频率
uchar fudu=0; //输入的幅度
uchar code wavetype[24]={"sin 方波 叁角波锯齿波"};
sbit DS1804_CS=P1^5; // DS1804端口定义
sbit DS1804_INC=P1^6;
sbit DS1804_UD=P1^7;
unsigned char key, key_flag1,boxing_flag;
unsigned char Data[2];
sbit P12=P1^2;sbit P13=P1^3;
sbit pinlv1=P3^0;sbit pinlv2=P3^1;sbit boxing=P3^2;sbit fudu1=P3^3;sbit fudu2=P3^4;
unsigned char keyhh();
void init12864() ;
void LCD_Write_order(uchar Command);
void LCD_Write_Data(uchar ddd);
void display();
void DS1804_Inc_N_Step();
void DS1804_Dec_N_Step();
//==============================================================
//函数名称:void delay(unsigned int n)
//函数功能:延时函数
//=============================================================
void delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) ;
}
//==============================================================
//函数名称:void dectohex(f)
//函数功能:十进制频率控制字数值转换十六进制数值,分为高8位与低8位
//=============================================================
void dectohex(f)
{ long int Ds;
unsigned int az;
Ds=f/3;
//Ds=Ds*100;
az=Ds/256;
P2=az; //高8位
P0=Ds%256; //低8位
}
//==============================================================
//函数名称:void type_gettype(void )
//函数功能:波形选择
//=============================================================
void type_gettype(void )
{
switch (boxing_flag)
{ case 0: P13=0; P12=0; break;//正弦波
case 1: P13=0; P12=1; break;//方波
case 2: P13=1; P12=0; break;//三角波
case 3: P13=1; P12=1; break;//锯齿波
default: break;
}
}
//==============================================================
//函数名称:unsigned char keyscan()
//函数功能:按键检测并去除抖动,返回键值
//=============================================================
unsigned char keyscan()
{
unsigned char fromkey;
fromkey=P3&0x1f;
if (fromkey!=0x1f)
{
delay(20);
fromkey=P3&0x1f;
while ((P3&0x1f)!=0x1f)
{
;//wait key release
}
switch (fromkey)
{
case 0x1f:return(0);break;//无按键
case 0x1e:return(1);break;//按SW2 FRE递增
case 0x1d:return(2);break;//按SW3 FRE递减
case 0x1b:return(3);break;//change WAVE
case 0x17:return(4);break;//按SW4 fudu递增
case 0x0f:return(5);break;//按SW5 fudu递减
default:return(0);break;
}
}
else return(0);
}
//==============================================================
//函数名称:void init12864()
//函数功能:初始化12864函数
//=============================================================
void init12864()
{
uchar i;
LCD_Write_order(0x30); //基本操作指令
LCD_Write_order(0x0f); //开显示,关光标,不闪烁
LCD_Write_order(0x01); //清除显示
LCD_Write_order(0x06); //指定在资料写入或读取时,光标的移动方向
LCD_Write_order(0x0c); //整体显示
LCD_Write_order(0x80); //第1行初始化
for(i=0;i<14;i++)
LCD_Write_Data(line1[i]);
LCD_Write_order(0x90); //第2行初始化
for(i=0;i<10;i++)
LCD_Write_Data(line2[i]);
LCD_Write_order(0x88); //第3行初始化
for(i=0;i<16;i++)
LCD_Write_Data(line3[i]);
LCD_Write_order(0x98); //第4行初始化
for(i=0;i<16;i++)
LCD_Write_Data(line4[i]);
}
//==============================================================
//函数名称:void LCD_Write_order(uchar Command)
//函数功能:送命令给夜晶12864函数
//=============================================================
void LCD_Write_order(uchar Command)
{
uchar i,j,tem=0xf8;
CS=1;
for(i=8;i>0;i--)
{
SCLK=0;
SID=tem&0x80;
SCLK=1;
tem<<=1;
}
for(j=2;j>0;j--)
for(i=8;i>0;i--)
{
if(i>4) //送高四位
{
SCLK=0;
SID=Command&0x80;
SCLK=1;
Command<<=1;
}
else //低四位为"0"
{
SCLK=0;
SID=0;
SCLK=1;
}
}
CS=0;
}
//==============================================================
//函数名称:void LCD_Write_Data(uchar Data)
//函数功能:送数据给夜晶12864函数
//=============================================================
void LCD_Write_Data(uchar Data)
{
uchar i,j,tem=0xfa;
CS=1;
for(i=8;i>0;i--)
{
SCLK=0;
SID=tem&0x80;
SCLK=1;
tem<<=1;
}
for(j=2;j>0;j--)
for(i=8;i>0;i--)
{
if(i>4) //送高四位
{
SCLK=0;
SID=Data&0x80;
SCLK=1;
Data<<=1;
}
else //低四位为"0"
{
SCLK=0;
SID=0;
SCLK=1;
}
}
CS=0;
}
//=====================================================
//函数名称:void display()
//函数功能:显示选择的波形,调用前先送液晶地址
//=====================================================
void display()
{
uchar i,j,k;
a[0]=f/10000000;
a[1]=f/1000000%10;
a[2]=f/100000%10;
a[3]=f/10000%10;
a[4]=f/1000%10;
a[5]=f/100%10;
a[6]=f/10%10;
a[7]=f%10;
LCD_Write_order(0x93);
for(i=0; i<8; i++) //在液晶12864上显示频率
{
LCD_Write_Data(table[a[i]]);
}
LCD_Write_order(0x97);
for(j=0;j<2;j++)
{
LCD_Write_Data(line5[j]);
}
a[0]=fudu/10; //在液晶12864上显示幅值
a[1]=fudu%10;
LCD_Write_order(0x8b);
LCD_Write_Data(table[a[0]]);
LCD_Write_Data(sb[0]);
LCD_Write_order(0x8c);
LCD_Write_Data(table[a[1]]);
LCD_Write_order(0x8d);
for(k=0;k<6;k++)
{
LCD_Write_Data(line6[k]);
}
switch(boxing_flag)
{
case 0: LCD_Write_order(0x9b); //显示正弦波
for(j=0;j<4;j++)
LCD_Write_Data(wavetype[j]);
LCD_Write_order(0x9d);
for(k=0;k<6;k++)
{
LCD_Write_Data(line6[k]);
}
break;
case 1: LCD_Write_order(0x9b); //显示方波
for(j=6;j<12;j++)
LCD_Write_Data(wavetype[j]);
break;
case 2:LCD_Write_order(0x9b); //显示三角波
for(j=12;j<18;j++)
LCD_Write_Data(wavetype[j]);
break;
case 3: LCD_Write_order(0x9b); //显示锯齿波
for(j=18;j<24;j++)
LCD_Write_Data(wavetype[j]);
break;
default: break;
}
}
//=====================================================
//函数名称:void DS1804_Inc_N_Step()
//函数功能:数字电位器向上调2步
//=====================================================
void DS1804_Inc_N_Step()
{
unsigned char i=0;
DS1804_UD=1; // UD 拉高, 则INC下降沿,执行UP操作
DS1804_CS=0; // CS 拉低
for(i=0;i<2;i++)
{
DS1804_INC=1; // 拉高INC ,使INC的下沿有效
DS1804_INC=0; // INC 拉低, 产生一个下沿
}
DS1804_INC=1;// 完毕CS拉高 ,存储
}
//=====================================================
//函数名称:void DS1804_Dec_N_Step()
//函数功能:数字电位器向下调2步
//=====================================================
void DS1804_Dec_N_Step()
{
unsigned char i=0;
DS1804_UD=0; // U/D 清0, 则下面的INC下沿,执行Down操作
DS1804_CS=0; // CS 拉低
for(i=0;i<2;i++)
{
DS1804_INC=1; // 拉高INC 因为INC的下沿有效
DS1804_INC=0; // INC 拉低; // 产生一个下沿
}
DS1804_CS=1; // 完毕CS拉高 ,存储
}
//主函数
void main(void)
{
init12864(); //初始化12864函数
f=100;
fudu=5;
boxing_flag=0;
while(1)
{switch (keyscan())
{
case 0: break;
case 1: f+=100;if(f>596000||f<0)f=100;break;
case 2: f-=100;if(f>596000||f<0)f=100;break;
case 3: boxing_flag++;
if (boxing_flag==4)
boxing_flag=0; break;
case 4: DS1804_Inc_N_Step();fudu+=1;if(fudu>50||fudu<0)fudu=1;display();break;
case 5: DS1804_Dec_N_Step();fudu-=1;if(fudu>50||fudu<0)fudu=1;display();break;
default: break;
}
dectohex(f);
display();
type_gettype();
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -