蓝桥杯嵌入式竞赛-数码管学习笔记(个人备份,以便日后查找)

本文详细介绍了74HC595芯片的原理和使用,包括数码管的工作原理,74HC595的时序图解析,以及数码管驱动编码的逆序操作。内容涵盖5161AS数码管引脚图和74HC595的电路设计要点,同时提供了三位数码管显示的驱动代码参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、硬件原理

1.1 数码管

5161AS数码管引脚图:

5161AS数码管原理图:

1.2 74HC595芯片

《74HC595芯片介绍和使用详解》:

74HC595芯片介绍和使用详解【干货】_枉少年不纯洁的博客-CSDN博客_74hc595^v9^control,157^v4^control&utm_term=74hc595&spm=1018.2226.3001.4187

注:74HC595与74ls595是两种不同的芯片,前者为CMOS电路,后者为TTL电路。74ls595是简单的数据分配器,不需要CP脉冲,也不需要同步;74HC595需要同步传输。在实际工作原理和驱动程序上,两者区别不大。

时序图:

 图片来源:74系列595芯片使用详解(包含电路设计要点与驱动程序示例)_Naisu Xu的博客-CSDN博客_74ls595

二.编码说明

2.1 数码管驱动编码

八位二进制数据控制一个数码管,从高位到低位依次控制h、g、f、e、d、c、b、a,1亮0熄。

逆序编码原因:最先进入移位寄存器的数据为控制最后一个LED的信号,因此需逆序编码。当全部数据写入驱动芯片,并经过移位寄存器移位后,各位数据将是顺序排列。

2.2十六进制数编码参考

Seg7[17] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};//依次为 0、1、2、3、4、5、6、7、8、9、A,b,C,d,E,F,空

三、驱动代码参考

3.4 三位数码管显示驱动参考代码

void SEG_DisplayValue(u8 Bit1,  u8 Bit2, u8 Bit3)
{
    u8 i = 0;
    u8 code_tmp = 0;
    RCLK_L;//存储寄存器时钟置0
    code_tmp = Seg7[Bit3];//最低位数码管数据应首先写入,原因同“逆序编码原因”
​
    for(i = 0; i < 8; i++)
    {
        SCK_L;
        if(code_tmp & 0x80)
        {
            SER_H;
        }
        else
        {
            SER_L;
        }
​
        code_tmp = code_tmp << 1;
        SCK_L;
        SCK_H;//移位寄存器时钟置1,将高位数据向低位移一位
    }
​
    code_tmp = Seg7[Bit2];
    for(i = 0; i < 8; i++)
    {
        SCK_L;
        if(code_tmp & 0x80)
        {
            SER_H;
        }
        else
        {
            SER_L;
        }
​
        code_tmp = code_tmp << 1;
        SCK_L;
        SCK_H;
​
    }
​
    code_tmp = Seg7[Bit1];
    for(i = 0; i < 8; i++)
    {
        SCK_L;
        if(code_tmp & 0x80)
        {
            SER_H;
        }
        else
        {
            SER_L;
        }
​
        code_tmp = code_tmp << 1;
        SCK_L;
        SCK_H;
​
    }
​
    RCLK_L;
    RCLK_H;//存储寄存器时钟置1,将移位寄存器数据逐位写入存储寄存器并从输出引脚输出
}
### 蓝桥杯数码管模板代码与解题思路 在蓝桥杯竞赛中,数码管的应用通常涉及硬件电路设计以及软件编程实现。以下是基于已知引用内容和专业知识整理的数码管相关代码模板及其解释。 #### 数码管工作原理概述 蓝桥杯使用的数码管为共阳极结构,其位选端用于指定点亮的是哪一个数码管,而段选端则决定具体显示的内容。为了使某个数码管上的特定数字亮起,需将该数码管的位选设置为高电平,同时将其对应的段选设为低电平[^1]。 --- #### 数码管驱动代码模板 以下是一个完整的数码管驱动程序模板: ```c #include <stc15f2k60s2.h> // 使用STC单片机头文件 #define uchar unsigned char // 定义数码管字模表 (对应0~9) uchar code tab[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; void delay() { int i, j; for (i = 0; i < 600; i++) // 延时函数 for (j = 0; j < 600; j++); } void display_digit(uchar digit) { P2 = 0xC0; // 设置位选信号,选择第一个数码管 DS1 P0 = ~tab[digit]; // 将字模取反后送至段选口(因共阳极) delay(); // 添加延时以便观察效果 P0 = 0xFF; // 清除段选数据 } ``` 上述代码实现了通过`display_digit()`函数动态更新数码管显示的功能。其中,`P2`负责控制位选信号,`P0`负责发送段选数据。由于采用共阳极数码管,因此需要对字模值进行按位取反处理后再输出到段选接口[^3]。 --- #### 主循环逻辑示例 如果希望让数码管从0到9依次滚动显示,则可以编写如下主函数: ```c void main() { uchar i; P2 = 0xA0; // 初始化操作:关闭继电器、蜂鸣器等外设 P0 = 0x00; P2 = 0x80; P0 = 0xFF; P2 = 0xC0; // 初始状态:选择数码管DS1的第一个位置 P0 = 0x01; P2 = 0xFF; P0 = 0xFF; while (1) { // 循环显示0~9 for (i = 0; i < 10; i++) { display_digit(i); } } } ``` 此部分代码展示了如何利用无限循环来不断刷新数码管显示内容,并调用了之前定义好的子函数完成具体的数值转换过程。 --- #### 注意事项 - **代码范围限制**:按照比赛规定,在实际提交作品时应严格遵循官方给出的框架格式,仅允许修改`Begin`和`End`之间的区域[^2]。 - **硬件连接确认**:确保开发板上各引脚连线无误,特别是对于共阳极型数码管而言,务必注意高低电平关系。 - **优化建议**:可以通过查表方式进一步简化编码复杂度;另外还可以引入中断机制提高效率并减少资源占用率。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值