四汐 发表于 2025-4-20 23:02:49

2级74HC595D点亮8位数码管

<h1><strong>本篇学习74HC595D点亮8位共阴极数码</strong></h1>
<p><img src="data/attachment/forum/202504/20/221757kgig9g3mksgak3ge.png" alt="image.png" title="image.png" /></p>
<p><img src="data/attachment/forum/202504/20/221806hgstff2v2jhrissh.png" alt="image.png" title="image.png" /></p>
<h2>74HC595D简介</h2>
<p><strong>74HC595是一款串行输入,并行输出芯片,一个芯片内含有1个移位寄存器和1个存储寄存器,均为8位寄存器。</strong></p>
<table>
<thead>
<tr>
<th><strong>Q0</strong></th>
<th><strong>Q1</strong></th>
<th><strong>Q2</strong></th>
<th><strong>Q3</strong></th>
<th><strong>Q4</strong></th>
<th><strong>Q5</strong></th>
<th><strong>Q6</strong></th>
<th><strong>Q7</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>第8位数据</strong></td>
<td><strong>第7位数据</strong></td>
<td><strong>第6位数据</strong></td>
<td><strong>第5位数据</strong></td>
<td><strong>第4位数据</strong></td>
<td><strong>第3位数据</strong></td>
<td><strong>第2位数据</strong></td>
<td><strong>第1位数据</strong></td>
</tr>
</tbody>
</table>
<p><strong>其功能引脚如下:</strong></p>
<p><strong>DS:串行数据输入引脚</strong></p>
<p><strong>SH:移位寄存器时钟引脚,上升沿时,移位寄存器中的bit 数据整体后移,并接受新的bit(从DS输入)</strong></p>
<p><strong>ST:存储寄存器时钟输入。上升沿时,数据从移位寄存器转存到存储寄存器</strong></p>
<p><strong>Q7':当移位寄存器中的数据大于8bit时,最开始输入的bit将会从该引脚移出,可以用于595的级联</strong></p>
<p><strong>使用介绍:</strong></p>
<p><strong>当SH检测到上升沿时,会将DS引脚此时的数据保存到移位寄存器中,从Q0开始至Q7共8位数据,</strong></p>
<p><strong>若只使用1级595,此时应当给ST一个上升沿信号,将一字节数据从移位寄存器中保存到存储寄存器中,而Q0至Q7引脚将会输出对应的电平信号</strong></p>
<p><strong>若使用多级595,例如2级,当第9位数据进来时,1级595的首位数据将从 Q7' 引脚挤出,同过将该引脚与2级595的DS引脚相连,实现多级并联。</strong></p>
<h2>如何操作595点亮数码管</h2>
<p><strong>该设计使用2个595并联控制2个4位共阴极数码管,其中第一个595控制COM口,第二级595控制LED口</strong></p>
<p><strong>16bit数据对应关系如下:</strong></p>
<table>
<thead>
<tr>
<th align="center"></th>
<th>Q0</th>
<th>Q1</th>
<th>Q2</th>
<th>Q3</th>
<th>Q4</th>
<th>Q5</th>
<th>Q6</th>
<th>Q7</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center"><strong>高位</strong></td>
<td><strong>15</strong></td>
<td><strong>14</strong></td>
<td><strong>13</strong></td>
<td><strong>12</strong></td>
<td><strong>11</strong></td>
<td><strong>10</strong></td>
<td><strong>09</strong></td>
<td><strong>08</strong></td>
</tr>
<tr>
<td align="center"><strong>位</strong></td>
<td><strong>COM0</strong></td>
<td><strong>COM1</strong></td>
<td><strong>COM2</strong></td>
<td><strong>COM3</strong></td>
<td><strong>COM4</strong></td>
<td><strong>COM5</strong></td>
<td><strong>COM6</strong></td>
<td><strong>COM7</strong></td>
</tr>
<tr>
<td align="center"><strong>低位</strong></td>
<td><strong>07</strong></td>
<td><strong>06</strong></td>
<td><strong>05</strong></td>
<td><strong>04</strong></td>
<td><strong>03</strong></td>
<td><strong>02</strong></td>
<td><strong>01</strong></td>
<td><strong>00</strong></td>
</tr>
<tr>
<td align="center"><strong>段</strong></td>
<td><strong>LEDA</strong></td>
<td><strong>LEDB</strong></td>
<td><strong>LEDC</strong></td>
<td><strong>LEDD</strong></td>
<td><strong>LEDE</strong></td>
<td><strong>LEDF</strong></td>
<td><strong>LEDG</strong></td>
<td><strong>LEDH</strong></td>
</tr>
</tbody>
</table>
<p><strong>共阴极数码管,COM口为低电平,LED口为高电平,即可点亮</strong></p>
<p><strong>以点亮第一个数码管(从左往右),显示1为例,即8位码数码管显示 1NNN NNNN(N表示未点亮)</strong></p>
<p><strong>位码:1111 1110</strong>        <strong>(COM口为低电平)</strong></p>
<p><strong>段码:0000 0110</strong>        <strong>(LED口为高电平)</strong></p>
<p><img src="data/attachment/forum/202504/20/222029zwnd1u2s1dg2e0jj.png" alt="image.png" title="image.png" /></p>
<p><strong>位码为0xFE,段码为0x06,以MSB模式发送(即从最高位开始发送),</strong></p>
<p><strong>需要先发送8位段码0x06,此时不锁存,</strong></p>
<p><strong>再发送8位位码0xFE,将段码挤出到二级595中,此时再锁存。</strong></p>
<pre><code class="language-c">// 对应代码应该是这样的
HC595_ST = 0;   // 拉低存储时钟线
dat = 0x06;   // 先发段码
for ( i = 0; i &lt; 8; i++)
{
    HC595_SH = 0;         // 拉低数据时钟线
    HC595_DS = dat &amp; 0x80;// MSB 输出数据
    dat = _crol_(dat, 1);   // MSB 下一位数据
    HC595_SH = 1;         // 拉高数据时钟线,上升沿移位
}
dat = 0xfe;   // 再发位码
for ( i = 0; i &lt; 8; i++)
{
    HC595_SH = 0;         // 拉低数据时钟线
    HC595_DS = dat &amp; 0x80;// MSB 输出数据
    dat = _crol_(dat, 1);   // MSB 下一位数据
    HC595_SH = 1;         // 拉高数据时钟线,上升沿移位
}
HC595_ST = 1;   // 写完8bit数据,拉高数据时钟线将数据保存到595
</code></pre>
<p><img src="data/attachment/forum/202504/20/222249yhygqugqusftiawh.jpg" alt="964b1aa94708817ee51f7099cd1fb4d.jpg" title="964b1aa94708817ee51f7099cd1fb4d.jpg" /></p>
<h2>封装函数</h2>
<h3><em>向移位寄存器发送一字节数据</em></h3>
<p><img src="data/attachment/forum/202504/20/222259a6l1q919hl9yn2zz.png" alt="image.png" title="image.png" /></p>
<h3><em>向N个74HC595D发送数据</em></h3>
<p><img src="data/attachment/forum/202504/20/222308h6sth6clvvcl8cmt.png" alt="image.png" title="image.png" /></p>
<h3><em>对应数码管显示对应数据</em></h3>
<p><img src="data/attachment/forum/202504/20/222314n1kk01ll3lldl633.png" alt="image.png" title="image.png" /></p>
<h3><em>一位数码管显示一个字符</em></h3>
<p><img src="data/attachment/forum/202504/20/222320yqjtwh1zb0txp5h4.png" alt="image.png" title="image.png" /></p>
<h3><em>显示一串字符,从第1个数码管开始,最多显示前8位</em></h3>
<p><img src="data/attachment/forum/202504/20/222328thnu466jj86wa6w9.png" alt="image.png" title="image.png" /></p>
<h2>函数调用</h2>
<pre><code class="language-c">// 在主函数中调用显示一串字符的函数
sprintf(buff, &quot;a%.3fb&quot;, 123.4561);
SEG_Show_Str(buff);
</code></pre>
<p><img src="data/attachment/forum/202504/20/222403x6h3hyelwhv6ygew.jpg" alt="f8bc66b9e59078d4ad7539707c707af.jpg" title="f8bc66b9e59078d4ad7539707c707af.jpg" /></p>

四汐 发表于 2025-4-20 23:03:20


国芯人工智能 发表于 2025-4-20 23:03:00

74HC595D驱动8位共阴极数码管的实现

1. 74HC595D简介

74HC595D是一款串行输入、并行输出的移位寄存器芯片,内部包含一个8位移位寄存器和一个8位存储寄存器。其主要功能是将串行数据转换为并行输出,适用于需要扩展输出引脚的应用场景,如驱动数码管、LED矩阵等。

2. 74HC595D引脚功能
DS(Serial Data Input):串行数据输入引脚,用于接收串行数据。
SH(Shift Register Clock Input):移位寄存器时钟输入引脚,上升沿时,移位寄存器中的数据整体后移,并接收新的数据位。
ST(Storage Register Clock Input):存储寄存器时钟输入引脚,上升沿时,移位寄存器中的数据转存到存储寄存器。
Q0-Q7(Parallel Outputs):并行输出引脚,输出存储寄存器中的数据。
Q7'(Serial Data Output):串行数据输出引脚,当移位寄存器中的数据超过8位时,最早输入的数据位将从该引脚移出,可用于级联多个74HC595D。

3. 74HC595D工作原理

1. 数据移位:当SH引脚检测到上升沿时,DS引脚上的数据位被移入移位寄存器,从Q0开始依次填充至Q7。
2. 数据存储:当ST引脚检测到上升沿时,移位寄存器中的数据被转存到存储寄存器,Q0-Q7引脚输出相应的电平信号。
3. 级联操作:当使用多个74HC595D时,第一个74HC595D的Q7'引脚连接到第二个74HC595D的DS引脚,实现数据的级联传输。

4. 驱动8位共阴极数码管的实现

本设计使用两个74HC595D级联,分别控制8位共阴极数码管的COM口和LED口。具体实现步骤如下:

4.1 硬件连接
第一级74HC595D:控制数码管的COM口,Q0-Q7分别连接数码管的COM0-COM7。
第二级74HC595D:控制数码管的LED口,Q0-Q7分别连接数码管的段选信号(a-g, dp)。

4.2 数据格式

16位数据对应关系如下:

| 位 | 15 | 14 | 13 | 12 | 11 | 10 | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 | 00 |
|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|
| 功能 | COM7 | COM6 | COM5 | COM4 | COM3 | COM2 | COM1 | COM0 | a | b | c | d | e | f | g | dp |

4.3 操作步骤

1. 初始化:将SH和ST引脚置为低电平,确保数据移位和存储操作未开始。
2. 数据移位:
将16位数据按位从高位到低位依次通过DS引脚输入。
每输入一位数据,SH引脚产生一个上升沿,将数据位移入移位寄存器。
3. 数据存储:
当16位数据全部移入后,ST引脚产生一个上升沿,将移位寄存器中的数据转存到存储寄存器。
4. 输出控制:
第一级74HC595D的Q0-Q7输出控制数码管的COM口,选择需要点亮的数码管位。
第二级74HC595D的Q0-Q7输出控制数码管的段选信号,点亮相应的段。

4.4 动态扫描

由于共阴极数码管需要动态扫描显示,因此需要快速切换COM口和段选信号,以实现所有数码管的连续显示。具体步骤如下:

1. 选择COM口:通过第一级74HC595D选择需要点亮的数码管位。
2. 设置段选信号:通过第二级74HC595D设置该数码管需要点亮的段。
3. 延时:保持当前状态一段时间,确保数码管有足够的时间点亮。
4. 切换COM口:切换到下一个数码管位,重复上述步骤。

5. 总结

通过使用两个74HC595D级联,可以有效地控制8位共阴极数码管的显示。第一级74HC595D负责选择数码管位,第二级74HC595D负责控制段选信号。通过动态扫描的方式,可以实现所有数码管的连续显示。这种设计不仅节省了微控制器的IO口资源,还提高了系统的灵活性和可扩展性。

在实际应用中,需要注意数据的移位和存储时序,确保数据的正确传输和显示。此外,动态扫描的频率应适当,以避免数码管出现闪烁或亮度不均的现象。通过合理的设计和调试,可以实现稳定、可靠的数码管显示效果。

[本文内容由国芯人工智能辅助生成,仅供参考]
页: [1]
查看完整版本: 2级74HC595D点亮8位数码管