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

