You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用8bit计数器和C++驱动2位7段数码管实现0-99计数的拆分问题

实现方案

核心逻辑

不要直接把计数变量counter的值赋值给PORTD端口,你需要单独维护counter存储0~99的实际计数值,输出到端口前拆分出十位、个位数值,再拼接为对应8位电平值输出即可。

操作步骤

  1. 先给计数变量增加边界校验,避免数值超出0~99范围导致显示异常
  2. 数值拆分逻辑:
  • 个位数值:通过取余运算counter % 10得到,对应PORTD的低4位
  • 十位数值:通过整除运算counter / 10得到,左移4位后对应PORTD的高4位
  1. 两个数值通过按位或运算拼接为最终的8位输出值,赋值给PORTD

修改后代码

// 提前定义counter为uint8_t类型,初始值设为0
while(1)
{
    __delay_ms(10);
    
    if(button1 flank detected)
    {
        counter++;
        // 计数溢出后归零
        if(counter > 99) counter = 0;
    }
    if(button2 flank detected)
    {
        counter--;
        // 计数减到负数后回到99,不需要循环可以改成固定为0
        if(counter < 0) counter = 99;
    }
    // 拼接显示值
    uint8_t port_val = ((counter / 10) << 4) | (counter % 10);
    PORTD = port_val;
}

效果验证

以你提到的计数值10为例:

  • 整除10得到十位数值1,左移4位后为0b00010000
  • 取余10得到个位数值0,为0b00000000
  • 按位或后得到0b00010000,高4位输出给十位数码管显示1,低4位输出给个位数码管显示0,符合显示要求。

内容的提问来源于stack exchange,提问作者binary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 06:24:07