Funpack4-2 - 基于PIC16F13145实现抢答器
该项目使用了PIC16F13145,实现了抢答器的设计,它的主要功能为:抢答和复位功能。
标签
Funpack活动
PIC6F13145
抢答器
lshy
更新2025-07-09
64

项目描述

本项目基于PIC16F13145 Curiosity Nano 开发板进行设计。通过 PIC16F13145 上的可配置逻辑块 (CLB) 控制ws2812彩灯,显示具体的数字。利用板子上的gpio口采集独立按键的信号,实现抢答和复位功能。

a5d17ffe648e0aaf798eafb71f12722.jpg

硬件说明

1、PIC16F13145 Curiosity Nano 评估套件

PIC16F13145 Curiosity Nano 评估套件(EV06M52A) 是用于评估 PIC16F13145 系列微控制器的硬件平台,搭载 PIC16F13145 微控制器 (MCU),属于Curiosity Nano系列。 Curiosity Nano 系列评估板包括一个板载调试器,该套件可访问 PIC16F13145 上的可配置逻辑块 (CLB) 和其他内核独立外设,无需外部工具即可对 PIC16F13145 进行编程和调试。


MPLAB X 集成开发平台和 MPLAB 代码配置器 (MCC),该套件可访问 PIC16F13145 上的可配置逻辑块 (CLB) 和其他内核独立外设。 MCC 是一款免费的图形编程工具,可根据具体应用配置各种外设和功能。


板卡特性

  • PIC16F13145 微控制器
  • USB Type-C® 连接器
  • 一个黄色用户 LED
  • 一个机械用户开关
  • 一个绿色电源和状态 LED
  • 用于 32.768 kHz 晶体的基底面
  • Microchip MPLAB® X IDE 中的板载调试器支持:
    • 板卡识别
    • 虚拟串行端口 (CDC)
    • 编程和调试
    • 一个调试 GPIO 通道 (DGI GPIO)
  • USB 供电
  • 可调目标电压:
    • 由板载调试器控制的 MIC5353 LDO 稳压器-
    • 1.8-5.1V 输出电压(受 USB 输入电压限制)
    • 500 mA 最大输出电流(受环境温度和输出电压限制)


微控制器:PIC16F13145

Microchip Technology PIC16F13145 CLB微控制器为具有一组专用外设、基于硬件的设计提供了高效的解决方案。 Microchip Technology PIC16F13145微控制器采用可配置逻辑块(CLB),其中包含32个独立逻辑单元,并带有可自定义的查找表(LUT),用于基于硬件的自定义逻辑。 如此可以实现独立于CPU的运行,从而缩短响应时间并降低功耗。此系列微控制器采用8、14和20引脚封装,提供高达14KB的程序闪存和高达1KB的RAM。其他外设包括一个高达100ksps带计算功能的10位模数转换器(ADCC)、一个8位数模转换器、两个响应时间为50ns的快速比较器,以及各种与SMBus兼容的定时和串行通信外设。


可配置逻辑块 (CLB) 模块

CLB 可独立于 CPU 运行,通过执行基于硬件的数字逻辑,确保快速一致的响应时间。 CLB 可容纳 32 个基本逻辑元件阵列,每个元件都能模拟 AND/OR/NAND/NOR 门、缓冲器/反相缓冲器、D 触发器、JK 触发器、多路复用器或四输入 LUT。 CLB 还支持动态配置,以实现即时更改和三态逻辑。 它特别适用于汽车和工业环境,同时具有足够的通用性,可满足广泛的应用需求。


特性:

  • 工作电压范围:1.8 V~5.5 V
  • 可调内部振荡器(高达32MHz)
  • 可配置逻辑块,带32个基本逻辑单元(BLE)
  • 4个可配置逻辑单元
  • 带计算功能的10位ADC(ADCC),速率高达300ksps
  • 8位数模转换器 (DAC)
  • 2个快速比较器(响应时间为50ns)
  • 2个10位PWM、2个捕获比较PWM(CCP)
  • 1个8位定时器和1个16位定时器
  • 1个EUSART和1个MSSP
  • 窗口化看门狗定时器(WWDT)
  • 外设引脚选择 (PPS)


2、ws2812彩灯

59475db0bca4525ef065394d15684c2.jpg

通过WS2812B手册了解:该灯内置控制IC,仅需要一根控制线,称为单线串行控制;每一颗灯有四个引脚,分别为DIN、DOUT、VCC、GND,

DOUT存在的意义是当存在多颗灯珠时,可以将它们以:DOUT接DIN的方式,首尾互相串接起来,即第一颗LED的DIN接入控制器信号,它的DOUT接到第二颗的DIN引脚,第二颗的DOUT又接入下一颗LED的DIN,以此无限(手册说的,有条件可测试看看)级联串接下去。实际应用也不会是一栋楼就一条灯带。。。所以这里说的无限连接,理解为能接很多很多LED便是。

为什么可以无限级联?手册说该IC有数据整形功能,可以将接收到的数据整形后发给下一颗,所以即使线路很长,它的数字信号每一次都得到有效的自动整形,其信号损失就可以忽略。


多灯珠级联示意图



开发环境

本项目使用MPLAB X IDE v6.25进行开发。

开发板接到电脑上时,ide会出现Kit Window界面。在该界面中的MCU Boards栏显示了开发板的具体型号。

image.png

点击界面中的 code examples

image.png

进入到官方的例程网页

image.png

打开spi to ws2812的界面

image.png

下载例程

image.png

代码及工程说明

打开例程后,点击mcc,该过程可能会比较耗时。

image.png

如果打开后出现类似下方界面,则说明有相关库没有下载完全,此时点击又下方的finish,ide将会主动下载对应资源。

image.png

如果打开mcc出现下方界面,则说明资源下载完成。

image.png

打开pin grid view,在这里面选择3个gpio脚(c3、a4、a5)作为gpio输入,用于实现独立按键的输入检测。

image.png

使用generate生成对应代码

image.png

接下来,在生成好的工程里改动main函数。让spi的数据一直由clb输出,并在while循环中调用rgb显示和按键扫描两个功能函数。

int main(void) {

SYSTEM_Initialize();

// If using interrupts in PIC18 High/Low Priority Mode you need to enable the Global High and Low Interrupts
// If using interrupts in PIC Mid-Range Compatibility Mode you need to enable the Global and Peripheral Interrupts
// Use the following macros to:

// Enable the Global Interrupts
// INTERRUPT_GlobalInterruptEnable();

// Disable the Global Interrupts
// INTERRUPT_GlobalInterruptDisable();

// Enable the Peripheral Interrupts
// INTERRUPT_PeripheralInterruptEnable();

// Disable the Peripheral Interrupts
// INTERRUPT_PeripheralInterruptDisable();

CLBSWINLbits.CLBSWIN0 = 1; // DEMUX out1, SPI routed to SPI_to_WS2812 CLB circuit
__delay_ms(100);
srand(100); // ??????????
display_type = 1;

// I2C1_Initialize();
// //configure pins for I2C
// SSP1CLKPPS = 0xE; //RB6->MSSP1:SCL1;
// RB6PPS = 0x1B; //RB6->MSSP1:SCL1;
// SSP1DATPPS = 0xC; //RB4->MSSP1:SDA1;
// RB4PPS = 0x1C; //RB4->MSSP1:SDA1;

while (1) {

uint8_t key = 0;

// if(VK36N16I_Read(&key)==1)

// {

// display_type = 2;

// if(key == 1)

// {

// ser =1;

// }

// }

key_loop();

display_loop();

}

}

按键扫描函数,a4和a5为抢答按键,通过判断display_type 的状态,来判断是否需要检测抢答按键,进而实现抢答锁定功能。

static void key_loop(void) {
if (display_type == 0) {
if (IO_RA4_GetValue() == 0) {
__delay_ms(100);
if (IO_RA4_GetValue() == 0) {
display_type = 2;
ser = 2;
while (IO_RA4_GetValue() == 0);
}

} else if (IO_RA5_GetValue() == 0) {
__delay_ms(100);
if (IO_RA5_GetValue() == 0) {
display_type = 2;
ser = 1;
while (IO_RA5_GetValue() == 0);
}
}
}

if (IO_RC3_GetValue() == 0) {
__delay_ms(100);
if (IO_RC3_GetValue() == 0) {
display_type = 1;
ser = 0;
while (IO_RC3_GetValue() == 0);
}
}
}


RGB显示函数,调用spi去输出rgb数组信息。

static void WriteLEDsString(color_t const *const frame) {
SPI1_Open(Custom_SPI);
SPI1_BufferWrite(frame, RGB_IMAGE_SIZE);
SPI1_Close();
}

需要更改例子中的image头文件,实现数字1、数字2、全亮、全灭3个数组,给显示函数调用。

/**
* @file image.h
* @author Image converter
*
* @brief Header file generated from image.
*
* @version 1.0.0
*
* @copyright (c) 2023 Microchip Technology Inc. and its subsidiaries.
*
* Subject to your compliance with these terms, you may use Microchip software
* and any derivatives exclusively with Microchip products. You're responsible
* for complying with 3rd party license terms applicable to your use of 3rd
* party software (including open source software) that may accompany
* Microchip software.
*
* SOFTWARE IS "AS IS." NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY,
* APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF
* NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS
* RELATED TO THE SOFTWARE WILL NOT EXCEED AMOUNT OF FEES, IF ANY, YOU PAID
* DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
**/


#ifndef IMAGE_H
#define IMAGE_H

#include <stdint.h>


uint8_t const imageR[] = {
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

uint8_t const imageG[] = {
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

uint8_t const imageCLR[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};



uint8_t const imageALL[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
};

#endif /* IMAGE_H */

随机亮起实现。利用rand生成随机数,delay_self基于随机数进行不同延时。

void delay_self(uint8_t cnt) {
for (uint8_t loop = 0; loop < cnt; loop++) {
__delay_ms(100);
}
}

static void ledReset(void) {
uint32_t delay123 = (rand() % 10 + 1);
WriteLEDsString(imageCLR);
delay_self(delay123);
WriteLEDsString(imageALL);
}



项目心得

在本次活动中,使用的mplab x ide,让我影响深刻。它的资源管理,及代码生成能力强大。哪怕不熟悉对应的单片机,ide中的各种工具,也能够让人快速的完成工程创建,减少了硬件平台带来的差异。pic1613145这个单片机,它内部的clb模块也让人耳目一新。通过它提供的可配置逻辑块,可以实现基础的数据逻辑。让单片机能够更贴合一些特殊的用场景。





附件下载
pic16f13145-spi-ws2812-mplab-mcc-1.2.0 (1) (3) - 副本 - 副本.zip
程序
团队介绍
练习两年半的个人练习生
团队成员
lshy
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号