hc595.h
- #ifndef _HC595_h_
- #define _HC595_h_
- #include "stm324xg_eval.h"
- #define SHCP_PIN GPIO_Pin_1 //clk
- #define STCP_PIN GPIO_Pin_2 //lck
- #define QS_SDI_PIN GPIO_Pin_0
- //#define QS_L_PIN GPIO_Pin_0
- //#define QS_L1_PIN GPIO_Pin_0
-
- #define SHCP_SET(x) GPIOI->ODR=(GPIOI->ODR&~SHCP_PIN)|(x ? SHCP_PIN:0)
- #define STCP_SET(x) GPIOI->ODR=(GPIOI->ODR&~STCP_PIN)|(x ? STCP_PIN:0)
- #define QS_SDI(x) GPIOI->ODR=(GPIOI->ODR&~QS_SDI_PIN)|(x ? QS_SDI_PIN:0)
- //#define QS_L(x) GPIOB->ODR=(GPIOB->ODR&~QS_L_PIN)|(x ? QS_L_PIN:0)
- //#define QS_L1(x) GPIOB->ODR=(GPIOB->ODR&~QS_L1_PIN)|(x ? QS_L1_PIN:0)
- typedef struct{
- GPIO_TypeDef* Port;
- unsigned short int Pin;
- }PortPin595;
- typedef struct{
- PortPin595 Clk;
- PortPin595 Lck;
- PortPin595 Data;
- }HC595;
- void Write_74HC595(HC595 HC595x,unsigned char ChipNum,unsigned char *DataBuf);
- void GPIO_HC595_Configuration(void);
- void Write_595_ENABLE(void);
- #endif
复制代码 h595.c
- #include "hc595.h"
- static void HC595_delay(int num);
- void GPIO_HC595_Configuration()
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- /* Enable the GPIO_LED Clock */
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI, ENABLE);
- /* Configure the GPIO_LED pin */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_Init(GPIOI, &GPIO_InitStructure);
- }
- /************************************************************************
- Function: EI2C_ReadDataBuffer
- Description: 从E2PROM读数据
- Calls:
- Data Accessed: 无
- Data Updated: 无
- Input: DeviceAddr:设备地址
- RegisterAddr:寄存器地址
- buf:缓存区地址
- count:读数据个数
- Output: 无
- Return: read_verif:操作成功
- TIMEOU:超时错误
- Others: 无
- *************************************************************************/
- void Write_byte_595(u8 byte)
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- byte <<= 1;
- //DS = CY;
- // SH_CP = 1;
- //// _nop_();
- // _nop_();
- // SH_CP = 0;
- }
- }
- /************************************************************************
- Function: EI2C_ReadDataBuffer
- Description: 从E2PROM读数据
- Calls:
- Data Accessed: 无
- Data Updated: 无
- Input: DeviceAddr:设备地址
- RegisterAddr:寄存器地址
- buf:缓存区地址
- count:读数据个数
- Output: 无
- Return: read_verif:操作成功
- TIMEOU:超时错误
- Others: 无
- *************************************************************************/
- void Write_595_ENABLE()
- {
- STCP_SET(0);
- HC595_delay(100);
- STCP_SET(1);
- }
- /************************************************************
- ***********************************************************/
- static void HC595_delay(int num);
- /************************************************************************
- Function: Read_74HC595
- Description: 读取n片74HC595的输入数据
- Calls: HC595_delay;GPIO_ResetBits;GPIO_SetBits;
- Data Accessed: 无
- Data Updated: 无
- Input:
- HC595x:用户使用的595端口,类型定义在74HC595.h中
- ChipNum: 用户使用的595端口上连接的芯片个数
- Output:
- DataBuf: 输出数据存放缓冲区
- Return: 无
- Others: 此模块为Stm32单片机中使用,调试时在72M系统时钟下
- *************************************************************************/
- void Write_74HC595(HC595 HC595x,unsigned char ChipNum,unsigned char *DataBuf)
- {
- unsigned char i = 0;
- unsigned char DataBufTmp = 0;
-
- GPIO_ResetBits(HC595x.Lck.Port, HC595x.Lck.Pin); //设置LCK为低电平,上升沿数据锁存
-
- for(; ChipNum>0; ChipNum--)
- {
- DataBufTmp = *DataBuf;
- for(i=0; i<8; i++)
- {
- GPIO_ResetBits(HC595x.Clk.Port, HC595x.Clk.Pin); //时钟低电平
-
- if (DataBufTmp & 0x80)
- {
- GPIO_SetBits(HC595x.Data.Port, HC595x.Data.Pin); //输出1
- }
- else
- {
- GPIO_ResetBits(HC595x.Data.Port, HC595x.Data.Pin); //输出0
- }
-
- HC595_delay(5);
-
- GPIO_SetBits(HC595x.Clk.Port, HC595x.Clk.Pin); //时钟高电平,上升沿数据移位
-
- HC595_delay(5);
-
- DataBufTmp = DataBufTmp << 1;
- }
- DataBuf++;
- }
- GPIO_SetBits(HC595x.Lck.Port, HC595x.Lck.Pin); //设置LCK为高电平,上升沿数据锁存
- HC595_delay(10);
- GPIO_ResetBits(HC595x.Lck.Port, HC595x.Lck.Pin); //设置LCK为低电平,上升沿数据锁存
- }
- /************************************************************************
- Function: HC595_delay
- Description: 74HC595模块延时函数
- Calls: 无
- Data Accessed: 无
- Data Updated: 无
- Input:
- num:延时个数
- Output: 无
- Return: 无
- Others: 此模块为Stm32单片机中使用,调试时在100M系统时钟下
- *************************************************************************/
- static void HC595_delay(int num)
- {
- while(num>0)
- num--;
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|