花生漫画

应用AD9850主函数

0
阅读(20949)

 

#include 
#include 
#include 	                
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
uchar b,k=2,l=1;
uchar key,f=1;
ulong m=1000,n=1,bj=10;
ulong a,temp1;
float freq;
				  
sbit W_CLK = P2^4;
sbit FQ_UD = P2^3;
sbit RST   = P2^2;

sbit LCD_RS = P2^7;             
sbit LCD_RW = P2^6;
sbit LCD_EN = P2^5;

uchar code   str11[ ] = {"now F:        HZ"};
uchar code   str12[ ] = {"now F:        HZ"};
uchar code   str13[ ] = {"now F:       KHZ"};
uchar code   str14[ ] = {"now F:       KHZ"};
uchar code   str15[ ] = {"now F:       KHZ"};
uchar code   str16[ ] = {"now F:       KHZ"};
uchar code   str21[ ] = {"range F: *10  HZ"};
uchar code   str22[ ] = {"range F: *100 HZ"};
uchar code   str23[ ] = {"range F: *1  KHZ"};
uchar code   str24[ ] = {"range F: *10 KHZ"};
uchar code   str25[ ] = {"range F: *100KHZ"};
uchar code   str26[ ] = {"range F: *1  MHZ"};
uchar code   str31[ ] = {"set F:        HZ"};
uchar code   str32[ ] = {"range F: 0-10MHZ"};
uchar data  cdis3[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};
uchar code  cdis4[ ] = {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20};  
uchar data  cdis6[ ] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar data  display[]=	{0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar data  display1[]=	{0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar data  freqency[]=	{0x00,0x00,0x00,0x00};
uchar code key_code[]=
{
  //键编码数组
  0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb,
  0xb7, 0x7e, 0x7d, 0x7b, 0x77
};

char code reserve[3]_at_ 0x3b; //保留x3b开始的个字节

/*********************************************************

us延时子函数   (4.34us)

 *********************************************************/
void delayNOP()
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}

/**********************************************************

键盘扫描子函数

 **********************************************************/
void keyscan()
{
  uchar scan1, scan2, keycode, j;

  P1 = 0xf0;
  scan1 = P1;
  if (scan1 != 0xf0)
  //判键是否按下
  {
    delayms(10); //延时ms
    scan1 = P1;
    if (scan1 != 0xf0)
    //二次判键是否按下
    {
      P1 = 0x0f;
      scan2 = P1;
      keycode = scan1 | scan2; //组合成键扫描编码

      for (j = 0; j < 16; j++)
      {
        if (keycode == key_code[j])
        //查表得键值
        {
          key=j; //返回有效键值
        }
      }
    }
  }
  else
	key=16;//返回无效码

 if(key <= 9)
  {
   f=0;
   for(j=6;j>0;j--)
    display[j]=display[j-1];
	display[0]=key;
  }
  else if(key==10)
  {
   a=display[6]*1000000+display[5]*100000+display[4]*10000+display[3]*1000+display[2]*100+display[1]*10+display[0];
   if((a/1000>=1000)&&(a/1000<=9999))
     {
	 k=5;
	 n=1000;
	 freqency[3]=display[6];
	 freqency[2]=display[5];
	 freqency[1]=display[4];
	 freqency[0]=display[3];
	 }
   if((a/100>=1000)&&(a/100<=9999))
     {
	 k=4;
	 n=100;
	 freqency[3]=display[5];
	 freqency[2]=display[4];
	 freqency[1]=display[3];
	 freqency[0]=display[2];
	 }
   if((a/10>=1000)&&(a/10<=9999))
     {
	 k=3;
	 n=10;
	 freqency[3]=display[4];
	 freqency[2]=display[3];
	 freqency[1]=display[2];
	 freqency[0]=display[1];
	 }
   if((a>=1000)&&(a<=9999))
     {
	 k=2;
	 n=1;
	 freqency[3]=display[3];
	 freqency[2]=display[2];
	 freqency[1]=display[1];
	 freqency[0]=display[0];
	  }
   if((a>=100)&&(a<=999))
     {k=1;
	 n=1;
	 freqency[3]=display[3];
	 freqency[2]=display[2];
	 freqency[1]=display[1];
	 freqency[0]=display[0];
	 }
   if((a>=10)&&(a<=99))
     {
	 k=0;
	 n=1;
   	 freqency[3]=display[3];
	 freqency[2]=display[2];
	 freqency[1]=display[1];
	 freqency[0]=display[0];
	 }
     m=freqency[3]*1000+freqency[2]*100+freqency[1]*10+freqency[0];
	 for(j=0;j<7;j++)
     display[j]=0x00;
     f=1;
  }
  else if(key==11)
  {
   b=~b;
  }
  else if(key==12)
  {
     k=k+1;
   if(k==6) 
     k=0;
   if(k==0)
     {
	 m=10;
	 n=1;
	 }
   if(k==1)
     {m=100;
	 n=1;
	 }
   if(k==2)
     {
	 m=1000;
	 n=1;
	 }
   if(k==3)
     {m=1000;
	 n=10;
	 }
   if(k==4)
     {
	 m=1000;
	 n=100;
	 }
   if(k==5)
     {
	 m=1000;
	 n=1000;
	 }
  }
  else if(key==13)
  {
   if(k==0)
     temp1=10;
   if(k==1)
     temp1=100;
   if(k>=2)
     temp1=1000;
   if(m<(temp1*10-bj))
   m=m+bj;
  }
  else if(key==14)
  {
   if(k==0)
     temp1=10;
   if(k==1)
     temp1=100;
   if(k>=2)
     temp1=1000;
   if(m>(temp1/10+bj))
   m=m-bj;
   
  }
  else if(key==15)
  {
     l++;
   if(l==4)
     l=0;
   if(l==0)
     bj=1;
   if(l==1)
     bj=10;
   if(l==2)
     bj=100;
   if(l==3)
     bj=1000;
  }
  else ;
  for(j=0;j<7;j++)
     display1[j]=display[j]+0x30;
  freq=m*n;	 
}

/**********************************************************

显示当前频率

 **********************************************************/
void Play_nowfreq()
{
 uchar i;
 uint  temp;
 temp=m;

   for (i = 0; i < 3; i++)
  //数据转换
  {
    freqency[i] = temp%10+0x30;
    temp = temp / 10;
  }
    freqency[3] = temp + 0x30;
 
  for (i = 3; i > 0; i--)
  //高位为"0"不显示
  {
    if (freqency[i] == 0x30)
        freqency[i] = 0x20;
    else
      break;
  }
  lcd_pos(1, 8);
   	for (i =3; i !=0xff; i--)
	{
	lcd_wdat(freqency[i]);

	if(k==2)
	  {if(i==3)
		lcd_wdat('.');}
	if(k==3)
	  {if(i==2)
		lcd_wdat('.');}
	if(k==4)
	  {if(i==1)
		lcd_wdat('.');}
	}
		
}
/*************************************************************/
/*                                                           */
/* 主程序                                                   */
/*                                                           */
/*************************************************************/ 
 void main()
 {
  uchar i,j;
  P0 = 0xff; //端口初始化
  P1 = 0xff;
  P2 = 0xff;

  lcd_init(); //初始化LCD
  write_str(0x80, str13); //液晶显示字符串
  write_str(0xc0, str23);
  AD9851_RST();
  while(1)
  {
   keyscan();
   if(f)
   {
   switch(k)
   {case 0: 
   { write_str(0x80, str11); //液晶显示字符串
     write_str(0xc0, str21);}break;  
   case 1:
    { write_str(0x80, str12); //液晶显示字符串
      write_str(0xc0, str22);}break; 
   case 2:
    { write_str(0x80, str13); //液晶显示字符串
      write_str(0xc0, str23);}break; 
   case 3:
    { write_str(0x80, str14); //液晶显示字符串
      write_str(0xc0, str24);}break; 
   case 4:
    { write_str(0x80, str15); //液晶显示字符串
      write_str(0xc0, str25);}break;  
   case 5:
    { write_str(0x80, str16); //液晶显示字符串
      write_str(0xc0, str26);}break; 
   default: break;}
    AD9851_SET(freq);
    Play_nowfreq();
	}
	else
	  {
	   write_str(0x80, str31); //液晶显示字符串
       write_str(0xc0, str32);
	  for (j = 6; j > 0; j--)
  //高位为"0"不显示
     {
    if (display1[j] ==0x30)
        display1[j] = 0x20;
    else
      break;
	  }
	   lcd_pos(1, 8);
	   for (i =6; i !=0xff; i--)
	   lcd_wdat(display1[i]);
	  		}
   	delayms(200);
 
  } 
  }