verilog学习笔记- 15)动态数码管显示实验

news2024/11/23 15:47:00

目录

简介:

实验任务:

硬件设计:

程序设计:

下载验证:


简介:

由于一般的静态驱动操作虽然方便,但占用的 I/0 口较多,例如要驱动6 位 8 段数码管,以静态驱动方式让数码管各个位显示不同的数值,如“123456”,需要占用6 × 8 = 48个I/O 口,虽然对于 FPGA 这种 I/O 口较多的芯片而言,在资源允许的情况下可以使用,但一般不建议浪费宝贵的 I/O 口资源,尤其在 I/O 口资源紧张的情况下,所以对于多位数码管一般采用动态驱动方式使数码管显示数字。

为了更好的理解数码管动态驱动,我们首先了解下市面上常见的多位数码管的内部连接。以两位数码管为例,其内部连接如下图。由此图可知,两位 8 段数码管共 10 个引脚,每位数码管的阳极连接在一起,为共阳极数码管,每位数码管相同段的 led 的阴极连接在一起,这样当给第 10 和第 5 脚高电平,给第 3 脚低电平时,两个数码管的发光二极管 A 都点亮,对于此种数码管以静态方式驱动显然不可能显示像“18”这种个位与十位不同的数字。

既然同时给第 10 和第 5 脚高电平不可行,那么是不是可以先给第 5 脚高电平,第 10 脚低电平,此时, 让其显示数字“8”时,左边的数码管不显示,右边的数码管显示数字“8”;然后给第 10 脚高电平,第 5 脚低电平,此时,让其显示数字“1”时,左边的数码管显示数字“1”,右边的数码管不显示,这样就可 以显示数字“18”了。但有一个问题,多长时间切换显示的数码管呢,时间如果太长就只能看到数字―8” 或数字“1”了,时间太短呢,结果是显示不清晰而且显示亮度不够。由于人眼的视觉暂留(人眼在观察景 物时,光信号传人大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残 留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”)及发光二极管的余辉效应(当停止向发光 二极管供电时,发光二极管亮度仍能维持一段时间),每位数码管的点亮时间为 1~2ms 时,显示效果能满 足使用需要。数码管的这种驱动方式称为数码管的动态驱动,实际上就是分时轮流控制不同数码管的显示。


实验任务:

本节实验任务是使用 FPGA 开发板上的 6 位数码管以动态方式从 0 开始计数,每 100ms 计数值增加一,当计数值从 0 增加到 999999 后重新从 0 开始计数。


硬件设计:

数码管接口部分的硬件设计原理及本实验中各端口信号的管脚分配与“数码管静态显示实验”完全相 同

verilog学习笔记- 14)静态数码管显示实验_Vizio__的博客-CSDN博客


程序设计:

由实验任务和动态驱动的原理我们可以知道,若要让 6 个数码管轮流显示对应的数字,首先需要一个 数码管动态显示模块,能够依次点亮 6 个数码管,并将对应的数据输出至数码管,也就是需要分别控制段 选和位选信号;同时还需要一个计数模块,能够将 0—999999 依次输出至数码管动态显示模块。根据实验 任务,我们可以大致规划出系统的控制流程:首先我们需要一个数码管动态显示模块在数码管上显示数据, 其次需要一个计数控制模块实现从 0 到 999999 的变化,并将产生的数值通过数码管动态显示模块在数码管 上显示出来。由此画出系统的功能框图如下所示:

 FPGA 顶层(top_seg_led)例化了以下两个模块:计数模块(count)以及数码管动态显示模块(seg_led)。 实现各模块之间数据的交互。计数模块将计数值通过 data 端口传递给数码管动态显示模块,使能信号 en 使能数码管显示数据,小数点显示信号 point 控制小数点的显示,符号信号 sign 可以让数码管显示负号。 计数模块(count):显示的数字每 100ms 加1。

数码管动态显示模块(seg_led):数码管动态显示模块在数码管上以动态方式显示数值。

顶层模块的代码如下:

1 module top_seg_led(
2 //global clock
3 input sys_clk , // 全局时钟信号
4 input sys_rst_n, // 复位信号(低有效)
5 
6 //seg_led interface
7 output [5:0] seg_sel , // 数码管位选信号
8 output [7:0] seg_led // 数码管段选信号
9 );
10 
11 //wire define
12 wire [19:0] data; // 数码管显示的数值
13 wire [ 5:0] point; // 数码管小数点的位置
14 wire en; // 数码管显示使能信号
15 wire sign; // 数码管显示数据的符号位
16 
17 //*****************************************************
18 //** main code
19 //*****************************************************
20 
21 //计数器模块,产生数码管需要显示的数据
22 count u_count(
23 .clk (sys_clk ), // 时钟信号
24 .rst_n (sys_rst_n), // 复位信号
25 
26 .data (data ), // 6 位数码管要显示的数值
27 .point (point ), // 小数点具体显示的位置,高电平有效
28 .en (en ), // 数码管使能信号
29 .sign (sign ) // 符号位
30 );
31 
32 //数码管动态显示模块
33 seg_led u_seg_led(
34 .clk (sys_clk ), // 时钟信号
35 .rst_n (sys_rst_n), // 复位信号
36 
37 .data (data ), // 显示的数值
38 .point (point ), // 小数点具体显示的位置,高电平有效
39 .en (en ), // 数码管使能信号
40 .sign (sign ), // 符号位,高电平显示负号(-)
41 
42 .seg_sel (seg_sel ), // 位选
43 .seg_led (seg_led ) // 段选
44 );
45 
46 endmodule

顶层模块中主要完成对其余模块的例化,并且实现各模块之间信号的交互。计数模块输出的数data 连接至数码管显示模块的输入端口 data,数码管显示模块将输入的数据 data 输出至数码管上显示。

计数模块的代码如下所示:

1 module count(
2 //mudule clock
3 input clk , // 时钟信号
4 input rst_n, // 复位信号
5 
6 //user interface
7 output reg [19:0] data , // 6 个数码管要显示的数值
8 output reg [ 5:0] point, // 小数点的位置,高电平点亮对应数码管位上的小数点
9 output reg en , // 数码管使能信号
10 output reg sign // 符号位,高电平时显示负号,低电平不显示负号
11 );
12 
13 //parameter define
14 parameter MAX_NUM = 23'd5000_000; // 计数器计数的最大值
15 
16 //reg define
17 reg [22:0] cnt ; // 计数器,用于计时 100ms
18 reg flag; // 标志信号
19 
20 //*****************************************************
21 //** main code
22 //*****************************************************
23 
24 //计数器对系统时钟计数达 100ms 时,输出一个时钟周期的脉冲信号
25 always @ (posedge clk or negedge rst_n) begin
26 if (!rst_n) begin
27 cnt <= 23'b0;
28 flag<= 1'b0;
29 end
30 else if (cnt < MAX_NUM - 1'b1) begin
31 cnt <= cnt + 1'b1;
32 flag<= 1'b0;
33 end
34 else begin
35 cnt <= 23'b0;
36 flag <= 1'b1;
37 end
38 end
39 
40 //数码管需要显示的数据,从 0 累加到 999999
41 always @ (posedge clk or negedge rst_n) begin
42 if (!rst_n)begin
43 data <= 20'b0;
44 point <=6'b000000;
45 en <= 1'b0;
46 sign <= 1'b0;
47 end
48 else begin
49 point <= 6'b000000; //不显示小数点
50 en <= 1'b1; //打开数码管使能信号
51 sign <= 1'b0; //不显示负号
52 if (flag) begin //显示数值每隔 0.1s 累加一次
53 if(data < 20'd999999)
54 data <= data +1'b1; 
55 else
56 data <= 20'b0;
57 end
58 end
59 end
60 
61 endmodule

 数码管动态显示模块的代码如下:

1 module seg_led(
2 input clk , // 时钟信号
3 input rst_n , // 复位信号
4 
5 input [19:0] data , // 6 位数码管要显示的数值
6 input [5:0] point , // 小数点具体显示的位置,从高到低,高电平有效
7 input en , // 数码管使能信号
8 input sign , // 符号位(高电平显示“-”号)
9 
10 output reg [5:0] seg_sel, // 数码管位选,最左侧数码管为最高位
11 output reg [7:0] seg_led // 数码管段选
12 );
13 
14 //parameter define
15 localparam CLK_DIVIDE = 4'd10 ; // 时钟分频系数
16 localparam MAX_NUM = 13'd5000 ; // 对数码管驱动时钟(5MHz)计数 1ms 所需的计数值
17 
18 //reg define
19 reg [ 3:0] clk_cnt ; // 时钟分频计数器
20 reg dri_clk ; // 数码管的驱动时钟,5MHz
21 reg [23:0] num ; // 24 位 bcd 码寄存器
22 reg [12:0] cnt0 ; // 数码管驱动时钟计数器
23 reg flag ; // 标志信号(标志着 cnt0 计数达 1ms)
24 reg [2:0] cnt_sel ; // 数码管位选计数器
25 reg [3:0] num_disp ; // 当前数码管显示的数据
26 reg dot_disp ; // 当前数码管显示的小数点
27 
28 //wire define
29 wire [3:0] data0 ; // 个位数
30 wire [3:0] data1 ; // 十位数
31 wire [3:0] data2 ; // 百位数
32 wire [3:0] data3 ; // 千位数
33 wire [3:0] data4 ; // 万位数
34 wire [3:0] data5 ; // 十万位数
35 
36 //*****************************************************
37 //** main code
38 //*****************************************************
39 
40 //提取显示数值所对应的十进制数的各个位
41 assign data0 = data % 4'd10; // 个位数
42 assign data1 = data / 4'd10 % 4'd10 ; // 十位数
43 assign data2 = data / 7'd100 % 4'd10 ; // 百位数
44 assign data3 = data / 10'd1000 % 4'd10 ; // 千位数
45 assign data4 = data / 14'd10000 % 4'd10; // 万位数
46 assign data5 = data / 17'd100000; // 十万位数
47 
48 //对系统时钟 10 分频,得到的频率为 5MHz 的数码管驱动时钟 dri_clk
49 always @(posedge clk or negedge rst_n) begin
50 if(!rst_n) begin
51 clk_cnt <= 4'd0;
52 dri_clk <= 1'b1;
53 end
54 else if(clk_cnt == CLK_DIVIDE/2 - 1'd1) begin
55 clk_cnt <= 4'd0;
56 dri_clk <= ~dri_clk;
57 end
58 else begin
59 clk_cnt <= clk_cnt + 1'b1;
60 dri_clk <= dri_clk;
61 end
62 end
63 
64 //将 20 位 2 进制数转换为 8421bcd 码(即使用 4 位二进制数表示 1 位十进制数)
65 always @ (posedge dri_clk or negedge rst_n) begin
66 if (!rst_n)
67 num <= 24'b0;
68 else begin
69 if (data5 || point[5]) begin //如果显示数据为 6 位十进制数,
70 num[23:20] <= data5; //则依次给 6 位数码管赋值
71 num[19:16] <= data4;
72 num[15:12] <= data3;
73 num[11:8] <= data2;
74 num[ 7:4] <= data1;
75 num[ 3:0] <= data0;
76 end
77 else begin 
78 if (data4 || point[4]) begin //如果显示数据为 5 位十进制数,则给低 5 位数码管赋
值
79 num[19:0] <= {data4,data3,data2,data1,data0};
80 if(sign) 
81 num[23:20] <= 4'd11; //如果需要显示负号,则最高位(第 6 位)为符号位
82 else
83 num[23:20] <= 4'd10; //不需要显示负号时,则第 6 位不显示任何字符
84 end
85 else begin //如果显示数据为 4 位十进制数,则给低 4 位数码管赋
值
86 if (data3 || point[3]) begin
87 num[15: 0] <= {data3,data2,data1,data0};
88 num[23:20] <= 4'd10; //第 6 位不显示任何字符
89 if(sign) //如果需要显示负号,则最高位(第 5 位)为符号位
90 num[19:16] <= 4'd11;
91 else //不需要显示负号时,则第 5 位不显示任何字符
92 num[19:16] <= 4'd10;
93 end
94 else begin //如果显示数据为 3 位十进制数,则给低 3 位数码管赋
值
95 if (data2 || point[2]) begin
96 num[11: 0] <= {data2,data1,data0};
97 //第 6、5 位不显示任何字符
98 num[23:16] <= {2{4'd10}};
99 if(sign) //如果需要显示负号,则最高位(第 4 位)为符号位
100 num[15:12] <= 4'd11;
101 else //不需要显示负号时,则第 4 位不显示任何字符
102 num[15:12] <= 4'd10;
103 end
104 else begin //如果显示数据为 2 位十进制数,则给低 2 位数码管赋
值
105 if (data1 || point[1]) begin
106 num[ 7: 0] <= {data1,data0};
107 //第 6、5、4 位不显示任何字符
108 num[23:12] <= {3{4'd10}};
109 if(sign) //如果需要显示负号,则最高位(第 3 位)为符号位
110 num[11:8] <= 4'd11;
111 else //不需要显示负号时,则第 3 位不显示任何字符
112 num[11:8] <= 4'd10;
113 end
114 else begin //如果显示数据为 1 位十进制数,则给最低位数码管赋
值
115 num[3:0] <= data0;
116 //第 6、5 位不显示任何字符
117 num[23:8] <= {4{4'd10}};
118 if(sign) //如果需要显示负号,则最高位(第 2 位)为符号位
119 num[7:4] <= 4'd11;
120 else //不需要显示负号时,则第 2 位不显示任何字符
121 num[7:4] <= 4'd10;
122 end
123 end
124 end
125 end
126 end
127 end
128 end
129
130 //每当计数器对数码管驱动时钟计数时间达 1ms,输出一个时钟周期的脉冲信号
131 always @ (posedge dri_clk or negedge rst_n) begin
132 if (rst_n == 1'b0) begin
133 cnt0 <= 13'b0;
134 flag <= 1'b0;
135 end
136 else if (cnt0 < MAX_NUM - 1'b1) begin
137 cnt0 <= cnt0 + 1'b1;
138 flag <= 1'b0;
139 end
140 else begin
141 cnt0 <= 13'b0;
142 flag <= 1'b1;
143 end
144 end
145
146 //cnt_sel 从 0 计数到 5,用于选择当前处于显示状态的数码管
147 always @ (posedge dri_clk or negedge rst_n) begin
148 if (rst_n == 1'b0)
149 cnt_sel <= 3'b0;
150 else if(flag) begin
151 if(cnt_sel < 3'd5)
152 cnt_sel <= cnt_sel + 1'b1;
153 else
154 cnt_sel <= 3'b0;
155 end
156 else
157 cnt_sel <= cnt_sel;
158 end
159
160 //控制数码管位选信号,使 6 位数码管轮流显示
161 always @ (posedge dri_clk or negedge rst_n) begin
162 if(!rst_n) begin
163 seg_sel <= 6'b111111; //位选信号低电平有效
164 num_disp <= 4'b0; 
165 dot_disp <= 1'b1; //共阳极数码管,低电平导通
166 end
167 else begin
168 if(en) begin
169 case (cnt_sel)
170 3'd0 :begin
171 seg_sel <= 6'b111110; //显示数码管最低位
172 num_disp <= num[3:0] ; //显示的数据
173 dot_disp <= ~point[0]; //显示的小数点
174 end
175 3'd1 :begin
176 seg_sel <= 6'b111101; //显示数码管第 1 位
177 num_disp <= num[7:4] ;
178 dot_disp <= ~point[1];
179 end
180 3'd2 :begin
181 seg_sel <= 6'b111011; //显示数码管第 2 位
182 num_disp <= num[11:8];
183 dot_disp <= ~point[2];
184 end
185 3'd3 :begin
186 seg_sel <= 6'b110111; //显示数码管第 3 位
187 num_disp <= num[15:12];
188 dot_disp <= ~point[3];
189 end
190 3'd4 :begin
191 seg_sel <= 6'b101111; //显示数码管第 4 位
192 num_disp <= num[19:16];
193 dot_disp <= ~point[4];
194 end
195 3'd5 :begin
196 seg_sel <= 6'b011111; //显示数码管最高位
197 num_disp <= num[23:20];
198 dot_disp <= ~point[5];
199 end
200 default :begin
201 seg_sel <= 6'b111111;
202 num_disp <= 4'b0;
203 dot_disp <= 1'b1;
204 end
205 endcase
206 end
207 else begin
208 seg_sel <= 6'b111111; //使能信号为 0 时,所有数码管均不显示
209 num_disp <= 4'b0;
210 dot_disp <= 1'b1;
211 end
212 end
213 end
214
215 //控制数码管段选信号,显示字符
216 always @ (posedge dri_clk or negedge rst_n) begin
217 if (!rst_n)
218 seg_led <= 8'hc0;
219 else begin
220 case (num_disp)
221 4'd0 : seg_led <= {dot_disp,7'b1000000}; //显示数字 0
222 4'd1 : seg_led <= {dot_disp,7'b1111001}; //显示数字 1
223 4'd2 : seg_led <= {dot_disp,7'b0100100}; //显示数字 2
224 4'd3 : seg_led <= {dot_disp,7'b0110000}; //显示数字 3
225 4'd4 : seg_led <= {dot_disp,7'b0011001}; //显示数字 4
226 4'd5 : seg_led <= {dot_disp,7'b0010010}; //显示数字 5
227 4'd6 : seg_led <= {dot_disp,7'b0000010}; //显示数字 6
228 4'd7 : seg_led <= {dot_disp,7'b1111000}; //显示数字 7
229 4'd8 : seg_led <= {dot_disp,7'b0000000}; //显示数字 8
230 4'd9 : seg_led <= {dot_disp,7'b0010000}; //显示数字 9
231 4'd10: seg_led <= 8'b11111111; //不显示任何字符
232 4'd11: seg_led <= 8'b10111111; //显示负号(-)
233 default:
234 seg_led <= {dot_disp,7'b1000000};
235 endcase
236 end
237 end
238
239 endmodule




数码管动态显示模块不仅可以将数值显示在数码管上,而且可以控制小数点的显示以及显示负数。数 码管驱动模块没有在高位填充“0”,除非该位显示小数点。结合第 131 行开始的 always 语句块可知,cnt 每 1ms 的时间变化一次;而从第 161 行的 case 语句块可知,cnt 控制数码管的位选和段选。下图为该模块运 行时 SignalTapII 抓取到的波形图:


下载验证:

 

功能正常

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

值得收藏的30道Python基础练手题(附详解)

今天给大家分享30道Python练习题&#xff0c;建议大家先独立思考一下解题思路&#xff0c;再查看答案。 1. 已知一个字符串为 “hello_world_JMzz”&#xff0c;如何得到一个队列 [“hello”,”world”,”JMzz”] &#xff1f; 使用 split 函数&#xff0c;分割字符串&…

ESP8266 ArduinoIDE 闪存文件操作系统

一、闪存文件系统基本操作 esp8266 的采用 SPIFFS 嵌入式文件系统&#xff0c;在内部 Flash 为 4M&#xff0c;其中 1M 用于存储程序&#xff0c;其他的空间有一部分用于系统&#xff0c;3M 中剩下的大部分空间可以用来存放文件。 其中这个空间大小是可以自定义的&#xff0c;…

【Node.js实战】一文带你开发博客项目之安全(sql注入、xss攻击、md5加密算法)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端 &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;秋招&#xff09; &#x1f680;未…

Netty进阶

三. Netty 进阶 1. 粘包与半包 1.1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log LoggerFactory.getLogger(HelloWorldServer.class);void start() {NioEventLoopGroup boss new NioEventLoopGroup(1);NioEventLoopGroup worker new Ni…

想要全面了解DevOps,从概念、实现相关工具到如何落地,看这篇就够了

我们总是在提DevOps&#xff0c;敏捷管理&#xff0c;但大家未必真的明白什么是DevOps。本文是将向大家介绍到底什么是DevOps&#xff0c;DevOps的初衷到底是为了解决什么问题&#xff1f;它能够如何实现&#xff1f;能够带来哪些价值&#xff1f;来让大家对DevOps有一个全面的…

Vscode++Opencv+Anaconda+Python安装教程

最近在学习opencv的时候vscode一直报这个错&#xff1a; Import “cv2” could not be resolved Pylance (reportMissingImports) 但是在Jupyter上面可以运行&#xff0c;一直没找到解决方法&#xff0c;无奈只好重装。 一&#xff1a;安装AnacondaPython 进入Anaconda官网 w…

计网必会:封装、协议、解封装

文章目录解释什么是封装什么是协议解封装是啥封装过程拓展知识需要了解解释 什么是封装 封装就是给初始的数据增加“数据”&#xff0c;让原始数据的信息量扩大&#xff0c;方便层与层间的交流&#xff0c;所谓封装&#xff0c;就是包装的意思&#xff0c;中文博大精深哈哈哈…

03.指针的进阶2.练习题(重点)

1.指针和数组笔试题解析 //1. sizeof(数组名)&#xff0c;数组名表示整个数组。计算的是整个数组的大小,单位是字节 //2. &数组名&#xff0c;数组名表示整个数组。取出的是整个数组的地址 //除此之外&#xff0c;所有的数组名都是数组首元素的地址 EG1:整型 int main…

爬虫学习笔记

目录一、Python基础知识回顾1、pip下载源2、pycharm设置作者信息3、python注释4、变量4.1 类型转换二、Urllib使用一、Python基础知识回顾 1、pip下载源 pip install python包默认是从 https://files.pythonhosted.org/ 网站&#xff08;国外网站&#xff09;上下载&#xff…

CV【3】:drop_out drop_path

文章目录前言1. drop_out1.1. 出现的原因1.2. 概念1.3. 工作原理1.4. 尺度匹配问题1.5. 有效缓解过拟合的原因1.6. 代码实现2. drop_path2.1. 与 drop_out 的差异2.2. 工作原理2.3. 在网络中的应用2.4. 代码实现前言 本文主要对比了两种正则化方法&#xff1a;drop_out 和 dro…

Javascript 组合模式

组合模式 简介 组合模式将对象组合成树形结构&#xff0c;以表示“部分-整体”的层次结构。除了用来表示树形结构之外&#xff0c;组合模式的另一个好处是通过对象的多态性表现&#xff0c;使得用户对单个对象和组合对象的使用具有一致性 请求在树中传递的过程 在组合模式中&…

Express框架连接MySQL数据库操作

在上一篇中已经在Node.js中引入使用了mysql模块进行数据库的基本操作&#xff0c;在本篇当中在Express框架中来连接数据库以及操作数据库&#xff1b; Express 项目环境 这里是通过全局安装Express框架生产的项目环境&#xff0c;也可以通过局部安装的方式&#xff0c;安装过程…

同济子豪兄带我学pytorch图像分类-task01(数据集准备)

学习准备&#xff1a; 本机配置环境的过程很繁琐&#xff0c;考虑时间的问题&#xff0c;直接租一个云服务器。 学习过程中代码没有出现任何问题&#xff0c;代码具有很高的时效性。竟然没有一个语法报错。 所有图片均来源于网络&#xff0c;若有侵犯&#xff0c;多有抱歉 …

Kubernetes 1.25.4版本安装

Kubernetes 1.25.4版本安装 1 配置 1.1 环境介绍 OS&#xff1a;CentOS Linux release 8.5.2111 机器: IPhostname10.104.10.201k8s-master10.104.10.202k8s-node110.104.10.203k8s-node2 所有机器&#xff0c;都将yum源改为国内阿里云开源镜像源 cd /etc/yum.repos.d/ m…

Rockchip开发系列 - 9.watchdog看门狗开发

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 dts中的watchdog节点watchdog驱动文件TRM watchdog:WDT框图功能描述计数器中断系统复位复位脉冲长度操作流程图寄存器描述寄存器设置…

【GD32F427开发板试用】点亮WS2812B炫彩灯环

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;HonestQiao 我有一个WS2812B炫彩灯环&#xff0c;搭配精选的背景&#xff0c;非常出镜&#xff1a; 在玩过的板子上&#xff0c;我都要把它点亮…

算法之美~堆

如何理解“堆”堆是一种特殊的树&#xff0c;只要满足如下两点&#xff1a;堆是一个完全二叉树&#xff1b;堆中每个节点的值都必须>&#xff08;或<&#xff09;其子树中每个节点的值。大顶堆&#xff1a;每个节点的值都>子树中每个节点的值&#xff1b;小顶堆&#…

完美的Pornhub风格的Logo生成器,在线工具

pornhub是全球最大的Sex影片分享网站之一。于2007年成立于加拿大蒙特利尔&#xff0c;是属于大型的色情视频分享类网站&#xff0c;被视为是“Sex2.0”的先驱&#xff0c;在Alexa上排名第80位&#xff08;最高时曾跻身前30&#xff09;。 同样这个网站的logo风格也别具一格&am…

C 程序设计教程(17)—— 循环结构程序设计练习题

C 程序设计教程&#xff08;17&#xff09;—— 循环结构程序设计练习题 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;17…

3DMAX砖墙神器WallBuilder:快速生成常见砖墙插件教程

3DMAX一键快速生成砖墙插件&#xff08;3DMAX砖墙神器——快速常见砖墙&#xff09;WallBuilder&#xff0c;用来生成各种砖砌或石砌墙体、地面的插件。 【主要特性】 -偏移以将不同的墙放在一起&#xff1b; -可以按照样条曲线创建墙&#xff1b; -随机化砖块的随机函数&am…