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

PIC18F4420汇编语言下Switch case语句实现多LED状态控制

PIC18F4420 汇编实现状态LED逻辑输出方案

前提说明

先约定硬件引脚映射,你可以根据实际接线修改对应定义:

  • 状态1红灯接RA0、状态1绿灯接RA1、状态2红灯接RA2、状态2绿灯接RA3
  • 输出红灯接RB0、输出绿灯接RB1
  • 逻辑默认高电平点亮LED,若你的电路是低电平点亮,可自行调整取反逻辑

核心实现思路

4个输入状态刚好可以拼成4位的索引值,用PIC汇编的PC偏移查表法替代switch case分支判断,执行效率更高,代码也更简洁,完全覆盖你给出的9种逻辑场景,未定义场景默认输出灯全灭。

完整汇编代码

; 引脚定义,根据实际硬件修改即可
SAT1_RED    EQU 0   ; 状态1红灯对应输入引脚位号
SAT1_GREEN  EQU 1   ; 状态1绿灯对应输入引脚位号
SAT2_RED    EQU 2   ; 状态2红灯对应输入引脚位号
SAT2_GREEN  EQU 3   ; 状态2绿灯对应输入引脚位号
OUT_RED     EQU 0   ; 输出红灯对应输出引脚位号
OUT_GREEN   EQU 1   ; 输出绿灯对应输出引脚位号

    org 0x0000
    goto INIT      ; 复位向量跳转到初始化程序

; 端口初始化
INIT
    movlw 0x0F
    movwf ADCON1    ; 关闭RA口模拟功能,设为数字IO
    movlw 0x0F      ; RA0~RA3设为输入,其余RA引脚为输出
    movwf TRISA
    clrf TRISB      ; RB口全设为输出
    clrf PORTB      ; 初始输出全灭

; 主循环
MAIN_LOOP
    movf PORTA, W   ; 读取输入端口电平
    andlw 0x0F      ; 提取低四位的四个输入状态作为查表索引
    call OUTPUT_LOOKUP  ; 查表获取输出值
    andlw 0x03      ; 保留输出的两位有效数据
    movwf PORTB     ; 输出到LED端口

    ; 不需要延时可以删掉以下两行,按需调整刷新频率
    call DELAY
    goto MAIN_LOOP

; 输出逻辑查找表,索引为四个输入的组合值,返回值低两位对应输出红、绿灯状态
OUTPUT_LOOKUP
    addwf PCL, F
    retlw 0x00  ; 索引0000:输入全0,输出00
    retlw 0x02  ; 索引0001:仅状态2绿灯亮,输出绿亮
    retlw 0x01  ; 索引0010:仅状态2红灯亮,输出红亮
    retlw 0x00  ; 索引0011:未定义,输出全灭
    retlw 0x00  ; 索引0100:仅状态1绿灯亮,输出全灭
    retlw 0x02  ; 索引0101:状态1绿灯+状态2绿灯亮,输出绿亮
    retlw 0x01  ; 索引0110:状态1绿灯+状态2红灯亮,输出红亮
    retlw 0x00  ; 索引0111:未定义,输出全灭
    retlw 0x00  ; 索引1000:仅状态1红灯亮,输出全灭
    retlw 0x01  ; 索引1001:状态1红灯+状态2绿灯亮,输出红亮
    retlw 0x01  ; 索引1010:状态1红灯+状态2红灯亮,输出红亮
    retlw 0x00  ; 索引1011:未定义,输出全灭
    retlw 0x00  ; 索引1100:未定义,输出全灭
    retlw 0x00  ; 索引1101:未定义,输出全灭
    retlw 0x00  ; 索引1110:未定义,输出全灭
    retlw 0x00  ; 索引1111:未定义,输出全灭

; 简易延时函数,根据你的系统时钟调整循环参数即可
DELAY
    movlw 0xFF
    movwf 0x20
DLY1
    movlw 0xFF
    movwf 0x21
DLY2
    decfsz 0x21, F
    goto DLY2
    decfsz 0x20, F
    goto DLY1
    return

    end

代码适配说明

  • 如果输入LED是低电平有效,在andlw 0x0F后加一行comlw 0x0F对输入值取反即可。
  • 如果引脚接在其他端口,修改读取和输出的端口寄存器,以及TRIS方向寄存器的配置值即可。
  • 未定义的输入组合默认输出全灭,有其他需求直接修改对应索引的retlw返回值即可,返回值的bit0对应输出红灯状态,bit1对应输出绿灯状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:00:01