如何用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
相关产品推荐
相关产品推荐

