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

📄 main.c

📁 信号发生器界面菜单程序,有串和并口两种源程序
💻 C
字号:
#include<reg51.h>
#include <stdlib.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
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;
sbit data_in=P2^3;
sbit data_clk=P2^4;
sbit control_oe=P2^5;
sbit control_in=P2^6;
sbit control_clk=P2^7;
sbit dds_da=P3^3;
sbit dds_clk=P3^4;
sbit dds_ag=P3^5;
bit have_data=0;
uchar data line[9];
uchar p;
uchar up_down=1;
uchar data word[5]={0x22,0x22,0x22,0x02,0x01};
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 fm_mode_tab1[]={"按左右键选择频偏"};
uchar code fm_mode_tab2[]={" 5K  10K"};
uchar code fm_mode_tab3[]={"请输入载波频率"};
/******************************送FPGA控制数据*************************************/
//---------------------------------------------------送控制指令
void send_control(uchar x){
uchar i;  CY=0;
 for(i=0;i<8;i++)
 {
  x<<=1;
 control_in=CY;
 control_clk=0;
 control_clk=1;
 control_clk=0;
 }
control_oe=1;
control_oe=0;
control_oe=1;
 }
//-----------------------------------------------送数据
void send_data(uchar x){
uchar i; CY=0;
for(i=0;i<8;i++){
 x<<=1;
 data_in=CY;
 data_clk=0;
 data_clk=1;
 data_clk=0;
 }
 }
//------------------------------------
void send_dds_bit(uchar num)
{
 uchar i;
 CY=0;
 for(i=0;i<8;i++)
 {
  num=num>>1;
  dds_da=CY;
  dds_clk=1;
  dds_clk=0;
 }
}
//-------------------------------------------------数据转化
void send_dds_data(void)
{
 uchar i;
 uchar x0,x1,x2,x3;
 float y;
 ulong z;
 y=atof(line);
 z=y*35.7913941;
 x0=z/16777216;word[3]=x0;
 x1=(z%16777216)/65536;word[2]=x1;
 x2=((z%16777216)%65536)/256;word[1]=x2;
 x3=(((z%16777216)%65536)%256)/1;word[0]=x3;
 for(i=0;i<5;i++)
 {
  send_dds_bit(word[i]);
 }
  dds_ag=1;
  dds_ag=0;
}
/**************************以下为液晶显示子程序***********************/
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)                        //按键延时25Ms
     {
      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');have_data=1;}
	 void key_2(void){line[p++]='2';lcd_write_da('2');have_data=1;}
	 void key_3(void){line[p++]='3';lcd_write_da('3');have_data=1;}
	 void key_4(void){line[p++]='4';lcd_write_da('4');have_data=1;}
	 void key_5(void){line[p++]='5';lcd_write_da('5');have_data=1;}
	 void key_6(void){line[p++]='6';lcd_write_da('6');have_data=1;}
	 void key_7(void){line[p++]='7';lcd_write_da('7');have_data=1;}
	 void key_8(void){line[p++]='8';lcd_write_da('8');have_data=1;}
	 void key_9(void){line[p++]='9';lcd_write_da('9');have_data=1;}
	 void key_0(void){line[p++]='0';lcd_write_da('0');have_data=1;}
	 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('.');have_data=1;}
	 void key_13(void){}
	 void key_right(void){}
	 void key_enter(void)
	 {
           if(up_down==1)
           {
		    if(have_data==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);
			}
			 else
			 {
			  send_dds_data();
			 }
           }
           else if(up_down==2)
           {
            lcd_write_ins(0x01);
            lcd_show(1,1,am_mode_tab1);
            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_write_ins(0x90);
           }
           else if(up_down==4)
           {
           lcd_write_ins(0x01);
           lcd_show(1,1,fm_mode_tab1);
           lcd_write_ins(0x88);
           }
	 }
	 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);
         }
//-------------------------------------------按键辩别;
     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 + -