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

📄 逻辑分析仪.c

📁 这是本人参加电子设计竞赛过程中编写的几个单片机程序
💻 C
📖 第 1 页 / 共 4 页
字号:
		       {sel1=1;sel2=1;fpga=1;}//给fpga串参数;
		}while(tuichu==0);tuichu=0;
}

void jianpan()
{
         getkey=0;
         enable_readkey=1;
         while(getkey==0);
         enable_readkey=0;
}
/***************************************************
			键盘扫描函数
原型:   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 = 0x01;
               				break;
            			case 0xfd:
                       		keynum = 0x02;
                 			break;
               			case 0xfb:
                 		    keynum = 0x03;
                 			break;
               			case 0xf7:
                      		keynum = 0x04;
                 			break;
               			case 0xef:
                 			keynum = 0x05;
                 			break;
               			case 0xdf:
                 			keynum = 0x06;
                			break;
               			case 0xbf:
                			keynum = 0x07;
                 			break;
              	 		case 0x7f:
                 			keynum = 0x08;
                 			break;
              		}
           		}
         		else
           		{
            		second_row = 0;     //扫描第二行按键
            		first_row = 1;
            		M_key = KEY;
            		switch(M_key)
              		{
               			case 0xfe:
                			keynum = 0x09;
                			break;
               			case 0xfd:
                 			keynum = 0x0a;
                 			break;
               			case 0xfb:
                 			keynum = 0x0b;
                 			break;
               			case 0xf7:
                 			keynum = 0x0c;
                 			break;
               			case 0xef:
                 			keynum = 0x0d;
                 			break;
               			case 0xdf:
                 			keynum = 0x0e;
                 			break;
               			case 0xbf:
                 			keynum = 0x0f;
                 			break;
               			case 0x7f:
                 			keynum = 0x10;
                 			break;
              		}
           		}
				getkey = 1; //获得有效按键数值
                keyon = 1;  //防止按键冲突,当获得有效按键时将其置1
        	} 
     	} 
   	}
 	else
   	{
    		first_getkey = 0;
    		keyon = 0;     //防止按键冲突,当所有的按键都释放时将其清0
    }
}

/***************************************************
			数码管显示函数
原型:   void leddisp(void);
功能:  每次调用轮流显示一位数码管

****************************************************/
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(uchar time_nop);  
功能:       延时time_nop个nop
  
********************************************************************/
void  delay(uchar time_nop)
{
	uchar 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(); 
}

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_();
		  }
	   }
}
/*************************************************************
                 对LCD进行汉字字符串写入

⌨️ 快捷键说明

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