news 2026/3/25 17:16:02

树莓派Pico‌的hc595例子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派Pico‌的hc595例子

参考HC595串转并

wokwi.toml

[wokwi]version=1firmware="cmake-build-debug-pico/pipo_project.uf2"elf="cmake-build-debug-pico/pipo_project.elf"

diagram.json

{ "version": 1, "author": "Uri Shaked", "editor": "wokwi", "parts": [ { "type": "wokwi-pi-pico", "id": "pico", "top": -137.55, "left": 3.6, "attrs": { "builder": "pico-sdk" } }, { "type": "wokwi-74hc595", "id": "sr1", "top": -10.94, "left": 140.5, "rotate": 270, "attrs": {} }, { "type": "wokwi-led-bar-graph", "id": "bargraph1", "top": 72, "left": 321.6, "attrs": { "color": "lime" } }, { "type": "wokwi-gnd", "id": "gnd1", "top": 182.4, "left": 345, "attrs": {} }, { "type": "wokwi-gnd", "id": "gnd2", "top": -38.4, "left": 297, "attrs": {} }, { "type": "wokwi-vcc", "id": "vcc1", "top": 58.36, "left": 96, "attrs": {} } ], "connections": [ [ "pico:GP0", "$serialMonitor:RX", "", [] ], [ "pico:GP1", "$serialMonitor:TX", "", [] ], [ "sr1:Q0", "bargraph1:A1", "green", [ "h-18", "v28.8", "h67.2", "v-86.4" ] ], [ "sr1:Q1", "bargraph1:A2", "green", [ "h38.4", "v-57.6" ] ], [ "sr1:Q2", "bargraph1:A3", "green", [ "h28.8", "v-38.4" ] ], [ "sr1:Q3", "bargraph1:A4", "green", [ "h9.6", "v-19.2" ] ], [ "sr1:Q4", "bargraph1:A5", "green", [ "h86.4", "v105.61" ] ], [ "sr1:Q5", "bargraph1:A6", "green", [ "h9.6", "v-48", "h67.2", "v67.2" ] ], [ "sr1:Q6", "bargraph1:A7", "green", [ "h57.6", "v48" ] ], [ "sr1:Q7", "bargraph1:A8", "green", [ "h48", "v57.6" ] ], [ "bargraph1:C1", "bargraph1:C2", "green", [ "v0" ] ], [ "bargraph1:C3", "bargraph1:C4", "green", [ "h0" ] ], [ "bargraph1:C5", "bargraph1:C6", "green", [ "h0" ] ], [ "bargraph1:C7", "bargraph1:C8", "green", [ "h0" ] ], [ "bargraph1:C9", "bargraph1:C10", "green", [ "h0" ] ], [ "bargraph1:C8", "bargraph1:C9", "green", [ "h0" ] ], [ "bargraph1:C2", "bargraph1:C3", "green", [ "h0" ] ], [ "bargraph1:C4", "bargraph1:C5", "green", [ "h0" ] ], [ "bargraph1:C6", "bargraph1:C7", "green", [ "h0" ] ], [ "gnd1:GND", "bargraph1:C10", "black", [ "v0" ] ], [ "pico:GP2", "sr1:DS", "green", [ "h-48", "v-76.8", "h172.8", "v9.6" ] ], [ "sr1:SHCP", "pico:GP3", "green", [ "h-18", "v-182.4", "h-211.2", "v86.4", "h0", "v38.4" ] ], [ "sr1:STCP", "pico:GP4", "green", [ "h-66", "v-153.6", "h-115.2", "v76.8" ] ], [ "gnd2:GND", "sr1:GND", "black", [ "v-19.2", "h-86.4", "v28.8" ] ], [ "vcc1:VCC", "sr1:VCC", "red", [ "v19.2", "h57.6", "v-9.6" ] ], [ "sr1:MR", "vcc1:VCC", "green", [ "h-37.2", "v96" ] ] ], "dependencies": {} }

main.cpp IO 模拟

#include<stdio.h>#include"pico/stdlib.h"// 74HC595 接线 GPIO#defineDS_PIN2// 数据输入#defineSHCP_PIN3// 移位寄存器时钟#defineSTCP_PIN4// 输出寄存器锁存// 延时微秒staticinlinevoidpulse_pin(uint pin){gpio_put(pin,1);sleep_us(1);gpio_put(pin,0);}// 初始化 GPIOvoidhc595_init(){gpio_init(DS_PIN);gpio_set_dir(DS_PIN,true);gpio_init(SHCP_PIN);gpio_set_dir(SHCP_PIN,true);gpio_init(STCP_PIN);gpio_set_dir(STCP_PIN,true);}// 向 74HC595 发送一个字节voidhc595_write_byte(uint8_tdata){for(inti=7;i>=0;i--){gpio_put(DS_PIN,(data>>i)&1);// 发送最高位到最低位pulse_pin(SHCP_PIN);// 上升沿移位}pulse_pin(STCP_PIN);// 更新输出寄存器}intmain(){stdio_init_all();hc595_init();printf("Pico 74HC595 demo start\n");uint8_tpattern=0x01;while(1){hc595_write_byte(pattern++);sleep_ms(1000);}return0;}

PIO

CMakeLists.txt

cmake_minimum_required(VERSION3.13)# Set Pico SDK pathset(PICO_SDK_PATH"D:/Program Files/Raspberry Pi/Pico SDK v1.5.1/pico-sdk")# Include the Pico SDK CMake configurationinclude(pico_sdk_import.cmake)project(pipo_project C CXX ASM)pico_sdk_init()add_executable(pipo_project main.c)pico_generate_pio_header(pipo_project${CMAKE_CURRENT_LIST_DIR}/hc595.pio)target_link_libraries(pipo_project pico_stdlib hardware_pio)# Enable USB output, disable UART outputpico_enable_stdio_usb(pipo_project0)pico_enable_stdio_uart(pipo_project1)pico_add_extra_outputs(pipo_project)

hc595.pio

;;HC595 PIO 程序;驱动 74HC595 移位寄存器;DS ->普通 OUT PIN;SHCP ->side-set bit0;STCP ->side-set bit1;;FIFO 写入字节,每次从 FIFO 拉取8bit;输出到 DS 并自动产生 SHCP 时钟脉冲;输出完成后产生一次 STCP 锁存脉冲;.program hc595 .side_set2opt;bit0=SHCP,bit1=STCP;=============================;主循环;=============================.wrap_target pull block;从 FIFO 拉取一个字节sety,7;位计数7->0bitloop: out pins,1;输出一位到 DS nop side0;SHCP=0,STCP=0nop side1;SHCP=1,STCP=0(产生移位脉冲) jmp y-- bitloop side0;SHCP=0,STCP=0;发送完成,产生锁存脉冲 nop side2;SHCP=0,STCP=1nop side0;SHCP=0,STCP=0.wrap;========================================================% c-sdk{//========================================================// 初始化 HC595 PIO 状态机 // 参数: // pio - PIO 控制器 // sm - 状态机编号 // offset - PIO 程序偏移地址 // ds_pin - DS 引脚 // shcp_pin - SHCP 引脚 // stcp_pin - STCP 引脚 //========================================================static inline void hc595_program_init(PIO pio, uint sm, uint offset, uint ds_pin, uint shcp_pin, uint stcp_pin){pio_sm_config c=hc595_program_get_default_config(offset);// 设置输出引脚 sm_config_set_out_pins(&c, ds_pin,1);// DS sm_config_set_sideset_pins(&c, shcp_pin);// side-set 起始 pin=SHCP sm_config_set_set_pins(&c,0,0);// 没有使用 SET 指令 //shift配置 LSB first, autopull sm_config_set_out_shift(&c, true, true,8);sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);// 初始化 GPIO pio_gpio_init(pio, ds_pin);pio_gpio_init(pio, shcp_pin);pio_gpio_init(pio, stcp_pin);// 所有引脚都设置为输出 pio_sm_set_consecutive_pindirs(pio, sm, ds_pin,1,true);pio_sm_set_consecutive_pindirs(pio, sm, shcp_pin,2,true);// SHCP+STCP // 初始化状态机 pio_sm_init(pio, sm, offset,&c);pio_sm_set_enabled(pio, sm,true);}static inline void hc595_write(PIO pio, uint sm, uint8_t data){pio_sm_put_blocking(pio, sm, data);}%}

main.c

#include<stdio.h>#include"pico/stdlib.h"#include"hardware/pio.h"#include"hc595.pio.h"#defineDS_PIN2#defineSHCP_PIN3#defineSTCP_PIN4intmain(){stdio_init_all();PIO pio=pio0;uint sm=0;uint offset=pio_add_program(pio,&hc595_program);hc595_program_init(pio,sm,offset,DS_PIN,SHCP_PIN,STCP_PIN);uint8_tpattern=0x0;while(1){hc595_write(pio,sm,pattern++);if(pattern==0)pattern=0x11;sleep_ms(500);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 15:30:22

【数据库】【Redis】定位、优势、场景与持久化机制解析

Redis 是互联网技术栈的标配组件&#xff0c;既是高性能内存数据库&#xff0c;又是万能缓存中间件&#xff0c;其定位比传统数据库更灵活&#xff0c;比纯缓存更强大 一、Redis 的定位&#xff1a;不仅仅是缓存 Redis 的官方定位是 “In-Memory Data Structure Store” &…

作者头像 李华
网站建设 2026/3/13 10:28:05

31、深入探索Shell编程:变量、函数与设计技巧

深入探索Shell编程:变量、函数与设计技巧 1. 变量与常量 在Shell编程中,变量和常量是基础且重要的概念。Shell提供了一种方式来强制常量的不可变性,可使用 declare 内置命令搭配 -r (只读)选项。例如: declare -r TITLE="Page Title"这样,Shell会阻止…

作者头像 李华
网站建设 2026/3/14 11:44:16

多智能体系统在公司网络安全风险评估中的应用

多智能体系统在公司网络安全风险评估中的应用关键词&#xff1a;多智能体系统、公司网络安全、风险评估、应用、网络安全管理摘要&#xff1a;本文聚焦于多智能体系统在公司网络安全风险评估中的应用。首先介绍了研究的背景、目的、预期读者、文档结构和相关术语。接着阐述了多…

作者头像 李华
网站建设 2026/3/21 14:57:53

医疗影像Agent性能优化秘籍(基于千万级影像数据训练实录)

第一章&#xff1a;医疗影像 Agent 的辅助诊断在现代医学诊疗中&#xff0c;医疗影像数据的解读对临床决策至关重要。随着深度学习与人工智能技术的发展&#xff0c;医疗影像 Agent 作为智能辅助诊断系统的核心组件&#xff0c;正在显著提升放射科医生的工作效率与诊断准确性。…

作者头像 李华
网站建设 2026/3/20 6:45:59

RabbitMQ 集群常见“坑”全攻略:从根本原因到救命排查技巧

RabbitMQ 集群常见“坑”全攻略:从根本原因到救命排查技巧 RabbitMQ 集群是保障消息队列 高可用 和 高性能 的核心架构,但在实际部署和运维过程中,往往会踩到各种“坑”。 本文将系统梳理这些常见问题、根本原因,并总结关键的排查和修复技巧,帮助你在生产环境中更好地稳定…

作者头像 李华
网站建设 2026/3/20 6:45:58

Windows找不到d3dx9_31.dll文件 无法启动游戏软件 彻底修复解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华