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

ATMega328采用引脚变化中断处理按键后首次按键即卡死问题求助

矩阵键盘中断触发异常问题(ATMega328P Proteus仿真)

我已通过主循环轮询方式在ATMega328上实现矩阵键盘,现改为仅在按键触发时通过引脚变化中断处理。硬件采用PORTB[3..0]作为行引脚,PINC[2..0]作为列引脚,但在Proteus中仿真ATMega328P时出现异常:PORTB与PINC会停留在最后一次的数值状态,导致程序仅能检测一次按键。

初始端口状态:
初始端口状态

首次成功按键后的状态:可观察到对应按键的部分端口处于卡死状态
按键后部分端口卡死状态

已尝试的解决方法

  • 启用/禁用PORTB的上拉电阻,无效
  • 每次中断后重新初始化PORTB和PINC,无效
  • 将PORTB全部置0有一定效果,但不知如何对PINC进行同样操作

相关代码

.ORG 0X00
JMP START
.ORG 0X08
JMP PORT1_ISR

.ORG 0X100
START:
LDI R17, HIGH(RAMEND)
OUT SPH, R17
LDI R17, LOW(RAMEND)
OUT SPL, R17

; Initializing ports
LDI R16,0XFF 
OUT DDRB,R16
OUT DDRD,R16 
LDI R16,0X00 
OUT DDRC,R16 

;LDI R16, 0X0F
;OUT PORTC,R16

OUT PORTD,R16

;SBI PORTB,0 
;SBI PORTB,1 
;SBI PORTB,2 
;SBI PORTB,3

; Enabling interrupts
LDI R16, (1<<PCIE1)
STS PCICR, R16
LDI R16, (1<<PCINT8)|(1<<PCINT9)|(1<<PCINT10)
STS PCMSK1, R16
SEI

MAIN:
RJMP MAIN

.ORG 0X0500
PORT1_ISR:

; ROW 0 
CBI PORTB,0 
SBI PORTB,1 
SBI PORTB,2 
SBI PORTB,3

SBIS PINC,0 
LDI R20,0X06 ; CODE 1
SBIS PINC,1 
LDI R20,0X5B ; CODE 2
SBIS PINC,2 
LDI R20,0X4F ; CODE 3


; ROW 1 
SBI PORTB,0 
CBI PORTB,1 
SBI PORTB,2 
SBI PORTB,3

SBIS PINC,0 
LDI R20,0X66 ; CODE 4
SBIS PINC,1 
LDI R20,0X6D ; CODE 5
SBIS PINC,2 
LDI R20,0X7D ; CODE 6

; Row 2
SBI PORTB,0 
SBI PORTB,1 
CBI PORTB,2 
SBI PORTB,3

SBIS PINC,0 
LDI R20,0X07 ;CODE 7
SBIS PINC,1 
LDI R20,0X7F ;CODE 8
SBIS PINC,2 
LDI R20,0X6F ;CODE 9

; Row 3
SBI PORTB,0 
SBI PORTB,1 
SBI PORTB,2 
CBI PORTB,3

SBIS PINC,1 
LDI R20,0X3F ;CODE 0

OUT PORTD, R20

;LDI R16, 0x0F
;OUT DDRB, R16
LDI R16, 0X00
OUT PORTB, R16

;LDI R16, 0x00
;OUT DDRC, R16
;OUT PORTC, R16


RETI

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 03:14:56