数码管动态扫描与锁存器应用详解

单片机学习笔记————51单片机实现数码管通过一二级菜单来设置数据的综合程序 一、使用proteus绘制简单的电路图,用于后续仿真 二、编写程序 /******************************************************************************************************************** ---- @Project: LED-74HC595 ---- @File: main.c ---- @Edit: ZHQ ---- @Version: V1.0 ---- @Creat.. 阅读详情

1. 数码管基础:从结构到显示原理

数码管是嵌入式系统中最常见的显示设备之一,无论是家用电器还是工业控制设备,都能看到它的身影。简单来说,数码管就是由多个LED灯组成的显示器件,通过控制不同LED的亮灭来显示数字或字符。

1.1 数码管的内部结构解析

一个标准的七段数码管实际上包含了8个LED发光二极管(包括小数点dp)。这些LED的阳极或阴极连接在一起,形成公共端,另一端则独立引出。根据公共端的不同,分为共阳极和共阴极两种类型。

共阳极数码管的所有LED阳极连接在一起接VCC,阴极独立控制。当某个阴极引脚被赋予低电平时,对应的LED段就会点亮。相反,共阴极则是所有阴极连接在一起接地,阳极独立控制,需要高电平来点亮。

在实际项目中,我更喜欢使用共阳极数码管,因为大多数单片机IO口的拉电流能力比灌电流强,这样驱动起来更稳定。不过具体选择哪种,还要看硬件电路的设计。

1.2 段码与位码:显示控制的核心概念

段码(Segment Code)决定了数码管显示什么内容。每个段码对应一个8位二进制数,每一位控制一个LED段的亮灭。比如数字"0"的段码是0x3F(二进制00111111),表示a、b、c、d、e、f段点亮,g段和dp段熄灭。

位码(Digit Code)则控制多位数码管中哪一位被选中。在六位数码管模块中,位码通常是一个6位的控制信号,某位为0表示选中对应的数码管,为1则不选中。

我记得刚开始接触时经常混淆段码和位码,后来想了个简单的记忆方法:段码管"显示什么",位码管"在哪里显示"。就像写字一样,段码是写的字,位码是写在哪个格子里。

1.3 常用段码表与位码表

在实际编程中,我们通常会预先定义好段码和位码的数组。对于共阳极数码管,数字0-9的段码通常是:

unsigned char Seg_Dula[] = {
    0x3F, // 0
    0x06, // 1
    0x5B, // 2
    0x4F, // 3
    0x66, // 4
    0x6D, // 5
    0x7D, // 6
    0x07, // 7
    0x7F, // 8
    0x6F  // 9
};

位码数组根据硬件连接方式而定,对于常见的六位数码管:

unsigned char Seg_Wela[] = {
    0xFE, // 11111110 - 第0位
    0xFD, // 11111101 - 第1位
    0xFB, // 11111111 - 第2位
    0xF7, // 11110111 - 第3位
    0xEF, // 11101111 - 第4位
    0xDF  // 11011111 - 第5位
};

这些数组在实际使用中可能需要根据具体的硬件连接进行调整。我第一次做项目时就因为位码顺序反了,显示的数字全是反的,调试了好久才发现问题。

2. 硬件连接与锁存器应用

2.1 开发板硬件连接详解

在蓝桥杯开发板上,数码管的连接方式很有代表性。P0口用作数据口,同时为段码和位码提供数据。P2_6和P2_7分别控制段码锁存器和位码锁存器。

这种设计很好地解决了IO口资源有限的问题。通过两个锁存器,我们只需要8个数据口和2个控制口就能驱动6位数码管,如果不这样设计,可能需要6×8=48个IO口,这对大多数单片机来说都是不可想象的。

在实际接线时,一定要注意锁存器芯片的型号和引脚定义。常用的74HC573锁存器有20个引脚,包括8个数据输入、8个数据输出、使能端和锁存控制端。接错线可能导致整个显示系统无法工作,我有一次就把使能端接错了,结果数码管完全不亮,排查了半天才发现问题。

2.2 锁存器的工作原理与时机

锁存器在数码管驱动中起着至关重要的作用。它可以在控制信号变化时锁存当前的数据状态,从而保持输出稳定。

当锁存器的控制端为高电平时,输入端的任何变化都会直接反映到输出端,这时候锁存器处于"透明"状态。当控制端从高电平变为低电平时,输出端会锁存当前的数据状态,之后输入端的变化不会再影响输出。

这个特性对于数码管显示特别重要。我们可以先设置好要显示的数据,然后通过控制信号的变化将数据锁存,这样单片机就可以去处理其他任务,而不需要一直维持数据信号。

// 典型的锁存器操作序列
P0 = data;      // 准备要锁存的数据
LATCH = 1;      // 打开锁存器,数据通过
LATCH = 0;      // 锁存数据,输出保持稳定

2.3 消除残影的关键技术

残影是数码管显示中常见的问题,表现为当前显示的内容受到之前显示内容的影响。产生残影的主要原因是段码和位码的变化不同步。

消除残影最有效的方法是在切换位选信号前,先清除段码数据。具体操作顺序是:先关闭所有段的显示,然后切换到位选,最后再设置新的段码。

void Seg_Disp(unsigned char wela, unsigned char dula) {
    // 1. 消影:先清空段选
    P0 = 0x00;     // 所有段都熄灭
    P2_6 = 1;      // 打开段选锁存器
    P2_6 = 0;      // 锁存清空数据
    
    // 2. 设置位选
    P0 = Seg_Wela[wela];
    P2_7 = 1;
    P2_7 = 0;
    
    // 3. 设置段选
    P0 = Seg_Dula[dula];
    P2_6 = 1;
    P2_6 = 0;
}

这个顺序很重要,我曾经试过不同的顺序,发现只有按照清空→位选→段选的顺序才能完全消除残影。如果先设置段选再设置位选,或者不清空直接设置,都会出现明显的残影现象。

3. 动态扫描原理与实现

3.1 视觉暂留与动态显示基础

动态扫描利用了人眼的视觉暂留特性——人眼在看到的物体消失后,影像还会保留约0.1秒的时间。通过快速切换显示不同的数码管,只要切换速度足够快(通常大于50Hz),人眼就会认为所有数码管同时在显示。

实际上,单片机在任何时刻只点亮一位数码管。通过定时器控制,以一定的频率依次点亮各位数码管。比如对于6位数码管,如果刷新率要达到60Hz,那么每位数码管的点亮频率就是6×60=360Hz,即每位数码管点亮约2.8ms。

这种分时复用的方式大大节省了硬件资源,但也要注意每个数码管的实际亮度会降低。因为每位只有1/6的时间被点亮,所以需要适当增加驱动电流来保证亮度。我一般会通过调整限流电阻来优化显示效果,通常选择100-200欧姆的电阻。

3.2 定时器配置与中断设置

精确的定时是动态扫描成功的关键。我们使用定时器来产生精确的时间间隔,确保每位数码管点亮的时间一致。

以STC15系列单片机为例,配置定时器0为1ms中断:

void Timer0Init(void) {
    TMOD &= 0xF0;     // 清除T0的控制位
    TMOD |= 0x01;     // 设置T0为模式1(16位定时器)
    TL0 = 0x18;       // 设置定时初值低字节
    TH0 = 0xFC;       // 设置定时初值高字节
    TF0 = 0;          // 清除溢出标志
    TR0 = 1;          // 启动定时器0
    ET0 = 1;          // 允许定时器0中断
    EA = 1;           // 开启全局中断
}

这里的时间计算很重要:12MHz晶振下,机器周期为1μs。定时1ms需要1000个机器周期。定时器从初值开始向上计数,所以初值=65536-1000=64536=0xFC18。

我第一次配置时忘了计算初值,直接用了示例代码的值,结果时间完全不对。后来才明白不同的晶振频率需要重新计算定时初值。

3.3 中断服务程序编写

中断服务程序是动态扫描的核心,这里要完成数码管的切换显示:

unsigned char Seg_Pos = 0; // 当前扫描位置
unsigned char Seg_Buf[6] = {10,10,10,10,10,10}; // 显示缓冲区

void Timer0_ISR() interrupt 1 {
    // 重装定时初值
    TL0 = 0x18;
    TH0 = 0xFC;
    
    // 更新扫描位置
    if(++Seg_Pos >= 6)
        Seg_Pos = 0;
    
    // 显示当前位数码管
    Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos]);
}

中断服务程序要尽量保持简短,因为单片机在中断中会暂停主程序的执行。我曾经在中断中做了太多计算,导致主程序响应变慢,后来把计算都移到主循环中,只在中中断中做最简单的显示更新。

Seg_Buf数组是显示缓冲区,主程序只需要更新这个数组的内容,中断程序会自动负责显示。这种设计实现了显示与业务逻辑的分离,是嵌入式系统中常用的设计模式。

4. 实际应用与优化技巧

4.1 多位数码管显示实践

让我们来实现一个实际应用:在6位数码管上显示"123456":

void main() {
    Timer0Init(); // 初始化定时器
    
    // 初始化显示缓冲区
    Seg_Buf[0] = 1;
    Seg_Buf[1] = 2;
    Seg_Buf[2] = 3;
    Seg_Buf[3] = 4;
    Seg_Buf[4] = 5;
    Seg_Buf[5] = 6;
    
    while(1) {
        // 主循环可以处理其他任务
        // 显示由中断自动完成
    }
}

看起来很简单,对吧?但这里有个常见的陷阱:显示数字和段码索引的对应关系。Seg_Buf中存储的是要显示的数字,而Seg_Dula数组的索引正好对应数字0-9,所以直接赋值即可。

如果需要显示特殊字符或者控制小数点,就需要扩展段码表。比如要显示带小数点的数字,可以定义两套段码表,或者使用位运算来添加小数点:

// 显示数字5带小数点
Seg_Buf[2] = 5;
// 如果需要控制小数点,可以修改段码表或使用特殊值

4.2 亮度调节与功耗优化

动态扫描的数码管亮度可以通过两种方式调节:改变限流电阻或调整点亮时间。改变电阻会影响所有段的亮度,而调整点亮时间可以实现更精细的控制。

一种常见的亮度调节方法是调整每位数码管的点亮时间。我们可以在中断程序中加入亮度控制:

unsigned char brightness = 5; // 亮度等级0-10

void Timer0_ISR() interrupt 1 {
    static unsigned char counter = 0;
    
    TL0 = 0x18;
    TH0 = 0xFC;
    
    if(counter++ >= brightness) {
        counter = 0;
        if(++Seg_Pos >= 6)
            Seg_Pos = 0;
        Seg_Disp(Seg_Pos, Seg_Buf[Seg_Pos]);
    } else {
        // 在亮度较低时,部分时间不显示,降低亮度
        P0 = 0x00;
        P2_6 = 1;
        P2_6 = 0;
    }
}

这种方法虽然简单,但可能会造成闪烁。更好的方法是使用PWM控制每个段的亮度,但这需要更复杂的硬件支持。

功耗方面,动态扫描本身比静态显示更省电,因为同一时间只有部分LED点亮。进一步降低功耗的方法包括:降低扫描频率(但不能低于50Hz)、减少同时点亮的段数、在不需要显示时完全关闭数码管等。

4.3 抗干扰与稳定性提升

在实际工业环境中,电磁干扰可能会影响数码管的显示效果。以下是一些提高稳定性的经验:

首先要加强电源滤波,在每个锁存器芯片的VCC和GND之间添加0.1μF的去耦电容,距离芯片越近越好。我曾经遇到过显示乱跳的问题,后来在每个锁存器旁边加了去耦电容就解决了。

其次,信号线上可以串联小电阻(22-100欧姆)来抑制振铃和过冲。特别是当连接线较长时,这种措施很有效。

软件方面,可以增加看门狗定时器,防止程序跑飞。还可以定期刷新显示缓冲区,防止内存错误导致显示异常。

void check_display_buffer() {
    for(int i = 0; i < 6; i++) {
        if(Seg_Buf[i] > 10) { // 如果数据异常
            Seg_Buf[i] = 10;  // 重置为全灭
        }
    }
}

这些措施虽然简单,但在严苛的工业环境中却能大大提高系统的可靠性。我在一个工业控制项目中就遇到了内存偶尔被干扰的情况,加入这些检查后,显示系统再没有出现过异常。

5. 高级应用与扩展功能

5.1 按键输入与显示交互

现在让我们实现一个更复杂的应用:通过按键控制数码管显示的内容。假设我们有三个按键,分别用于增加、减少和确认数值。

unsigned int value = 0;    // 当前值
unsigned char position = 0; // 编辑位置

void main() {
    Timer0Init();
    
    while(1) {
        // 检测按键输入
        if(key_add_pressed()) {
            if(position < 6) {
                // 增加当前位的值
                Seg_Buf[position] = (Seg_Buf[position] + 1) % 10;
            }
            delay_ms(200); // 简单去抖
        }
        
        if(key_sub_pressed()) {
            if(position < 6) {
                // 减少当前位的值
                Seg_Buf[position] = (Seg_Buf[position] + 9) % 10;
            }
            delay_ms(200);
        }
        
        if(key_enter_pressed()) {
            position = (position + 1) % 7; // 6位数字+1个结束位
            delay_ms(200);
        }
        
        // 如果正在编辑,让当前编辑位闪烁提示
        if(position < 6) {
            // 每500ms切换一次显示状态
            static unsigned int flash_counter = 0;
            if(++flash_counter >= 500) {
                flash_counter = 0;
                Seg_Buf[position] = (Seg_Buf[position] == 10) ? 
                                  saved_value[position] : 10;
            }
        }
    }
}

这个例子展示了如何实现一个简单的数字设置界面。通过让当前编辑位闪烁,提供了良好的用户反馈。在实际项目中,这种交互方式很常见,比如电子钟的时间设置、温控器的温度设定等。

5.2 多级菜单与状态显示

对于更复杂的系统,数码管可以显示多级菜单和状态信息。我们可以设计一个状态机来管理显示内容:

enum DisplayState {
    STATE_NORMAL,
    STATE_MENU,
    STATE_SETTING
};

enum DisplayState current_state = STATE_NORMAL;

void update_display() {
    switch(current_state) {
        case STATE_NORMAL:
            // 显示正常数据
            display_normal_data();
            break;
        case STATE_MENU:
            // 显示菜单
            display_menu();
            break;
        case STATE_SETTING:
            // 显示设置界面
            display_setting();
            break;
    }
}

void handle_button(Button button) {
    switch(current_state) {
        case STATE_NORMAL:
            if(button == BUTTON_MENU) {
                current_state = STATE_MENU;
            }
            break;
        case STATE_MENU:
            if(button == BUTTON_BACK) {
                current_state = STATE_NORMAL;
            } else if(button == BUTTON_ENTER) {
                current_state = STATE_SETTING;
            }
            break;
        // 其他状态处理...
    }
}

这种状态机的设计使得显示逻辑清晰易懂,易于扩展。我在一个智能温控器中就使用了类似的结构,可以显示当前温度、设定温度、时间、参数设置等多个界面。

5.3 动画效果与特殊显示

虽然数码管看起来简单,但也能实现一些有趣的动画效果。比如实现一个滚动显示的效果:

void scroll_display(const char* text) {
    // 将文本转换为段码
    // 实现滚动逻辑
    // 更新显示缓冲区
}

// 或者实现一个进度条效果
void show_progress(unsigned char percent) {
    // 根据百分比计算点亮的段数
    // 在数码管上显示进度条
}

这些效果虽然简单,但能大大提升产品的用户体验。我记得在一个排队叫号系统中,使用数码管显示滚动提示信息,比简单的静态显示有了更好的效果。

实现这些效果的关键是要保证动画的流畅性,不能影响主程序的运行。通常需要在中断中维护动画状态,而不是在主循环中处理。

数码管动态扫描技术虽然是一个相对古老的技术,但在现代嵌入式系统中仍然有着广泛的应用。掌握好这项技术,不仅能够解决实际的显示需求,更能深入理解嵌入式系统的实时性和资源管理特性。

74HC573锁存器在数码管驱动中的妙用:如何节省单片机IO口(附电路图) 本文详细介绍了74HC573锁存器在数码管驱动中的应用技巧,通过级联设计显著节省单片机IO口资源。文章包含锁存器工作原理、电路设计思路、具体实现方案及性能优化建议,并附有实用电路图和代码示例,帮助开发者高效解决多位数码管驱动难题。 阅读详情

相关推荐

74HC595驱动精讲:从时序原理到数码管实战与调试

在嵌入式系统与单片机开发中,IO口资源扩展是基础且关键的技术需求。其核心原理在于通过串行通信协议,将有限的单片机引脚转换为多路并行输出,从而高效驱动LED、数码管等外设。这项技术的核心价值在于以极低的硬件成本,显著提升系统的驱动能力和灵活性,是解决资源受限场景下控制多路信号的经典方案。其典型应用场景包括LED点阵屏驱动、多位数码管显示以及需要大量输出通道的工控面板。本文聚焦于实现这一功能的经典芯片74HC595,深入剖析其串入并出的工作时序、驱动函数编写要点,并结合动态扫描消影等工程实践,详解其在驱动8位数

weixin_30940783的博客 489

第三十一节:数码管通过一二级菜单来设置数据的综合程序。

第三十一节:数码管通过一二级菜单来设置数据的综合程序。 开场白:    上一节讲了二级菜单,这一节要教会大家两个知识点: 第一个:数码管通过一二级菜单来设置数据的综合程序框架。 第二个:继续加深熟悉鸿哥首次提出的“一二级菜单显示理论”:凡是人机界面显示,不管是数码管还是液晶屏,都可以把显示的内容分成不同的窗口来显示,每个显示的窗口中又可以分成不同的局部显示。其中窗口就是一级菜单,用uc

yuanmeixiang的专栏 4895

51单片机数码管滚动显示学号_【单片机自学】3.数码管静态及动态显示

数码管静态及动态显示一、八位共阳数码管1.1 硬件连接图1 共阳数码管原理图上图是独立共阳数码管,用于演示数码管显示原理图2 共阴和共阳数码管原理说明图注:上面为共阴数码管原理说明图,下面为共阳数码管原理说明图 1.2 共阳数码管编码表图 3 共阳数码管编码表实物连线图图 4 共阳数码管实物连接图1. 4 共阳数码管静态显示程序/*---------------------------...

weixin_39891317的博客 6632

蓝桥杯单片机——锁存器、数码管、定时器的基本操作

蓝桥杯单片机的一些知识点,希望能帮助到有需要的小伙伴

weixin_48938349的博客 1272

蓝桥杯单片机基础学习部分(3)——数码管

在蓝桥的比赛里,大部分的输出显示是通过数码管显示出来的,每一次的比赛,数码管的显示功能是必考的!本文通过数码管的静态显示和动态扫描两部分分析数码管的功能实现。

Simon的博客 2990

51单片机抢答器课设详解:定时器、按键扫描与动态扫描实战

在电子技术课程设计中,抢答器是经典的综合性实训项目,它看似简单,却集中了单片机系统最核心的几项基础技术:按键输入检测、定时器中断、数码管动态扫描以及状态锁存逻辑。理解这些底层原理,不仅有助于完成课设,更能为后续嵌入式开发打下扎实基础。51单片机因其寄存器操作直观、资料丰富,成为学习定时器初值计算和IO控制的理想平台。通过合理分配引脚、使用74HC573锁存器解决段码位码复用问题,再结合C51代码实现按键消抖与抢答锁存,即可构建一个稳定可靠的多路抢答系统。该方案广泛应用于竞赛抢答、课堂互动及各类电子设计竞赛中

weixin_29169899的博客 216

蓝桥杯模块学习4——数码管(深夜学习——单片机)

蓝桥杯模块学习4——数码管,包括静态数码管和动态数码管

weixin_63568691的博客 2875

十六进制7段译码器硬件设计与FPGA实现

7段数码管译码器是数字电路与FPGA开发中的基础硬件模块,其本质是将4位二进制输入(0–F)实时映射为7位段选信号的纯组合逻辑电路。不同于软件查表,它需严格满足时序收敛、无锁存器、电平极性匹配(共阴/共阳)等硬件约束。该模块承载计数显示、状态指示、协议调试等关键嵌入式功能,是理解HDL如何精准建模物理行为的核心入口。结合Verilog/VHDL可综合写法、同步化输入处理、电流驱动适配及动态扫描集成,可构建高可靠性、低资源占用、跨工具链兼容的复用IP。本文聚焦十六进制译码器的RTL实现原理与工程落地要点。

weixin_29193359的博客 318

I/O输出——实例3:数码管动态扫描显示

 I/O输出——实例3:数码管动态扫描显示一、实例目的      通过本实例,我们应:      1. 了解多位数码管的结构及引脚;      2. 了解多位数码管驱动电路;      3.掌握数码管动态扫描程序设计。      本例重点介绍多位数码管的驱动电路和程序设计,关于单个数码管的结构和驱动原理,请参见《I/O输出——实例2:数码管静态驱动》。二、多位数码管结构及引脚      多位数码管...

行者无疆 3万+

数码管多级菜单,自己调试.rar

数码管多级菜单,51单片机按键扫描!带proteus仿真,提供原理图源程序。程序有详细解释!

stm8s数码管菜单

硬iic pwm t4 rtc adc功能,如果硬件齐全能做一个RTC时钟,PWM信号发生器。

51单片机利用锁存器控制数码管显示年月日时分秒

数码管模块中的两片74hc573,一片锁存段码,一片锁存位码,这样才能驱动8位数码管。74hc573是锁存器,用于数码管显示时通常是采用段选、片选共用同一组并口的驱动方式。驱动数码管需要两个信号,一个是段选信号,另一个是片选信号。段选信号是固定的8个(对于普通7段数码管),而片选信号数量是与数码管位数相同的。对于8位数码管的动态扫描来说,片选信号要8根线,这样仅仅驱动数码管就占用了16个IO口,非常浪费。使用573锁存器后,只占用10个IO口,其中2个用于控制锁存器使能,另外8个用于输出信号。先关闭控制片选

fat_niu_tui_zi的博客 1万+

非常实用的单片机多级菜单设计

单片机多级菜单设计,非常实用,适合单片机这种资源少的处理器

Proteus中七段数码管动态扫描仿真优化

本文深入探讨七段数码管动态扫描的软硬件协同设计,涵盖定时器中断驱动、显示缓冲、三极管与锁存器应用、抗干扰措施及Proteus仿真到实物落地的关键问题,强调稳定显示与工程可靠性。

wine的专栏 1106

一个占用内存极少的菜单系统的实现

仿照按键手机,方便菜单扩展,对下位机的菜单有很好的参考,一旦掌握,多级菜单不用愁!

9、傅里叶变换:连续时间与离散时间信号分析的核心工具

本文深入探讨了傅里叶变换在连续时间和离散时间信号分析中的核心作用,详细介绍了连续时间傅里叶变换(CTFT)和离散时间傅里叶变换(DTFT)的定义、性质及其应用。文章涵盖了傅里叶级数到傅里叶变换的推导过程、常见变换对、系统分析中的关键性质,并讨论了采样后频谱的周期延拓与混叠问题。此外,还展示了傅里叶变换在滤波器设计、通信系统调制解调等实际场景中的应用,最后展望了其在图像处理、生物医学等领域的广阔前景。

jump7的博客 67

【蓝桥杯单片机入门记录】动态数码管

【蓝桥杯单片机入门记录】动态数码管

La_gloire的博客 3093

【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换

1 坐标系定义及转换   首先介绍一下世界坐标系和相机坐标系之间的转换,它们之间是存在一个转换关系的。现假设空间中一点X,它在相机坐标系下的坐标是Xcamera,在世界坐标系下的坐标是Xworld。假设它通过R和t实现从相机坐标系到世界坐标系之间的转换: Xworld = RXcamera + t   那么,由上式,我们可以推得从世界坐标系向相机坐标系的转换关系(RT=R-1,所以通常直接使用RT即可): Xcamera = RTXworld - RTt   所以,两个坐标系之间的转换,需要看其具体

zeeq的博客 2万+

四位共阳极数码管显示函数_74hc573可以驱动几位共阴数码管?74hc573驱动数码管应用解析...

74hc573能够驱动几位共阴数码管取决于你使用几片74hc573,如果用两片,一片锁存段码,一片锁存位码,就可以驱动8位数码管。在讲解74hc573驱动数码管问题之前我们要清楚,什么是74hc573及什么是数码管?数码管数码管是一种半导体发光器件,其基本单元是发光二极管,文章用到的是2位连体共阴数码管。这种数码管有8根段码引脚和2根位码引脚,段码决定了显示的是什么字符,位码决定了哪位数码管被点亮...

weixin_42353061的博客 2647

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(一)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包

慕羽★的博客 3936

Android AVB 分析(十三)dm-verity 设备是如何映射的?

在上一篇《Android AVB 分析(十二)嵌入式设备安全中的 dm-verity 简介》介绍 dm-verity 原理的时候,作者提供了一个 dm-verity 演示的例子。本篇我们基于 AOSP 源码 `android-13.0.0_r41` 实际编译生成的 Google Pixel 7 (“panther”) 设备的 system 分区镜像进行 dm-verity 设备验证实战。

洛奇看世界 2438
上一篇: 电子萌新速通!MPU、MCU、SoC 核心差异与实战选型避雷手册
下一篇: ESP8266 AT指令透传模式实战指南
Melon
博客等级 码龄25年 59粉丝 1574原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值