我使用的是 PIC16F887 44 引脚演示板。
我正在尝试这样做
- 用户按下开关
- 计时器开始
- 如果在 3 秒内再次按下开关,则点亮 LED 0,否则点亮 LED 1
由于定时器0的预分频器设置为255,将在65536 μs后溢出,因此我需要计算它溢出的次数并检查是否达到该数量。 那将是 46 次。
这些是我的代码的相关摘录
movlw B'10000111' ; configure Prescaler on Timer0, max prescale (/256)
movwf OPTION_REG ; configure
MOVLW B'10100000' ; enable Timer 0 and global interrupts
MOVWF INTCON
MainLoop:
BTFSS PORTB,0 ; is the switch pressed (0)
GOTO EndMainLoop ; Lights up LED 0
MOVF TimerCount, w
XORLW .46 ; Check whether XOR TimerCount with 46
BTFSS STATUS,Z ; returns a 0
GOTO MainLoop
GOTO State2 ; Lights up LED 1
TimerCount 在代码的中断部分增加,如下所示
org 4
ServiceTimer0:
bcf STATUS,RP0 ; Ensure ISR executes in Register Bank 0
bcf STATUS,RP1
BCF INTCON,T0IF ; clear the interrupt flag.
INCF TimerCount,f ; Increment TimerCount
RETFIE ; Return from the interrupt
然而,Timer0 永远不会溢出,并且由于某种原因,中断例程永远不会被调用。 有谁知道我做错了什么?
最佳答案
它无法工作,因为你没有选择正确的内存库! 尝试...
movlw B'10000001' ; configure Prescaler on Timer0, max prescale (/256)
BANKSEL OPTION_REG
movwf OPTION_REG ; configure
movlw B'10100000' ; enable Timer 0 and global interrupts
movwf INTCON
BANKSEL 0
...
并且您的 ISR 不会保存和恢复状态标志,因此您的程序无法正常工作!
关于assembly - PIC16F887 Timer0计数溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019971/