⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dds.c

📁 累加器的描述
💻 C
字号:
					   					   #include <reg52.h>
#include "intrins.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 line2[16]={"当前频率:    kHz"};
uchar code line3[16]={"当前幅值:   V"};
uchar code line4[16]={"波形:           "};

uchar code table[]={"0123456789 "};  //半字符数字码表
uchar  a[8]=0;                  //装载要显示频率的数组

long int f=0;     //输入的频率
//uint AA=0;     //输入的幅度
uchar code wavetype[24]={"sin波 方波  叁角波锯齿波"};

unsigned char key,count_set,cpld, key_flag1,boxing_flag;
unsigned int count;
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 P33=P3^3;sbit P34=P3^4;

unsigned char keyhh();
void init12864() ;
void LCD_Write_order(uchar Command);
void LCD_Write_Data(uchar ddd);
void display();


//==============================================================
//函数名称: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 keyhh()
//函数功能:按键检测并去除抖动,返回键值
//=============================================================
 unsigned char keyhh()
{
  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 0xe0:return(4);break;
      
      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<16;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(uint value)
//函数功能:显示选择的波形,调用前先送液晶地址
//=====================================================
void display()
{
	uchar i;
	uchar j;
    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;
  
    for(i=0; i<8; i++)            //在液晶12864上显示频率
    { 
        LCD_Write_order(0x96+i);  
        LCD_Write_Data(table[a[i]]);
    }


	switch(boxing_flag)
	{
        case 0:	 LCD_Write_order(0x9b);	 	 //显示正弦波 
	             for(j=0;j<6;j++)
		           LCD_Write_Data(wavetype[j]);
                 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 main(void)
{ //long int f;

  init12864();	 //初始化12864函数 
	
  f=1000;

  boxing_flag=0;
  while(1)
      {switch (keyhh())
	   {
	    case 0:  	break;											
        case 1:  f+=100;if(f>200000||f<0)f=0;break;
	    case 2:  f-=100;if(f>200000||f<0)f=0;break;
        case 3:  boxing_flag++; 
			    if (boxing_flag==4)
			      boxing_flag=0;	break;
        default:  break; 
	   } 
	  //LCD_Write_order(0x95);   //设定光标位置  
	  display();		   //频率更新后的数据显示
	 dectohex(f);
	  //LCD_Write_order(0x8c);  //设定光标位置  
	  //display(A);			 //幅度更新后的数据显示
	 type_gettype();
	 display();

	}
                
 }

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -