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

📄 164.c

📁 用AVR编写的点阵显示屏
💻 C
字号:
/*****************************************************
** 文件:164.c
** 功能:用74164驱动数码管显示
** 作者:韦坚
** 修改:韦坚
** 开始日期:2008-1-2
** 完成日期:2008-1-2
/***************************************************/

/*--------------------数码管显示代码----------------------*/
code char led[17]={0x11,0xD7,0x32,0x92,
                   0xD4,0x98,0x18,0xD3,
				   0x10,0x90,0x50,0x1C,
				   0x39,0x16,0x38,0x78,0xFF};	


/*****************************************************************************
**  函 数 名: void shift(uchar function,int b)
**  功    能: 将要显示的一个数送入74164
**  入口参数: uchar function
                 0:不显示小数点
				 1:显示小数点
				 X:显示特殊字符
**             int b(要显示的数据)
**  返 回 值: 无
**	日    期: 2007-11-17
*****************************************************************************/
void 
shift(uchar function,int b)
{
   int i;										                      				  
	
   switch (function)							  
   {
     case 0: b = led[b];	  break;
   	 case 1: b = led[b]&0xEF; break; 
	 default:				  break;
   }
     
   for(i=0;i<8;i++)
   {
    scl=0;
    if((b<<i)&0x80) 
	  sda=1;
	else 
	  sda=0;
    scl=1;
   }
}

/*************************************************
**  函 数 名: void clear_164(void)
**  功    能: 清屏
**  入口参数: NULL
**  返 回 值: NULL
**	日    期: 2007-11-17
**************************************************/
void 
clear_164(void)
{
  uint i;
  for(i=0;i<6;i++)
  shift(0,10);
}

/*************************************************
**  函 数 名: void dis_time(void)
**  功    能: 用六个数码管显示 小时-分-秒
**  入口参数: 无
**  返 回 值: 无
**	日    期: 2007-11-17
**************************************************/
void 
dis_time(void)
{
	shift(0,sec&0x0F);			 //显示秒 
	shift(0,(sec&0xF0)>>4);	
	shift(2,0xFE);			     //显示横杆

	shift(0,min&0x0F);			 //显示分 
	shift(0,(min&0xF0)>>4);
	shift(2,0xFE);			     //显示横杆

	shift(0,hou&0x0F);		     //显示小时 
	shift(0,(hou&0xF0)>>4);

}
/*************************************************
**  函 数 名: void dis_data(bit flag)
**  功    能: 用六个数码管显示 小时-分-秒
**  入口参数: 无
**  返 回 值: 无
**	日    期: 2007-11-17
**************************************************/
void 
dis_data(bit years)
{
  while (1)
  {
    read_8563();
    if(years)
    {	 
	  shift(0,0x10);	
	  shift(0,0x10);
	  shift(0,0x10);	
	  shift(0,0x10);
		 
	  shift(0,year&0x0F);			  //显示年 
	  shift(0,(year&0xF0)>>4);	

      if (mon&0x80) {shift(0,9);shift(0,1);}  //显示2000年前 
 	  else    	    {shift(0,0);shift(0,2);}  //显示2000年后
	 }

     else
     {
   	  shift(0,week&0x0F);			//显示星期
	  shift(0,0x10);
	  shift(0,0x10);		       

	  shift(0,day&0x0F);		    //显示日 
 	  shift(0,(day&0xF0)>>4);	
	
	  shift(0,0x10);		   

	  shift(0,mon&0x0F);		    //显示月 
	  shift(0,(mon&0xF0)>>4);
     }

	 delay(500); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来 
	 delay(500); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来 
	 delay(500); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来
   }
}			   

/*************************************************
**  函 数 名: dis_temperature(void)
**  功    能: 用六个数码管显示 温度
**  入口参数: NULL
**  返 回 值: NULL
**	日    期: 2007-11-17
**************************************************/
void 
dis_temperature(void)
{
	while(1) 	    
	{
	  temperature = read_temperature();
      temp = temperature*0.0625*10000;        //不要直接乘625,否则数据可能溢出
	  shift(0,16);
	  shift(0,16); 
      shift(0,temp%10);
	  if(temp>=10)shift(0,temp/10%10);
	  if(temp>=100)shift(0,temp/100%10);
	  if(temp>=1000)shift(0,temp/1000%10);
	  if(temp>=10000)shift(1,temp/10000%10);

	  if(temp>=100000)shift(0,temp/100000%10);
	  if(temp>=1000000)shift(0,temp/1000000%10);
	  if(temp>=10000000)shift(0,temp/10000000%10); 

	  delay(2000); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来 
	  delay(2000); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来 
	  delay(2000); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来
	  delay(2000); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来 
	  delay(2000); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来 
	  delay(2000); if(0==KEY3)  break;	  //先放延时语句,以免人反应不过来
    } 	
}

/*************************************************
**  函 数 名: dis_uart_receive(ulint  b)
**  功    能: 用六个数码管显示 串口接收到的数据
**  入口参数: NULL
**  返 回 值: NULL
**	日    期: 2007-11-17
**************************************************/
void 
dis_uart_receive(ulint  b)
{
   ulint  i=9000;
   clear_164();			                          
   shift(0,b%10);
   if(b>=10)shift(0,b/10%10);
   else     shift(0,0); 

   shift(0,16);
   shift(0,16); 
   shift(0,16);
   shift(0,16); 
   shift(0,16);

   shift(2,led[b]);
   while(i--);
}

⌨️ 快捷键说明

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