You need to enable JavaScript to run this app. 如何用PIC18F4550构建双向总线 复用单端口接7段数码管与二进制输入
优惠活动
大模型
产品
解决方案
定价
更多

如何用PIC18F4550构建双向总线 复用单端口接7段数码管与二进制输入

PIC18F4550单端口双向复用实现数码管显示与二进制输入采集
  • 初始设计目标:将PIC18F4550的单个端口同时作为输入、输出通道使用——用端口上的7个引脚连接7段数码管做显示输出,剩余4个引脚作为输入通道,采集0~15(十六进制F)的二进制输入值,将采集到的数值同步在数码管上显示,开发基于PIC C编译器完成。

更新1
根据初始调试反馈调整代码,核心逻辑保持不变:当Port B切换为输入模式时直接读取端口电平,通过switch-case分支匹配对应的数码管段码输出,同时补充default默认分支,保证设备上电时数码管默认显示0。
曾按照老师提示尝试省略外接逻辑隔离器件,对该方案的长期可靠性存疑;如果后续需要补加隔离逻辑器件,计划用Port D的单路引脚输出控制电平,根据Port B当前的输入/输出工作模式,切换逻辑器件的工作状态。

更新2
最终方案调试通过:老师所说“可省略逻辑门器件”的结论仅适用于临时测试场景,实际稳定运行仍需要隔离器件规避端口双向复用的电平冲突。最终代码逻辑比初始设想更简单:补充3路Port D的高低电平输出,分别连接74LS244总线缓冲器、74HC573锁存器的对应使能(EN)、输出使能(OE)引脚,根据Port B的输入/输出工作状态对两个器件做使能/禁用控制,彻底解决端口复用的硬件冲突问题。

以下为最终调试通过的核心代码:

#include<18F4550.h>
#fuses XT, NOWDT, NOLVP, NOPROTECT, PUT
#use delay(clock = 4M, crystal = 8M)
#use fast_io(b)

void main(){
  int8 INDSP;
  int8 OUTDSP;

  while(true){
    // 切换Port B为全输入模式,读取低4位的二进制输入值
    SET_TRIS_B(0xFF);
    INDSP = input_b() & 0x0F;

    // 匹配输入值对应的数码管段码
    switch(INDSP){
      case 0b00000000:
        OUTDSP = 0x3F;
      break;
      case 0b00000001:
        OUTDSP = 0x0C;
      break;
      case 0b00000010:
        OUTDSP = 0x76;
      break;
      case 0b00000011:
        OUTDSP = 0x5E;
      break;
      case 0b00000100:
        OUTDSP = 0x4D;
      break;
      case 0b00000101:
        OUTDSP = 0x5B;
      break;
      case 0b00000110:
        OUTDSP = 0x7B;
      break;
      case 0b00000111:
        OUTDSP = 0x0E;
      break;
      case 0b00001000:
        OUTDSP = 0x7F;
      break;
      case 0b00001001:
        OUTDSP = 0x4F;
      break;
      case 0b00001010:
        OUTDSP = 0x6F;
      break;
      case 0b00001011:
        OUTDSP = 0x79;
      break;
      case 0b00001100:
        OUTDSP = 0x33;
      break;
      case 0b00001101:
        OUTDSP = 0x7C;
      break;
      case 0b00001110:
        OUTDSP = 0x73;
      break;
      case 0b00001111:
        OUTDSP = 0x63;
      break;
      default:
        OUTDSP = 0x3F;
      break;
    }

    delay_ms(500);
    // 切换Port B为全输出模式,刷新数码管显示内容
    SET_TRIS_B(0x00);
    output_b(OUTDSP);
    delay_ms(500);
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 06:45:05