使用8bit计数器和C++驱动2位7段数码管实现0-99计数的拆分问题
实现方案
核心逻辑
不要直接把计数变量counter的值赋值给PORTD端口,你需要单独维护counter存储0~99的实际计数值,输出到端口前拆分出十位、个位数值,再拼接为对应8位电平值输出即可。
操作步骤
- 先给计数变量增加边界校验,避免数值超出0~99范围导致显示异常
- 数值拆分逻辑:
- 个位数值:通过取余运算
counter % 10得到,对应PORTD的低4位 - 十位数值:通过整除运算
counter / 10得到,左移4位后对应PORTD的高4位
- 两个数值通过按位或运算拼接为最终的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
相关产品推荐
相关产品推荐

