stm32使用74HC595和74HC165

级联 165 和595

十六位输入输出


void main()
{
while(1)
{SENDVAL595=SENDVAL595|0x0000;SENDVAL5952=SENDVAL5952|0x00fF;SENDVAL165_595=SENDVAL165_595|0X0000;//作为输入板crc16_data7[0]=HC165ReceiveData_Key1(); HC595SendData1(SENDVAL595);HC595SendData2(SENDVAL5952);HC165_595SendData1(SENDVAL165_595);
}}

#include "delay.h"
#include "74HC165.h"//74HC-595  IO初始化  输入的165的电路板
// A12  D0  Q1 Q3    1号595
//B6    Q2
void LEDHC165_595Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);    //使能PE端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;               //A12端口配置Q1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA12GPIO_ResetBits(GPIOA,GPIO_Pin_12);                        //PA12 输出低GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                //D0端口配置 Q3GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        //IO口速度为50MHzGPIO_Init(GPIOD, &GPIO_InitStructure);                     //根据设定参数初始化GPIOC0  GPIO_ResetBits(GPIOD,GPIO_Pin_0);                        //PD0 输出低GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                 //B6端口配置 Q2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA0GPIO_ResetBits(GPIOB,GPIO_Pin_6);     }
#define GPIO_595_PortA       GPIOA          // 595输出端口
#define GPIO_595_PortB       GPIOB          // 595输出端口
#define GPIO_595_PortC       GPIOC          // 595输出端口
#define GPIO_595_PortD       GPIOD          // 595输出端口#define HC165_595_Out_RCLK2               GPIO_Pin_12     // 时钟  RCLK  Q1  A12
#define HC165_595_Out_SRCLK2          GPIO_Pin_6        // 锁存 SRCLK  STCP  Q2  B6
#define HC165_595_Out_SER2            GPIO_Pin_0    //  输出数据 SER    Q3  D0u16   SENDVAL165_595 = 0X0000;//595的控制数据
//  0    0    0(饮水机)    0(空开)
/*595数据    15      14      13      12      11    10    9     8     7     6         5         4        3    2     1     0     */
/*16入出    电气设备1 电气设备2 电气设备3  设备4 设备5 设备6 设备7 设备8  互感4 互感3        饮水机   空开4 空开3 空开2 空开1 */
/*接线              1     2       3          4    5     6      7     8     B7      B6         B5        K4    K3    K2     K1     */
void HC165_595SendData1(u16 SendVal1)//SendVal控制
{  u8 i;delay_ms(10);for(i=0;i<16;i++) {if(SendVal1&0x8000)//&0x80 4 birGPIO_SetBits(GPIO_595_PortD,HC165_595_Out_SER2);  // 输出数据  SER  Q3  PD0else GPIO_ResetBits(GPIO_595_PortD,HC165_595_Out_SER2);         delay_us(20);GPIO_ResetBits(GPIO_595_PortB,HC165_595_Out_SRCLK2);     //移位寄存器时钟输入   SRCLK  Q2  PB6delay_us(20);SendVal1<<=1;GPIO_SetBits(GPIO_595_PortB,HC165_595_Out_SRCLK2);delay_us(20);     }GPIO_ResetBits(GPIO_595_PortA,HC165_595_Out_RCLK2);         //存储寄存器时钟输入  RCLK   Q1  PA12delay_us(20);GPIO_SetBits(GPIO_595_PortA,HC165_595_Out_RCLK2);   delay_us(20);
}//初始化PB5和PE5为输出口.并使能这两个口的时钟
//74HC-165 IO初始化
//  A11 B7 D1    1号165
//A11 QH   上拉
//B7 S/L    推挽输出  初始化为低
//D1 CLK   推挽输出  初始化为高
void LEDHC165_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD, ENABLE);    //使能PE端口时钟//GPIO A /*PA11上拉输入*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;              //  A11   端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //上拉  QH GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;         //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化GPIOC0//GPIO B  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;               //  B7   端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure);                     //根据设定参数初始化GPIOC0GPIO_ResetBits(GPIOB,GPIO_Pin_7);                      //PB7 输出D//GPIO DGPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                 //D1端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        //IO口速度为50MHzGPIO_Init(GPIOD, &GPIO_InitStructure);                     //根据设定参数初始化GPIOD1GPIO_SetBits(GPIOD,GPIO_Pin_1);                        //PD1 输出G}//函数名称读取 165的数据uint16_t HC165Data1[16];     //第一个165数据存储的数组/*165数据   15      14      13      12      11    10    9     8     7     6     5     4     3     2     1      0      */
/*16入出    检流计2 检流计1 自耦计2 自耦计1 空开4 空开3 空开2 空开1 互感4 互感3 互感2 互感1 开关2 开关1 电源负 电源正 */
/*接线      B10     B9      C6      C5      C4    C3    C2    C1    B8    B7    B6    B5    B4    B3    B2     B1     */
uint16_t HC165ReceiveData_Key1(void)     //第一个74HC165数据读取
{uint8_t i;uint16_t indata;HC165_SHLD1=0;           //数据输入  S/Ldelay_us(1);HC165_SHLD1=1;delay_us(1);indata=0xffff;//4  BIRfor(i=0;i<16;i++)//16{indata=indata<<1;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==0)     //QH输入indata+=1;GPIO_SetBits(GPIOD,GPIO_Pin_1);      //CLK时钟跳变delay_us(1);GPIO_ResetBits(GPIOD,GPIO_Pin_1);  //CLK时钟跳变delay_us(1);}indata=(((indata>>8)&0x00ff)|((indata<<8)&0xff00));return(indata);
}#if 0/*595数据  15     14     13      12      11      10      9       8       7       6       5       4       3       2       1       0       */
/*16入出   电池负 电池正 继电器4 继电器3 继电器2 继电器1 变阻器2 变阻器1 微安计2 微安计1 变流器4 变流器3 变流器2 变流器1 自耦计4 自耦计3 */
/*接线     C22    C21    C20     C19     C18     C17     C16     C15     C14     C13     C12     C11     C10     C9      C8      C7      */
uint16_t HC165ReceiveData_Key2(void)     //第二个74HC165数据读取
{uint8_t i;uint16_t indata;HC165_SHLD2=0;           //数据输入delay_us(1);HC165_SHLD2=1;delay_us(1);indata=0xffff;for(i=0;i<16;i++){indata=indata<<1;if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)==0)     //QH输入   indata+=1;GPIO_SetBits(GPIOA,GPIO_Pin_0);      //CLK时钟跳变delay_us(1);GPIO_ResetBits(GPIOA,GPIO_Pin_0);delay_us(1);}indata=(((indata>>8)&0x00ff)|((indata<<8)&0xff00));return(indata);
}/*165数据    7    6    5    4    3         2     1       0       */
/*4入出      空   空   空   空   自耦控制  按钮  指示灯2 指示灯1 */
/*接线       空   空   空   空   自耦控制  按钮  C24     C23     */
uint8_t HC165ReceiveData_Key3(void)     //第三个74HC165数据读取
{uint8_t i;uint8_t indata;HC165_SHLD3=0;           //数据输入delay_us(1);HC165_SHLD3=1;delay_us(1);indata=0xff;for(i=0;i<8;i++){indata=indata<<1;if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)==0)     //QH输入indata+=1;GPIO_SetBits(GPIOC,GPIO_Pin_0);      //CLK时钟跳变delay_us(1);GPIO_ResetBits(GPIOC,GPIO_Pin_0);delay_us(1);}return(indata);
}#endifvoid HC165_Data()        //165数据处理,将读取的数据分开放在数组中
{u8 i=0;for(i=0;i<16;i++){HC165Data1[i]=(HC165ReceiveData_Key1()>>(i))&1;    }}
#include "74HC595.h"
#include "DELAY.h"//初始化PB5和PE5为输出口.并使能这两个口的时钟
//74HC-595  IO初始化
// C1 A0 C0  Q1 Q2 Q3    1号595
//C2 A1 C3               2号595
void LED5954HC_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);     //使能PE端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;               //C0  C1  C2  C3 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        //IO口速度为50MHzGPIO_Init(GPIOC, &GPIO_InitStructure);                     //根据设定参数初始化GPIOC0GPIO_ResetBits(GPIOC,GPIO_Pin_0);                      //PC0 输出低GPIO_ResetBits(GPIOC,GPIO_Pin_1);                      //PC1 输出低GPIO_ResetBits(GPIOC,GPIO_Pin_2);                      //PC1 输出低GPIO_ResetBits(GPIOC,GPIO_Pin_3);                      //PC1 输出低GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;              //A0  A1端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;        //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure);                     //根据设定参数初始化GPIOA0GPIO_ResetBits(GPIOA,GPIO_Pin_0);     GPIO_ResetBits(GPIOA,GPIO_Pin_1);   }/************************************************************************
*函数名称:void Write_595(uint64_t dat)
*函数功能:写595
*函数参数:uint64_t dat
*返回值  :无
************************************************************************/#define GPIO_595_PortA       GPIOA         // 595输出端口
#define GPIO_595_PortB       GPIOB          // 595输出端口
#define GPIO_595_PortC       GPIOC          // 595输出端口
#define GPIO_595_PortD       GPIOD          // 595输出端口#define Out_RCLK              GPIO_Pin_1      // 时钟  RCLK
#define Out_SRCLK             GPIO_Pin_0        // 锁存 SRCLK  STCP
#define Out_SER             GPIO_Pin_0  //  输出数据 SER  #define Out_RCLK2             GPIO_Pin_2      // 时钟  RCLK  Q1  C2
#define Out_SRCLK2        GPIO_Pin_1        // 锁存 SRCLK  STCP  Q2  A1
#define Out_SER2              GPIO_Pin_3    //  输出数据 SER    Q3  C3u16   SENDVAL595 = 0X0000;//595的控制数据
//  0    0    0(饮水机)    0(空开)
/*595数据    15      14      13      12      11    10    9     8     7     6         5         4        3    2     1     0     */
/*16入出    电气设备1 电气设备2 电气设备3  设备4 设备5 设备6 设备7 设备8  互感4 互感3        饮水机   空开4 空开3 空开2 空开1 */
/*接线              1     2       3          4    5     6      7     8     B7      B6         B5        K4    K3    K2     K1     */
void HC595SendData1(u16 SendVal1)//SendVal控制
{  u8 i;for(i=0;i<16;i++) {if(SendVal1&0x8000)//&0x80 4 birGPIO_SetBits(GPIO_595_PortC,Out_SER);  // 输出数据  SER  Q3  PC0else GPIO_ResetBits(GPIO_595_PortC,Out_SER);        delay_us(20);GPIO_ResetBits(GPIO_595_PortA,Out_SRCLK);     //移位寄存器时钟输入   SRCLK  Q2  PA0delay_us(20);SendVal1<<=1;GPIO_SetBits(GPIO_595_PortA,Out_SRCLK);delay_us(20);       }GPIO_ResetBits(GPIO_595_PortC,Out_RCLK);         //存储寄存器时钟输入  RCLK   Q1  PC1delay_us(20);GPIO_SetBits(GPIO_595_PortC,Out_RCLK);   delay_us(20);
}u16   SENDVAL5952= 0X0000;// (2号板)  595的控制数据
//595  16位  2号板void HC595SendData2(u16 SendVal2)//SendVal控制
{  u8 i;for(i=0;i<16;i++) {if(SendVal2&0x8000)GPIO_SetBits(GPIO_595_PortC,Out_SER2);  // 输出数据  SER  Q3  PC3else GPIO_ResetBits(GPIO_595_PortC,Out_SER2);           delay_us(20);GPIO_ResetBits(GPIO_595_PortA,Out_SRCLK2);     //移位寄存器时钟输入   SRCLK  Q2  PA1delay_us(20);SendVal2<<=1;GPIO_SetBits(GPIO_595_PortA,Out_SRCLK2);delay_us(20);     }GPIO_ResetBits(GPIO_595_PortC,Out_RCLK2);         //存储寄存器时钟输入  RCLK   Q1  PC2delay_us(20);GPIO_SetBits(GPIO_595_PortC,Out_RCLK2);   delay_us(20);
}

stm32使用74HC595和74HC165相关推荐

  1. 单片机(二):3个IO扩展n*8个IO,基于74hc595与74hc165的8x8矩阵键盘

    3个IO通过一片74hc595扩展8个输出IO,3个IO通过一片74hc1655扩展8个输入IO,最终成为8X8的矩阵键盘.对于普通的矩阵键盘,再加入防止鬼键.消抖和按下与松开识别. 一.74hc59 ...

  2. STM32实现74HC595控制

    一.前言 本文主要是实出74HC595的简单控制功能实现(学习笔记整理). 二.概述 (一)74HC595简述 74HC595是一个8位串行输入.平行输出的位移缓存器:平台行输出为三态输出. 在SCH ...

  3. 零成本学arduino——74hc595寄存器教程

    本文介绍如何用arduino控制74hc595 1.知识预览 对74hc595寄存器进行介绍 shiftOut()函数介绍 对控制程序进行介绍 2.仿真预览 点击74hc595开始仿真 3.74hc5 ...

  4. 计算机控制技术74hc273,计算机控制技术习题—广州工业大学

    6.简述51系列单片机的寻址方式和每种寻址方式所涉及的寻址空间. 7.MCS-51单片机的中断系统由哪些部分组成?MCS-51单片机有哪几种中断源? 8.MCS-51单片机中定时器/计数器的4种计数工 ...

  5. Arduino 定时器中断

    Arduino 定时器中断 Circuits Arduino 查看原文 简介:Arduino 定时器中断 奥雷里(地球.月亮和太阳) 立式兰花播种机 胶合板书柜扬声器 计时器中断允许您以非常特定的时间 ...

  6. NANO-stm32F103-HAL库基础指南--开发板硬件介绍

    一.开发板介绍 8 个 LED 这是开发板板载的八个 LED 灯(DS0-DS7),都为红色.可以像 51 那样实现跑马灯. 我们一般的应用 2 个 LED 足够了,在调试代码的时候,使用 LED 来 ...

  7. STM32学习记录——74HC595四位数码管显示

    数模管作为STM32的一个重要外设,由于其成本低.稳定,被用于许多场景中.本篇文章来介绍下四位数码管的使用方法. 数码管显示 一.数码管的分类 二.74HC595芯片(串入并出) 三.原理图 四.代码 ...

  8. 【STM32学习】(14)两个74HC595控制四个数码管显示

    74HC595是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个 ...

  9. STM32驱动74HC165原理图加程序

    一.原理图 二.时序图 三.驱动源码 void couple_init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCm ...

最新文章

  1. 浓缩精华的架构演进过程,我连看了六遍!
  2. 怎样检查Android网络连接状态
  3. 题目1526:朋友圈
  4. 聊聊 Redis 使用场景
  5. 科大星云诗社动态20210510
  6. 求解:nhibernate2.0操作oralce提交事务时报错
  7. C#实现清理系统内存
  8. 【debug】UnboundLocalError local variable a referenced before assignment
  9. Cookie工具类-cookieUtil.js
  10. 阿里巴巴宣布成立半导体公司,要自主研发芯片
  11. javascript中实现动画是settimeout(递归)还是用setinterval好?
  12. 图解 Git,一目了然!
  13. 134. PHP 工具
  14. AWS DeepRacer 参数调优 Amazon SageMaker 和 Amazon RoboMaker
  15. 简单的网页制作期末作业
  16. 在电脑上如何用桌面便签进行日程管理?
  17. 网吧相关法律期待完善
  18. java孙正英_JavaSE23-函数式接口Stream流
  19. 不会编程,别着急!免编程工具助你快速开发App
  20. 【金猿技术展】视频矫正技术——基于参数估计的自由几何变换算法

热门文章

  1. QQ音乐Android客户端Web页面通用性能优化实践
  2. GPU虚拟化桌面云方案介绍-概述、场景及优势
  3. Web jquery ajax,EL遍历 js刷新 jquery遍历json数组填充表格 等等随笔
  4. Python爬虫之Selenium
  5. Java对接快递100
  6. 做原画师需要学习素描吗?
  7. 吉林大学软院夏令营面试
  8. redis出现WRONGTYPE Operation against a key holding the wrong kind of value错误
  9. 这,不是我想要的生活
  10. 河南理工大学python挂科率_河南理工大学是什么水平?附河南理工大学就业最好专业...