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

