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

📄 ddfstest2.c

📁 51单片机控制FPGA
💻 C
字号:
/*7218在硬件译码的时候,低四位数据进行译码,最高位控制小数点,其余三位无效*/
//distab保存要显示的8位数据(每一位为一个字节)
//ledtab为7218软件译码字型表
#include<AT89x51.h>
#include<absacc.h>
#include<intrins.h>
#define DisCmd XBYTE [0xC100]                     //7218控制字地址
#define DisData XBYTE [0xC000]                    //7218数据口地址
#define LedMode P1_5
#define PLD_Reset XBYE [0xA0FB]                  // 重置信号reset;复位值:0xff;
#define FreHigh XBYTE [0XA0FC]                   //频率信号高八位地址;
#define FreLow  XBYTE [0XA0FD]                   //频率信号低八位地址;
#define PhaHigh XBYTE [0XA0FE]                   //相位信号高八位地址;
#define Phalow  XBYTE [0XA0FF]                   //相位信号第八位地址;
#define scode 0xb0                                //7218软件译码方式命令字
#define bcode 0x90                                //B码译码方式命令字
#define hexcode 0xd0                              //软件译码方式命令字
#define unchar  unsigned char 
#define unint unsigned int
bit    flinkflag;                                  //闪烁标志位
unchar keynum;                                       //按键号 
unchar enter=0;
bit    Led_On;
char   ledcursor=7;                                  //保存光标当前位置
unint  Freq;                                         //输入频率
long   Phase;                                        //输入相位
unchar sw;
char   distab[8]={0x13,0x13,0x14,0x00,0x12,0x12,0x0e,0x11} ; // 要显示的内容 hello-pp
//char temp[8];
char code ledtab[]={ 0xfb,0xb0,0xed,0xf5,0xb6,0xd7,0xdf,0xf0,
               //0,   1,    2,   3,   4,   5,   6,   7 
                0xff,0xf7,0xfe,0x9f,0xcb,0xbd,0xcf,0xce,
               //8    ,9   ,a   ,b   ,c    ,d  ,e    ,f  
                0x80,0xbe,0x8b,0xee,0x84 };
                 //熄灭 H    L    P    -
//***************************************************************************************  
void delay200ms()
 { 
   int i=10000,j=1000;
   for(;i>0;i--)
   for(;j>0;j--);
  }  
//***************************************************************************************  
    
void display(unchar dot)
{
   unchar i; 
   LedMode=1;
   DisCmd=scode;                         //采用软件译码
   LedMode=0;
   if(Led_On)
   {
   for(i=0;i<8;i++)                      //将distab中的数据送如7218
   {
     if((i==dot)&(dot!=0))
	   DisData=ledtab[distab[i]]+0x80;   //查表转化并将字型送入7218
	else
       DisData=ledtab[distab[i]];        //查表转化并将字型送入7218
   } 
  }
}           
//***************************************************************************************  
void flink()   //flag为1闪烁,flag为0,不闪烁;
{
  
  unchar  i;
  while(flinkflag)            //光标位置闪烁
   {
    LedMode=1;
    DisCmd=scode;         //采用软件译码
    LedMode=0;
    for(i=0;i<8;i++)      //将distab中的数据送如7218       
      {
        if(i==ledcursor)
	        DisData=0x80; //查表转化并将字型送入7218 
	    else
            DisData=ledtab[distab[i]]; //查表转化并将字型送入7218
      }
	 delay200ms();
	 LedMode=1;
     DisCmd=scode;            
	 display(0);
     delay200ms();
   }
}
//***************************************************************************************
void KeyprgF1(void)    //输入频率
{
   sw=1;
   flinkflag=1;
   ledcursor=4;
   distab[0]=0x00;
   distab[1]=0x00;
   distab[2]=0x00;
   distab[3]=0x00;
   distab[4]=0x00;
   distab[5]=0x10;
   distab[6]=0x10;
   distab[7]=0x0f;
   display(0);
}
void KeyprgF2(void )   //输入相位
{
 sw=0;
 ledcursor=2;
 flinkflag=1;
 distab[0]=0x00;
 distab[1]=0x00;
 distab[2]=0x00;
 distab[3]=0x10;
 distab[4]=0x10;
 distab[5]=0x10;
 distab[6]=0x10;
 distab[7]=0x13;
 display(0);
}
 //void KeyprgClear(void){}
 void KeyprgEnter(void)
 {
   unint temp;
   //enter=!enter;
   flinkflag=0;
   if(sw)
   {
      Freq=distab[4]*1000+distab[3]*100+distab[2]*10+distab[1];
      temp=_iror_(Freq,8);
      FreHigh=temp;
      temp=Freq%256;
      FreLow=temp;
    }
   else
     {
	   Phase=distab[2]*100+distab[1]*10+distab[0];
       Phase=(Phase*512)/360;
       temp=(unint)_lror_(Phase,1);
       PhaHigh=temp;
       temp=(unint)(Phase&0x01);
       temp=_irol_(Phase,7);
       Phalow=temp;
	  }
       display(0); //显示键值
	   
 } 
 
//**************************************************************************************

void keyprg(unchar key)  //键盘键值执行的程序
{  
 // unchar i;
  if(key<=9)
   {   
      distab[ledcursor]=keynum;        //键值送入distab最低位保存
	   if(ledcursor>0)                //光标移位
           ledcursor--;
       else 
           ledcursor=7;
    display(0); //显示键值
   	}
  
  else 
   {
    switch(key)
	   {
	     
		 case 0x0A:             
		           KeyprgF1();
	     break;	 
		 case 0x0B:            //功能键F2
	        	   KeyprgF2();
	     break;	 
		 case 0x0C:           //KeyprgBack();
		          if(ledcursor<7)                //光标移位
                       ledcursor++;
                   else 
                       ledcursor=0;
                       display(0); //显示键值
	     break;
	 	 case 0x0D:  //加
		            if(distab[ledcursor]<0x09)
		                distab[ledcursor]++;
                     else
                         distab[ledcursor]=0;
                         display(0); //显示键值
	     break;	
 		 case 0x0E:    //减
		           if(distab[ledcursor]>0)
		           distab[ledcursor]--;
              
		 else
               distab[ledcursor]=9;
			   display(00); //显示键值
		    
	     break;	 
		 case 0x0F:       
		           KeyprgEnter();        
	     break;	 
		 default:
	     break;	 
		}
	 }

}
//**************************************************************************************
void intt0() interrupt 0 
{ 
 
 EX0=0;              //关键盘中断,禁止相应其他按键
 keynum=P1;          //从p1口读入键盘值
 keynum=keynum&0x0f; //取低四位;
 keyprg(keynum);
 //if(enter)    //不是enter键,屏蔽中断
  EX0=1;
}

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

void main()
{ 
  unchar j=0;
  EX0=1;
  //ET0=1;
  EA=1;
  //clock_initial() ;
  Led_On=1;
  display(0);
  while(1)
    {
	 // if(flinkflag==1)
      flink();
    }
 }

⌨️ 快捷键说明

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