📄 595-165ic.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 + -