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

📄 频率计单片机.c

📁 这是本人参加电子设计竞赛过程中编写的几个单片机程序
💻 C
📖 第 1 页 / 共 2 页
字号:
                default: zz=8;break;
    		}
     	}
   	}
 	control_readkey = !control_readkey;
}
void ceping(void)
{   float F1, F2;unsigned long N1,N2;
    g=0;CLR1();TF=0;
    START=0;
    EA=1;
    IT0=1;
    EX0=1;
    
	N1=0;N2=0;coutcp=0;START=1;do{}while(coutcp<gatetime);START=0;gatecont=0;//ADRB=0;ADRA=0;
    do{}while((g==0)&&(gatecont<10000));//xian++;
	if(g==1)
	{
    ADRB=0;ADRA=0;N1=DATA1;N2=DATA2;
    ADRB=0;ADRA=1;N1+=DATA1*256;N2+=DATA2*256;
    ADRB=1;ADRA=0;N1+=DATA1*65536;N2+=DATA2*65536;
    ADRB=1;ADRA=1;N1+=DATA1*16777216;N2+=DATA2*16777216;//xian=DATA2;
    //ADRB=0;ADRA=1;ADRB=0;ADRA=0;//xian=DATA2;
	F1=N1;F2=N2-1;
     FF=(50000000*F2)/F1;
	//else FF=N3/50000000;
	if(zz==1) {xian=FF;c=1;}TF=1;START=1;CLR1();
	}
	else gatetime=8500;
}

void zhouqi(void)
{  
   ceping();
   TT=1/FF;
   if(zz==2) {xian=TT;c=1;}
}

void maikuan(void)
{   
    long N4=0;
	float F4;
	bbb=0;
    a=0;
    CLR1();TF=1;
    EA=1;
    IT1=1;
    EX1=1;
    
    do{}while((a==0)&&(bbb==0));//xian++;
    ADRB=0;ADRA=0;N4+=DATA1;
    ADRB=0;ADRA=1;N4+=DATA1*256;
    ADRB=1;ADRA=0;N4+=DATA1*65536;
    ADRB=1;ADRA=1;N4+=DATA1*16777216;
	F4=N4;
    WW=F4/50000000;
    if(zz==3) {xian=WW;c=1;}
}
void zhankong(void)   
{
    float  WF,WZ;
    START=1;TF=1;
    maikuan();
	WZ=WW;//START=0;maikuan();
	
    zhouqi();
    WF=TT;
    ZKB=WZ/WF;
	xian=ZKB;c=1;
}
    	

void main(void)
{   
    CLR=0;
	START=0;
    CHOICE=1;
	TMOD = 0x01;    //
 	TH0 = -2720/256;  //定时器中断时间间隔 4ms
 	TL0 = -2720%256;
	TCON = 0x10;
 	ET0 = 1;
 	EA = 1;initial_lcd();//write_str_noclear (zifu1,6,0 ,16);
    while(1)
	{ 
        //zz=1;
	    if(zz==1) //xian=543;
		{if(zz!=ji)
		 {gailcd();ji=zz;c=0;write_str_noclear (zifu10,7,1 ,10);
		   if(gate==10)
		       {write_char (hehe[1],7,12 ) ;write_char (hehe[0],7,13 ) ;}
		   else
		       write_char (hehe[gate],7,13 ) ;
			   }
		 ceping();}
		else if(zz==2) //xian=987;
		{if(zz!=ji)
		 {gailcd();ji=zz;c=0;write_str_noclear (zifu11,7,1 ,16);}
		 zhouqi();}
		else if(zz==3) //xian=75656;
		{if(zz!=ji)
		 {gailcd();ji=zz;c=0;write_str_noclear (zifu11,7,1 ,16);}
		 START=1;
		 maikuan();}
		else if(zz==4)
		{if(zz!=ji)
         {gailcd();ji=zz;c=0;write_str_noclear (zifu11,7,1 ,16);}
		 zhankong();}
		else if(zz==5)
		{if(zz!=ji)
         {gailcd();ji=zz;c=0;write_str_noclear (zifu11,7,1 ,16);}
		 cefu();}
		else if(zz==6)
		{CHOICE=!CHOICE;gailcd();zz=jy;c=0;}
		else if(zz==8)
		xian=7805;
	}
}

/***************************************************
			键盘扫描函数
原型:   void readkey(void);
功能:  当获得有效按键时,令getkey=1,keynum为按键值

****************************************************/
void readkey(void)
{
	uchar M_key = 0;  

 	first_row = 0;
 	second_row = 0;
 	M_key = KEY;
 	if(M_key != 0xff)  //如果有连续两次按键按下,认为有有效按键按下。消除按键抖动
   	{
    	if(first_getkey == 0)
     	{
   			first_getkey = 1;	
   		}
  		else    //当有有效按键按下时,进一步识别是哪一个按键
   		{
   			if(keyon == 0)  //防止按键冲突,当还有未释放的按键时不对其它按键动作响应   
   			{
      			first_row = 0;         //扫描第一行按键
      			second_row = 1;
         		M_key = KEY;
         		if(M_key != 0xff)
           		{
            		switch(M_key) 
            		{
            	 		case 0xfe:
                   			keynum = 0x00;
               				break;
            			case 0xfd:
                       		keynum = 0x01;
                 			break;
               			case 0xfb:
                 		    keynum = 0x02;
                 			break;
               			case 0xf7:
                      		keynum = 0x03;
                 			break;
               			case 0xef:
                 			keynum = 0x04;
                 			break;
               			case 0xdf:
                 			keynum = 0x05;
                			break;
               			case 0xbf:
                			keynum = 0x06;
                 			break;
              	 		case 0x7f:
                 			keynum = 0x07;
                 			break;
              		}
           		}
         		else
           		{
            		second_row = 0;     //扫描第二行按键
            		first_row = 1;
            		M_key = KEY;
            		switch(M_key)
              		{
               			case 0xfe:
                			keynum = 0x08;
                			break;
               			case 0xfd:
                 			keynum = 0x09;
                 			break;
               			case 0xfb:
                 			keynum = 0x0a;
                 			break;
               			case 0xf7:
                 			keynum = 0x0b;
                 			break;
               			case 0xef:
                 			keynum = 0x0c;
                 			break;
               			case 0xdf:
                 			keynum = 0x0d;
                 			break;
               			case 0xbf:
                 			keynum = 0x0e;
                 			break;
               			case 0x7f:
                 			keynum = 0x0f;
                 			break;
              		}
           		}
				getkey = 1; //获得有效按键数值
                keyon = 1;  //防止按键冲突,当获得有效按键时将其置1
        	} 
     	} 
   	}
 	else
   	{
    		first_getkey = 0;
    		keyon = 0;     //防止按键冲突,当所有的按键都释放时将其清0
    }
}


void leddisp(void)
{
	switch(lednum)  //选择需要显示的数码位
 	{
	    case 0:
            LED1 = segtab[led[0]];
     		break;
  		case 1:
            LED2 = segtab[led[1]];
     		break;
 		case 2:
     		LED3 = segtab[led[2]];
     		break;
 		case 3:
     		LED4 = segtab[led[3]];
     		break;
 		case 4:
     		LED5 = segtab[led[4]];
     		break;
 		case 5:
     		LED6 = segtab[led[5]];
     		break;
 		case 6:
     		LED7 = segtab[led[6]];
     		break;
		case 7:
     		LED8 = segtab[led[7]];
     		break;
  	}

	if(lednum == 0) //更新需要现实的数码位
 	{
		lednum = 7;
 	}
 	else
 	{
		lednum = lednum-1;
	}
}

void  delay(uint8 time_nop)
{
	uint8 i;
	for(i=0;i<time_nop;i++)
	{
		_nop_();	
	}
}
void lcdlon_off(uchar D)
{
	lcdlCommand = D;
	_nop_();
}

void setlstartx(uchar D)
{
	lcdlCommand = D;
	_nop_();
}

void setlstarty(uchar D)
{
	lcdlCommand = D;
	_nop_();
}

void setlstartline(uchar D)
{
	lcdlCommand = D;
	_nop_();
}

void lcdron_off(uchar D)
{
	lcdrCommand = D;
	_nop_();
}

void setrstartx(uchar D)
{
	lcdrCommand = D;
	_nop_();
}

void setrstarty(uchar D)
{
	lcdrCommand = D;
	_nop_();
}

void setrstartline(uchar D)
{
	lcdrCommand = D;
	_nop_();
}

uchar GetIndex(uchar szText)
{
    uchar code TAB[libleng] = {' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q'
							,'R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q'
							,'r','s','t','u','v','w','x','y','z','`','1','2','3','4','5','6','7','8','9','0','-','=','\\','~','!','@','#','$','%','^','&','*','(',')','_'
							,'+','|','[',']',';','\'',',','.','/','{','}',':','"','<','>','?'};
    uchar i;
	uchar j = 0;
    for(i=0;i<=libleng;i++)     
    {
	  	if(szText==TAB[i]) 
	     {
		 	j = 1;
		 	return i;
		 	break;
		}
	}
    if(j==0)
	{
	    return 0x00;
	}
}

void lcdlwrite(uchar D) 
{
	lcdDl = D;
	_nop_();
}

void lcdrwrite(uchar D) 
{
	lcdDr = D;
	_nop_();
}


/**********************************************************
			LCD清屏
原型:  void clear_lcd(void);
功能: 将LCD清屏

**********************************************************/
void clear_lcd(void)
{
	uchar i,j;
	
	for(i=0;i<8;i++)//左边8行
	{
		setlstartx(strat_xaddr + i);
		for(j=0;j<64;j++)//左边64列   8*8
		{
			setlstarty(strat_yaddr+j);
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			lcdlwrite(0x00);//清除
		}
		_nop_();
	}

	for(i=0;i<8;i++)//清除右边
	{
		setrstartx(strat_xaddr + i);
		for(j=0;j<64;j++)
		{
			setrstarty(strat_yaddr+j);
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			lcdrwrite(0x00);
		}
		_nop_();
	}
}


/************************************************************************************
			LCD初始化
原型:  void initial_lcd(void);
功能: 将LCD初始化显示"National University of defence technology's ASIC R&D Center"

************************************************************************************/
void initial_lcd(void)
{
	
	setlstartline(strat_dispaddr);//设置显示初始行
	setrstartline(strat_dispaddr);
	lcdlon_off(0x3F);//LCD两屏都打开
 	lcdron_off(0x3F);  
	clear_lcd(); 
	if(CHOICE==0)
        write_str_noclear (zifu6,3,1 ,16);
        else
        write_str_noclear (zifu7,3,1,16);
    write_str_noclear (zifu9,5,1 ,13);write_char (hehe[1],5,14) ;
}

void write_str_noclear (uchar worddata[],uchar  hang,uchar  lie ,uchar  len)        //对LCD进行字符串写入
									

//hang 1-8  ,lie1-16
{
	uchar i=0;//8*8字符数
	uchar j=0;//8位数据中第几位
	uchar k=0;//行数
	uchar index=0;
	uchar z=0;
	setlstartline(strat_dispaddr);//设置显示初始行
	setrstartline(strat_dispaddr);

	for(i=lie-1;i<len+lie-1;i++)//从指定列写入
	   {	
	   index=GetIndex(worddata[i-lie+1]);//
	   z=i%8;
	   k=i/16;
	   if(k>7) k=0;  //不能超过8行
	   if(i%16<8)//左边
	     { 
	      setlstartx(strat_xaddr+k+hang-1);//设置行
	      for(j=0;j<8;j++)
		      {_nop_();
			  setlstarty(strat_yaddr+8*z+j);
			  lcdlwrite(ASCII[index][j]);
		    
			  }
	       _nop_();
		  }
	  if(i%16>=8)
	     {
	      setrstartx(strat_xaddr+k+hang-1);
	      for(j=0;j<8;j++)
		      {_nop_();
			  setrstarty(strat_yaddr+8*z+j);
			  lcdrwrite(ASCII[index][j]);
		 	  
			  }
	       _nop_();
		  }
	   }
}
void write_char (uchar datan,uchar  hang,uchar  lie )        //对LCD进行字符写入
									

//hang 1-8  ,lie1-16
{
	uchar i=0;//8*8字符数
	uchar j=0;//8位数据中第几位
	uchar k=0;//行数
	uchar index=0;
	uchar z=0;
	setlstartline(strat_dispaddr);//设置显示初始行
	setrstartline(strat_dispaddr);

	for(i=lie-1;i<lie;i++)//从指定列写入
	   {	
	   index=GetIndex(datan);//
	   z=i%8;
	   k=i/16;
	   if(k>7) k=0;  //不能超过8行
	   if(i%16<8)//左边
	     { 
	      setlstartx(strat_xaddr+k+hang-1);//设置行
	      for(j=0;j<8;j++)
		      {_nop_();
			  setlstarty(strat_yaddr+8*z+j);
			  lcdlwrite(ASCII[index][j]);
		    
			  }
	       _nop_();
		  }
	  if(i%16>=8)
	     {
	      setrstartx(strat_xaddr+k+hang-1);
	      for(j=0;j<8;j++)
		      {_nop_();
			  setrstarty(strat_yaddr+8*z+j);
			  lcdrwrite(ASCII[index][j]);
		 	  
			  }
	       _nop_();
		  }
	   }
}

⌨️ 快捷键说明

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