?? dds.c
字號(hào):
#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 串行數(shù)據(jù)輸入端
sbit SCLK=P3^7; // LCD_6 串行時(shí)鐘
uchar code line1[14]={"頻率步進(jìn):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 "}; //半字符數(shù)字碼表
uchar a[8]={0,0,0,0,0,0,0,0}; //裝載要顯示頻率的數(shù)組
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();
//==============================================================
//函數(shù)名稱:void delay(unsigned int n)
//函數(shù)功能:延時(shí)函數(shù)
//=============================================================
void delay(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++) ;
}
//==============================================================
//函數(shù)名稱:void dectohex(f)
//函數(shù)功能:十進(jìn)制頻率控制字?jǐn)?shù)值轉(zhuǎn)換十六進(jìn)制數(shù)值,分為高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位
}
//==============================================================
//函數(shù)名稱:void type_gettype(void )
//函數(shù)功能:波形選擇
//=============================================================
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;
}
}
//==============================================================
//函數(shù)名稱:unsigned char keyscan()
//函數(shù)功能:按鍵檢測并去除抖動(dòng),返回鍵值
//=============================================================
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);
}
//==============================================================
//函數(shù)名稱:void init12864()
//函數(shù)功能:初始化12864函數(shù)
//=============================================================
void init12864()
{
uchar i;
LCD_Write_order(0x30); //基本操作指令
LCD_Write_order(0x0f); //開顯示,關(guān)光標(biāo),不閃爍
LCD_Write_order(0x01); //清除顯示
LCD_Write_order(0x06); //指定在資料寫入或讀取時(shí),光標(biāo)的移動(dòng)方向
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]);
}
//==============================================================
//函數(shù)名稱:void LCD_Write_order(uchar Command)
//函數(shù)功能:送命令給夜晶12864函數(shù)
//=============================================================
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;
}
//==============================================================
//函數(shù)名稱:void LCD_Write_Data(uchar Data)
//函數(shù)功能:送數(shù)據(jù)給夜晶12864函數(shù)
//=============================================================
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;
}
//=====================================================
//函數(shù)名稱:void display()
//函數(shù)功能:顯示選擇的波形,調(diào)用前先送液晶地址
//=====================================================
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;
}
}
//=====================================================
//函數(shù)名稱:void DS1804_Inc_N_Step()
//函數(shù)功能:數(shù)字電位器向上調(diào)2步
//=====================================================
void DS1804_Inc_N_Step()
{
unsigned char i=0;
DS1804_UD=1; // UD 拉高, 則INC下降沿,執(zhí)行UP操作
DS1804_CS=0; // CS 拉低
for(i=0;i<2;i++)
{
DS1804_INC=1; // 拉高INC ,使INC的下沿有效
DS1804_INC=0; // INC 拉低, 產(chǎn)生一個(gè)下沿
}
DS1804_INC=1;// 完畢CS拉高 ,存儲(chǔ)
}
//=====================================================
//函數(shù)名稱:void DS1804_Dec_N_Step()
//函數(shù)功能:數(shù)字電位器向下調(diào)2步
//=====================================================
void DS1804_Dec_N_Step()
{
unsigned char i=0;
DS1804_UD=0; // U/D 清0, 則下面的INC下沿,執(zhí)行Down操作
DS1804_CS=0; // CS 拉低
for(i=0;i<2;i++)
{
DS1804_INC=1; // 拉高INC 因?yàn)镮NC的下沿有效
DS1804_INC=0; // INC 拉低; // 產(chǎn)生一個(gè)下沿
}
DS1804_CS=1; // 完畢CS拉高 ,存儲(chǔ)
}
//主函數(shù)
void main(void)
{
init12864(); //初始化12864函數(shù)
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();
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -