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

📄 失真度.c

📁 这是本人参加电子设计竞赛过程中编写的几个单片机程序
💻 C
📖 第 1 页 / 共 3 页
字号:


/***************************************************
			键盘扫描函数
原型:   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进行汉字字符串写入

原型:void  show_hanzi_string(uchar word_data[],uchar  hang,uchar lie,uchar 

word_len);
功能://显示一串汉字
说明://hang lie 为第一个汉字的位置
	//  hang :1-4行  lie :1-8列 解释
	 // 0 1 2 3 4 5 6 7
    // 8 9 10  ......15   
	//16             23
	//24.............31

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

/*void  show_hanzi_string(uchar word_data[],uchar  hang,uchar lie,uchar word_len)

{
	uchar  i,j;	
	uchar index;
	
	
	uchar  buffer[32]; 
	index=(hang-1)*8 +(lie-1);  //第一个汉字的 index(qian mian kong chu de ge shu)
	for (i=0;i<word_len;i++)//最多显示32个汉字
	{	
		
		for(j=0;j<32;j++)//每个汉字有32个数据
  	   {
			
				buffer[j]= word_data[i*32+j];
		  	
		}
		if((index+i)<32)//不超出显示范围
		{
			hanzi_lcd( buffer , i + index);
		}
		//显示在空白处
		
	}
			
}

void  hanzi_lcd(uchar word_data[32], uchar index )
									
{
	uchar  i;
	uchar  j;
	uchar  k;
	if( (index % 8)< 4)//汉字在左半边
 	{	j=(index % 4)*16;
		k=(index/8)*2;//行*2
		setlstartx(strat_xaddr+k);
		for(i=0;i<16;i++)
		{
			setlstarty(strat_yaddr+j+i);//设置左边横向位置
			lcdlwrite(word_data[i]);//先写前16个汉字码
		}
		setlstartx(strat_xaddr+k+1);//纵向下来一个字符行长度
		for(i=0;i<16;i++)//后16个码
		{
			setlstarty(strat_yaddr+i+j);
			lcdlwrite(word_data[i+16]);
		}
	}

	else if ((index%8)>=4)//汉字在右半边
	{
		j=(index%4)*16;
		k=(index/8)*2;
		setrstartx(strat_xaddr+k);
		for(i=0;i<16;i++)
		{
			setrstarty(strat_yaddr+j+i);
			lcdrwrite(word_data[i]);
		}
		setrstartx(strat_xaddr+k+1);
		for(i=0;i<16;i++)
		{
			setrstarty(strat_yaddr+i+j);
			lcdrwrite(word_data[i+16]);
		}
	}
}	
*/
void show_data(double print,uchar hang,uchar lie,uchar wei)
{
	 long printz;
	 bit biaozhi;
	 uint  m=0;
	 uint  counter=0;
	 biaozhi=0;
	 if(print>=10000||print<=0.0001)//科学计数法
     {   if(print>=10)
		 {
		 biaozhi=1;
	      for(;;)
		  {		      
              print=print/10; 
			  counter++;
			  if(print<10)
				  break;
			  else
				  _nop_();
		  }
		 }
         else if(print<1&&print>0)
		 {
		 for(;;)
		 {
		      print=print*10;
 			  counter++;
			  if(print>=1)
				  break;
			  else
				  _nop_();

⌨️ 快捷键说明

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