www.pudn.com > 24C02-external-I2C-bus-EEPROM-.rar > hc595.c, change:2013-09-30,size:3986b


#include "hc595.h" 
 
//共阴数码管段码表 
 unsigned char code DispCode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,																			 
                          //      0    1    2    3    4    5   6    7    8    9    
					           	0x77,0x7C,0x39,0x5E,0x79,0x71,0x3D,0x76,0x74,0x30,	 
				          //      A	   b    C	 d	  E	   F   G	H	 h	  I   	 
				                0x10,0x1E,0x38,0x54,0x5C,0x73,0x67,0x50,0x31,0x78, 
				          //      i    J    L	 n    o	   P   q	r    R	  t     	 
					            0x3E,0x1C,0x40,0x48,0x08,0x00}; 
				          //      U	   V   一    二	  _    灭 
 //显示缓冲区  初始消隐 
 unsigned char DispBuf[8]={35,35,35,35,35,35,35,35}; 
 
 //引用外部函数 
 extern void Delay_ms(unsigned int ms); 
 
/*********************************************** 
函数名称:HC595_SendWord 
功    能:HC595发送两个字节数据。 
入口参数:dis:显示的字型码 
	      dig:点亮的数码管号 dig中为0的位,则对应的数码管点亮 
返 回 值:无	 
备    注:两片HC595,发送两个字节数据,高字节 
          为数码管段码,低字节为选择点亮哪个数码管。 
		  该程序点亮数码管可以结合原理图来看, 
		  否则不好理解,和电路原理关系密切。 
************************************************/ 
void HC595_SendWord(unsigned char  dis,unsigned char dig) 
{ 
	unsigned char i;	       //定义计数器 
	unsigned int temp=0;	   //定义数据变量 
	//将两个8位变量合并成一个16字节变量 
	temp=dis; 
	temp=temp<<8  | dig; 
	HC595_OE_Set();				   //禁止显示 
	//送出数据 
	for(i=0;i<16;i++)		 	 
    {				 
		HC595_SCK_Clr();	       //置低时钟线 
		 
		if( (temp&0x8000)==0x8000 )//先发送高字节 
	 	{ 
	   		HC595_DAT_Set();	   //置高信号线 
	 	} 
	 	else 
	 	{ 
			HC595_DAT_Clr();	   //置低信号线 
	 	}	 
		HC595_SCK_Set();		   //置高时钟线 
		 
	    temp<<=1;				   //数据左移				 
	} 
	//锁存信号上升沿锁存数据			 
	HC595_RCK_Clr();		 	 
	HC595_RCK_Set();	 
	HC595_OE_Clr();				   //输出允许,开始显示 
}  
/*********************************************** 
函数名称:ToDisplayCorrect 
功    能:把正确信息放入显示缓冲区 
入口参数:无 
返 回 值:无	 
备    注:在数码管中显示CorrEct :正确的意思 
************************************************/ 
void ToDisplayCorrect(void) 
{ 
	DispBuf[0]=35;			//DispCode[35]:熄灭 
	DispBuf[1]=12;			//DispCode[12]:C 
	DispBuf[2]=24;			//DispCode[24]:o 
	DispBuf[3]=27;			//DispCode[27]:r 
	DispBuf[4]=27;			//DispCode[27]:r 
	DispBuf[5]=14;		 	//DispCode[14]:E 
	DispBuf[6]=12;	 		//DispCode[12]:C 
	DispBuf[7]=29;		 	//DispCode[29]:t 
} 
/*********************************************** 
函数名称:ToDisplayError 
功    能:把错误信息放入显示缓冲区 
入口参数:无 
返 回 值:无	 
备    注:在数码管中显示Error :错误的意思 
************************************************/ 
void ToDisplayError(void) 
{ 
	DispBuf[0]=35;			//DispCode[35]:熄灭 
	DispBuf[1]=35;			//DispCode[35]:熄灭 
	DispBuf[2]=35;			//DispCode[35]:熄灭 
	DispBuf[3]=14;			//DispCode[14]:E 
	DispBuf[4]=27;			//DispCode[27]:r 
	DispBuf[5]=27;		 	//DispCode[27]:r 
	DispBuf[6]=24;	 		//DispCode[24]:o 
	DispBuf[7]=27;		 	//DispCode[27]:r 
} 
/*********************************************** 
函数名称:LED_Display 
功    能:数码管显示函数 
入口参数:无 
返 回 值:无	 
备    注:无 
************************************************/ 
void LED_Display(void) 
{ 
  	unsigned char LED_Cnt;	 
  	for(LED_Cnt=0;LED_Cnt<8;LED_Cnt++) 
	{	 
		//将待显示的字型码和点亮的数码管号送至锁存器。 
		//由于是共阴数码管,将八段数码管共阴极拉低,显示数据。 
		HC595_SendWord(DispCode[DispBuf[LED_Cnt]],(~(0x01<<LED_Cnt)));  
		Delay_ms(1);						//适当延时          
	} 	  
} 
/*********************************************** 
函数名称:HC595_Init 
功    能:显示初始化函数 
入口参数:无 
返 回 值:无	 
备    注:单片机P4口默认不使用,如需启用, 
          需软件设置。 
************************************************/ 
void HC595_Init(void) 
{	 
	Delay_ms(10);				//等待HC595上电稳定 
	P4SW |=0x70;	 			//使用P4口 
	//将端口置高,赋予端口固定电平 
	HC595_DAT_Set(); 
	HC595_SCK_Set(); 
	HC595_RCK_Set(); 
 
}