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

📄 595-165ic.c

📁 74LS138及用74HC165 74HC595串行方式实现的数码管显示.rar
💻 C
字号:
 
/**********此部分为74HC595的驱动程序使用SPI总线连接********************
*
*阅读此处时,请大家参考74HC595 74HC165(并入串出)的芯片手册查看各引脚的功能
*
***********************************************************************/

#include <reg52.H>
#include <absacc.h>
#include <intrins.h> 

 #define  NOP() _nop_()    /* 定义空指令 */
 #define  _Nop()  _nop_()   /*定义空指令*/
 //SPI IO
sbit    MOSIO =P1^5;    //管脚定义,74HC595数据通过P1.5脚移进单片
sbit    R_CLK =P1^6;	/*将数据保存到存储寄存器中的脉冲*/
sbit    S_CLK =P1^7;	/*时钟脉冲,使数据输入74HC595移位寄存器的脉冲*/	   

sbit    IN_PL =P3^4;    //管脚定义,74HC165 shiftload 把数据加载到锁存器中
sbit    IN_Dat=P3^5;    //管脚定义,IN_Dat是74HC165的串行数据输出端口
sbit    OE    =P3^6;	/*74HC595输出使能*/
/*********************************************************************************************************
** 函数名称: ReHC74165 (并入串出)
** 功能描述: 将单片机并行总线上的数据转换成串行数据输出
**           并行数据从输入74HC165并行数据输入端输入-->74HC165的串行数据输出端IN_Dat输出串行数据
** 管脚描述:请参考相关的芯片资料(学习光盘中已配)
** 入口参数: 无,数据从74HC165的8位并行数据输入端输入
** 出口参数:
** 返回值  :  ~indata
*********************************************************************************************************/
unsigned long ReHC74165(void)
{  
  unsigned char i;			/*变量定义*/
  unsigned long indata;
		
   IN_PL=0;				   /*产生占空比为50%脉冲方波,把并行总线上的数据加载到74HC165内部锁存器中 */
   NOP();		 
   IN_PL=1;
   NOP();            
  /****************以下for循环实现将数据从74HC165中移出***************/ 
   indata=0;     					/*初始化变量indata=0*/
   for(i=0; i<25; i++)				/*循环25次*/
    { 
	  indata=indata<<1;		    	/*indata左移1位,目的:空出最低位用于保留从74HC165的IN_Dat管脚移出的数据*/
      if(IN_Dat==1)indata=indata|1;	/*IN_Dat是74HC165的串行数据输出端口*/
									/*判断74HC165的串行数据输出端口的状态。
									如果是1,将保存74HC165的串行数据的变量或上1;如果是0,则取初始化的值*/
	  S_CLK=1;				 		/*S_CLK下降沿*/
      NOP();						/*S_CLK是74HC595的时钟输入端,使数据输入74HC595移位寄存器*/
      S_CLK=0;	  					/*将每一位74HC165的串行输出数据(变量indata的最低位)
	                                都保存到了74HC595移位寄存器*/
	} 
   
   return(~indata);				    /*返回;indata取反,这里的取反没有什么特殊目的
                                    只是为了配合此开发板的功能实现.如果仅仅是驱动74HC165则根本部用取反*/
 
}


/*********************************************************************************
** 函数名称: HC595SendData
** 功能描述: 单片机的并行数据SendVal-->串行移到74HC595中-->74HC595并行数据输出
**			 单片机只用一个IO口和74HC595相连,通过74HC595,最终实现了8位数据的并行输出.
**			 简言之: 单片机只用一个IO口,就实现了8位数据并行输出到总线.
** 入    口:SendVal要发送的数据
** 出    口:
***********************************************************************************/
void HC595SendData(unsigned int SendVal)
{  
  unsigned char i;	       /*定义变量;i定义为unsigned char 数据类型,占16位存储空间*/
		
  for(i=0;i<16;i++)        /*因为数据类型unsigned char,占16位存储空间*/
   {
	if((SendVal<<i)&0x8000)/*判断要发送的数据的最高位*/
	  { MOSIO=1;		   /*要发送的数据的最高位为1,向74HC595的数据口是送1*/
	   
	  }   
	else MOSIO=0;		   /*要发送的数据的最高位为0,向74HC595的数据口是送0*/
/*以上if--else语句通过将要发送的数据左移,然后取该数据的最高位,实现将要发送的
数据从高到低,一位一位的发送到74HC595。74HC595串行输入并行输出*/ 
	S_CLK=0;	           /*产生一个上升沿*/
	NOP();    			   /*S_CLK是74HC595的时钟输入端,使数据输入74HC595移位寄存器*/
	NOP();
	S_CLK=1;	
   }
  /*以上for()循环,把16位的数据全部保存到了74HC595的内部寄存器*/ 
	
  R_CLK=0;                /*产生一个上升沿*/
  NOP();				  /*R_CLK是74HC595的控制端*/
  NOP();
  R_CLK=1;                /*将数据保存到存储寄存器中去*/
  						  /* 注意:如果两个时钟R_CLK,S_CLK连在一起,则移位寄存器总是比存储寄存器早一个脉冲。*/
  OE=0;	     /*当使能OE时(为低电平),存储寄存器的数据输出到总线。
  也就是允许并行数据的输出,实现了把串行数据输入转换为并行数据输出*/

}

⌨️ 快捷键说明

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