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

📄 main.c

📁 信号发生器界面菜单程序,有串和并口两种源程序
💻 C
字号:
#include<reg51.h>
#include <stdlib.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void lcd_write_ins(uchar i);
sbit data_in=P2^3;
sbit data_clk=P2^4;
sbit comtrol_oe=P2^5;
sbit comtrol_in=P2^6;
sbit comtrol_clk=P2^7;
sbit key_port0=P1^0;
sbit key_port1=P1^1;
sbit key_port2=P1^2;
sbit key_port3=P1^3;
sbit key_port4=P1^4;
sbit lcd_da=P1^5;
sbit lcd_clk=P1^6;
bit main_make=1;
uchar data line[9];
uchar p;
uchar up_down=1;
uchar all=0;
uchar code fre[]={"1.频率调节"};
uchar code am[]={"2.AM幅度调制"};
uchar code pa_sk[]={"3.产生psk,ask"};
uchar code fm[]={"4.FM频率调制"};
uchar code fre_mode_tab1[]={"请输入频率后按确"};
uchar code fre_mode_tab2[]={"定输出或按返回重"};
uchar code fre_mode_tab3[]={"新输入!"};
uchar code fre_mode_tab4[]={"        (Hz)"};
uchar code am_mode_tab1[]={"请选择调制度Ma"};
uchar code am_mode_tab2[]={"10%"};
uchar code pa_sk_mode_tab1[]={"选择ASK/PSK.模式"};
uchar code pa_sk_mode_tab2[]={"  ASK  PSK  "};
uchar code pa_sk_mode_tab3[]={"输入基带序列编码"};
uchar code pa_sk_mode_tab4[]={""};
uchar code fm_mode_tab1[]={"按左右键选择频偏"};
uchar code fm_mode_tab2[]={" 5K  10K"};
uchar code fm_mode_tab3[]={"请输入载波频率"};
uchar code fm_mode_tab4[]={"        (Hz)"};
/******************************送控制DDS_AD9851控制字*************************************/
void rx_74164(unsigned char a)             //通过74164把数据传给FPGA
{unsigned char i;

 for (i=0;i<8;i++)
  { a<<=1;  data_in=CY;
    data_clk=0;
    data_clk=1;
    data_clk=0;
  }
}
void comtrol(unsigned char b)
{ unsigned char i;

   for (i=0;i<8;i++)
    {b<<=1;comtrol_in=CY;
     comtrol_clk=0;
     comtrol_clk=1;
     comtrol_clk=0;
    }
   comtrol_oe=1;
   comtrol_oe=0;
   comtrol_oe=1;
}
//--------------------------------------------------------------
void send_fre_data(void)
{
 float y;
 ulong z;
 uchar i,b;
 uchar x0,x1,x2,x3;
 y=atof(line);
 z=y*35.7913941;
 x0=z/16777216;
 x1=(z%16777216)/65536;
 x2=((z%16777216)%65536)/256;
 x3=(((z%16777216)%65536)%256)/1;b=0x0f;
 comtrol(0x00);
 rx_74164(x3);
 lcd_write_ins(0x01);
 comtrol(0xff);
 rx_74164(x2);
  lcd_write_ins(0x01);
 comtrol(0x02);
 comtrol(0xff);
 rx_74164(x1);
 comtrol(0x03);
 comtrol(0xff);
 rx_74164(x0);
 comtrol(4);
 comtrol(0xff);
 rx_74164(1);
 comtrol(5);
 comtrol(0xff);
 comtrol(6);
 comtrol(7);
 comtrol(0xff);
 _nop_();
}
/**************************以下为液晶显示子程序***********************/
void lcd_delay(void)                       //显示延时1MS
{
 uint i;
 for(i=0;i<50;i++);
 _nop_();
}
//------------------------------------发数据
void lcd_send_data(uchar mun)
{
 uchar i;
 for(i=0;i<8;i++)
 {
    lcd_clk=0;
  if((mun&0x80)!=0)lcd_da=1;
    else lcd_da=0;
    lcd_clk=1;
  mun=mun<<1;
 }
}
//-----------------------------------------------写指令
void lcd_write_ins(uchar num)
{
 uchar hdata,ldata;
 hdata=num&0xf0;
 ldata=((num<<4)&0xf0);
 lcd_send_data(0xf8);
 lcd_delay();
 lcd_send_data(hdata);
 lcd_delay();
 lcd_send_data(ldata);
 lcd_delay();
}
//-----------------------------------写数据
void lcd_write_da(uchar num)
{
 uchar hdata,ldata;
 hdata=num&0xf0;
 ldata=((num<<4)&0xf0);
 lcd_send_data(0xfa);
 lcd_delay();
 lcd_send_data(hdata);
 lcd_delay();
 lcd_send_data(ldata);
 lcd_delay();
}
//-------------------------------------X表示第几个字,Y表示第几行,Z表示字符;
void lcd_show(uchar x,uchar y,uchar *z)
{
  switch (y)
  {
    case 1:lcd_write_ins(0x80+x-1);break;
    case 2:lcd_write_ins(0x90+x-1);break;
    case 3:lcd_write_ins(0x88+x-1);break;
    case 4:lcd_write_ins(0x98+x-1);break;
	default:break;
  }
  while(*z)
  {
  lcd_write_da(*z++);
  }
 }
//--------------------------------------------
//12864液晶反白子程序
//X第几个字(1~8),Y第几行(1~4行),width反白的宽度(1~16)(单位:字符)
//若width==0则上次反白的位置变为正常显示,若width!=0,上次反白的位
//置变为正常显示,则这次反白的位置反白。
void fan(uchar lcd_x,uchar lcd_y,uchar width)
{
 uchar xx,yy,i,j;
 yy=0x80;xx=0x80;       //下半屏绘图区X,y轴地址
 lcd_write_ins(0x36);        //扩展指令模式,形图开关开
 for (i=0;i<32;i++)     //上半屏处理显示空白
 {
   lcd_write_ins(yy++);lcd_write_ins(xx);
   for (j=0;j<16;j++)
   { lcd_write_da(0x00);}
 }
 yy=0x80;xx=0x88;         //下半屏绘图区X,轴地址
 for (i=0;i<32;i++)     //下半屏处理显示空白
 {
   lcd_write_ins(yy++);  lcd_write_ins(xx);
   for (j=0;j<16;j++)
   { lcd_write_da(0x00); }
 }
 lcd_write_ins(0x30);       //基本指令模式

//-------------------------------------------
 if(width!=0)                  //如果width不等0,则反白选中区域并存此次的参数
 {
  if(lcd_y>2)
  {
   xx=lcd_x+0x87;
   yy=((lcd_y-3)<<4)+0x80;
  }
  else
  {
   xx=lcd_x+0x7f;
   yy=((lcd_y-1)<<4)+0x80;
  }
 //--------------------反白选中区域----------------------------
  lcd_write_ins(0x36);              //扩展指令模式,形图开关开
  for (i=0;i<16;i++)           //一行处理显示
  {
  lcd_write_ins(yy++);lcd_write_ins(xx);
   for (j=0;j<width;j++)
   { lcd_write_da(0xff);}
  }
  lcd_write_ins(0x30);              //基本指令模式
 }
}
//----------------------------------------------lcd初始化
void lcd_begin(void)
{
lcd_delay();
lcd_write_ins(0x30);
lcd_write_ins(0x08);
lcd_write_ins(0x0e);
lcd_write_ins(0x01);
lcd_write_ins(0x06);
}
/********************************以下为键盘子程序*******************************************/
     void key_delay(void)                        //按键延时15ms
     {
      uchar i; uint j;
	  for(i=0;i<50;i++)
	  {
	   for(j=0;j<2000;j++)
	   {
	    _nop_();
	   }
	  }
     }
//-----------------------------------------按键功能;
     void key_1(void){line[p++]='1';lcd_write_da('1');}
	 void key_2(void){line[p++]='2';lcd_write_da('2');}
	 void key_3(void){line[p++]='3';lcd_write_da('3');}
	 void key_4(void){line[p++]='4';lcd_write_da('4');}
	 void key_5(void){line[p++]='5';lcd_write_da('5');}
	 void key_6(void){line[p++]='6';lcd_write_da('6');}
	 void key_7(void){line[p++]='7';lcd_write_da('7');}
	 void key_8(void){line[p++]='8';lcd_write_da('8');}
	 void key_9(void){line[p++]='9';lcd_write_da('9');}
	 void key_0(void){line[p++]='0';lcd_write_da('0');}
	 void key_up(void)
	 {
          lcd_write_ins(0x0c);
	  up_down=up_down-1;
	  if(up_down==0){up_down=4;}
	  switch(up_down)
	  {
	   case 1:{fan(1,1,16);}break;
	   case 2:{fan(1,2,16);}break;
	   case 3:{fan(1,3,16);}break;
	   case 4:{fan(1,4,16);}break;
       default:{}
	  }


	 }
	 void key_point(void){line[p++]='.';lcd_write_da('.');}
	 void key_13(void){}
	 void key_right(void){}
	 void key_enter(void)
	 {
           if(up_down==1)
           {
           all=all+1;
           if(all==3)all=1;
           switch (all)
           {
            case 1:
                   main_make=0;
                   lcd_write_ins(0x01);
                   lcd_show(1,1,fre_mode_tab1);
                   lcd_show(1,2,fre_mode_tab2);
                   lcd_show(1,3,fre_mode_tab3);
                   lcd_show(1,4,fre_mode_tab4);
                   lcd_write_ins(0x98);break;
            case 2:
                   send_fre_data();break;
            default:{}
           }
           }
           else if(up_down==2)
           {
            lcd_write_ins(0x01);
            lcd_show(1,1,am_mode_tab1);
	    lcd_show(1,2,am_mode_tab2);
            lcd_write_ins(0x88);
           }
           else if(up_down==3)
           {
           lcd_write_ins(0x01);
           lcd_show(1,1,pa_sk_mode_tab1);
           lcd_show(1,2,pa_sk_mode_tab2);
		   lcd_show(1,3,pa_sk_mode_tab3);
           lcd_write_ins(0x98);
           }
           else if(up_down==4)
           {
           lcd_write_ins(0x01);
           lcd_show(1,1,fm_mode_tab1);
		   lcd_show(1,2,fm_mode_tab2);
		   lcd_show(1,3,fm_mode_tab3);
		   lcd_show(1,4,fm_mode_tab4);
           lcd_write_ins(0x98);
           }
	 }
	 void key_left(void){}
	 void key_17(void){}
	 void key_18(void){}
	 void key_down(void)
	 {
          lcd_write_ins(0x0c);
	  up_down=up_down+1;
	  if(up_down==5){up_down=1;}
	  switch(up_down)
	  {
	   case 1:{fan(1,1,16);}break;
	   case 2:{fan(1,2,16);}break;
	   case 3:{fan(1,3,16);}break;
	   case 4:{fan(1,4,16);}break;
       default:{}
	  }
	 }
	 void key_return(void)
         {
          lcd_write_ins(0x01);
          lcd_show(1,1,fre);
          lcd_show(1,2,am);
          lcd_show(1,3,pa_sk);
          lcd_show(1,4,fm);
          fan(1,up_down,16);
          main_make=1;
         }
//-------------------------------------------按键辩别;
     void argue(uchar num)
	 {
	   if(num!=0xff)
	   {
	     switch(num)
		 {
		   case 1:{key_1();}break;
		   case 2:{key_2();}break;
		   case 3:{key_3();}break;
		   case 4:{key_4();}break;
		   case 5:{key_5();}break;
		   case 6:{key_6();}break;
		   case 7:{key_7();}break;
		   case 8:{key_8();}break;
		   case 9:{key_9();}break;
		   case 10:{key_0();}break;
		   case 11:{key_up();}break;
		   case 12:{key_point();}break;
		   case 13:{key_13();}break;
		   case 14:{key_right();}break;
		   case 15:{key_enter();}break;
		   case 16:{key_left();}break;
		   case 17:{key_17();}break;
		   case 18:{key_18();}break;
		   case 19:{key_down();}break;
		   case 20:{key_return();}break;
		   default:{}
		 }
	   }
	 }
//-------------------------------------------------按键扫描;
     uchar first_line(void)              //扫描第一行;
	 {
	   if(key_port0|key_port1==0)        {key_delay();return(1);}
	     else if(key_port0|key_port2==0) {key_delay();return(2);}
	     else if(key_port0|key_port3==0) {key_delay();return(3);}
	     else if(key_port0|key_port4==0) {key_delay();return(4);}
	     else return(0xff);
     }
	 uchar second_line(void)             //扫描第二行;
	 {
       if(key_port1|key_port0==0)        {key_delay();return(5);}
	     else if(key_port1|key_port2==0) {key_delay();return(6);}
	     else if(key_port1|key_port3==0) {key_delay();return(7);}
	     else if(key_port1|key_port4==0) {key_delay();return(8);}
	     else return(0xff);
	 }
	 uchar third_line(void)              //扫描第三行;
	 {
	   if(key_port2| key_port0==0)       {key_delay();return(9);}
	     else if(key_port2|key_port1==0) {key_delay();return(10);}
	     else if(key_port2|key_port3==0) {key_delay();return(11);}
	     else if(key_port2|key_port4==0) {key_delay();return(12);}
	     else return(0xff);
	 }
	 uchar four_line(void)               //扫描第四行;
	 {
	   if(key_port3|key_port0==0)        {key_delay();return(13);}
	     else if(key_port3|key_port1==0) {key_delay();return(14);}
	     else if(key_port3|key_port2==0) {key_delay();return(15);}
	     else if(key_port3|key_port4==0) {key_delay();return(16);}
	     else return(0xff);
	 }
	 uchar five_line(void)               //扫描第五行;
	 {
	   if(key_port4|key_port0==0)        {key_delay();return(17);}
	     else if(key_port4|key_port1==0) {key_delay();return(18);}
	     else if(key_port4|key_port2==0) {key_delay();return(19);}
	     else if(key_port4|key_port3==0) {key_delay();return(20);}
	     else return(0xff);
	 }
//-------------------------------------------键盘入口;
     void key_board(void)
     {
	   uchar num;
	   while(1)
	   {
       key_port0=0;
	   num=first_line();
	   argue(num);
	   key_port0=1;key_port1=0;
	   num=second_line();
	   argue(num);
	   key_port1=1;key_port2=0;
	   num=third_line();
	   argue(num);
	   key_port2=1;key_port3=0;
	   num=four_line();
	   argue(num);
	   key_port3=1;key_port4=0;
	   num=five_line();
	   argue(num);
	   key_port4=1;
	   }
	 }
//-------------------------------------
main()
{
 lcd_begin();
 lcd_show(1,1,fre);
 lcd_show(1,2,am);
 lcd_show(1,3,pa_sk);
 lcd_show(1,4,fm);
 fan(1,1,16);
 key_board();
}

⌨️ 快捷键说明

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