stm32使用74HC595和74HC165
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相关推荐
- 单片机(二):3个IO扩展n*8个IO,基于74hc595与74hc165的8x8矩阵键盘
3个IO通过一片74hc595扩展8个输出IO,3个IO通过一片74hc1655扩展8个输入IO,最终成为8X8的矩阵键盘.对于普通的矩阵键盘,再加入防止鬼键.消抖和按下与松开识别. 一.74hc59 ...
- STM32实现74HC595控制
一.前言 本文主要是实出74HC595的简单控制功能实现(学习笔记整理). 二.概述 (一)74HC595简述 74HC595是一个8位串行输入.平行输出的位移缓存器:平台行输出为三态输出. 在SCH ...
- 零成本学arduino——74hc595寄存器教程
本文介绍如何用arduino控制74hc595 1.知识预览 对74hc595寄存器进行介绍 shiftOut()函数介绍 对控制程序进行介绍 2.仿真预览 点击74hc595开始仿真 3.74hc5 ...
- 计算机控制技术74hc273,计算机控制技术习题—广州工业大学
6.简述51系列单片机的寻址方式和每种寻址方式所涉及的寻址空间. 7.MCS-51单片机的中断系统由哪些部分组成?MCS-51单片机有哪几种中断源? 8.MCS-51单片机中定时器/计数器的4种计数工 ...
- Arduino 定时器中断
Arduino 定时器中断 Circuits Arduino 查看原文 简介:Arduino 定时器中断 奥雷里(地球.月亮和太阳) 立式兰花播种机 胶合板书柜扬声器 计时器中断允许您以非常特定的时间 ...
- NANO-stm32F103-HAL库基础指南--开发板硬件介绍
一.开发板介绍 8 个 LED 这是开发板板载的八个 LED 灯(DS0-DS7),都为红色.可以像 51 那样实现跑马灯. 我们一般的应用 2 个 LED 足够了,在调试代码的时候,使用 LED 来 ...
- STM32学习记录——74HC595四位数码管显示
数模管作为STM32的一个重要外设,由于其成本低.稳定,被用于许多场景中.本篇文章来介绍下四位数码管的使用方法. 数码管显示 一.数码管的分类 二.74HC595芯片(串入并出) 三.原理图 四.代码 ...
- 【STM32学习】(14)两个74HC595控制四个数码管显示
74HC595是在单片机系统中常用的芯片之一他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动芯片, 使用74HC595可以节约单片机mcu的io口资源,用3个io就可以控制8个 ...
- STM32驱动74HC165原理图加程序
一.原理图 二.时序图 三.驱动源码 void couple_init(void) {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCm ...
最新文章
- 浓缩精华的架构演进过程,我连看了六遍!
- 怎样检查Android网络连接状态
- 题目1526:朋友圈
- 聊聊 Redis 使用场景
- 科大星云诗社动态20210510
- 求解:nhibernate2.0操作oralce提交事务时报错
- C#实现清理系统内存
- 【debug】UnboundLocalError local variable a referenced before assignment
- Cookie工具类-cookieUtil.js
- 阿里巴巴宣布成立半导体公司,要自主研发芯片
- javascript中实现动画是settimeout(递归)还是用setinterval好?
- 图解 Git,一目了然!
- 134. PHP 工具
- AWS DeepRacer 参数调优 Amazon SageMaker 和 Amazon RoboMaker
- 简单的网页制作期末作业
- 在电脑上如何用桌面便签进行日程管理?
- 网吧相关法律期待完善
- java孙正英_JavaSE23-函数式接口Stream流
- 不会编程,别着急!免编程工具助你快速开发App
- 【金猿技术展】视频矫正技术——基于参数估计的自由几何变换算法
热门文章
- QQ音乐Android客户端Web页面通用性能优化实践
- GPU虚拟化桌面云方案介绍-概述、场景及优势
- Web jquery ajax,EL遍历 js刷新 jquery遍历json数组填充表格 等等随笔
- Python爬虫之Selenium
- Java对接快递100
- 做原画师需要学习素描吗?
- 吉林大学软院夏令营面试
- redis出现WRONGTYPE Operation against a key holding the wrong kind of value错误
- 这,不是我想要的生活
- 河南理工大学python挂科率_河南理工大学是什么水平?附河南理工大学就业最好专业...