我有下面的代码、在这里我尝试去去除按钮按压操作的抖动、并使用按钮来切换板载 LED。
从 MSP_init()函数中可以看出、我已经将 B 计时器设置为用作去抖计时器、并且我正在使用 CCR4作为寄存器来触发 B1矢量 ISR。 当我在调试模式下运行程序时、我注意到 TB0R 不是递增的、尽管系列用户指南(S.26.2.1)建议它应该随着时钟的每个上升边沿递增计数。 因此、TB0R 始终为0x0000、因此、CCR4始终作为我插入去抖变量的任何值结束。
由于我没有设置低功耗模式、我认为我必须处于激活模式、因此所有时钟应该都在运行。 因此、TB0CTL |= TBSSL_ACLK 应该使 TB0R 与 ACLK 成步递增。 但是、在调试器中 TB0R 根本不会递增。 无论我使用步进函数(其他帖子建议有时不让计时器递增)还是"运行/播放"按钮、以及我是否在 ISR 内设置断点、都是如此。 同样、如果我刷写程序、我将能够打开指示灯、但去抖计时器中断从未达到、因此我无法通过再次按下按钮来关闭指示灯。
为什么 TB0R 不递增、我需要怎么做才能使其递增计数?
#include
//=================== 函数原型===================================
void MSP_init ();
//=========================== 全局范围=================================
//定义
#define ROWS (BIT1 | BIT2 | BIT3 | BIT4)
#define cols (BIT4 | BIT4 | BIT6 | BIT4)
//有用常量和其他值
unsigned int 去抖= 0x01ff;//去抖延迟将在稍后完成。
//======================================== Main ================================================
void main (void)
{
//计时器填充
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;
//常量
unsigned char numer[3]={0xff、0xff、0xff};//一、几十、几百
unsigned char i = 0;
unsigned char sum;
//初始化
P2OUT &=~0xff;
P8OUT &=~0xff;
P9OUT &=~BIT0;
MSP_init();
_enable_interrupt ();
P2上的//端口中断。
P2IES |=行;//下降沿
//P2IES &=~行;//上升沿
P2IFG &=~0xff;//清除中断标志
P2IE |= rows;//interrupts on 1-4
//测试循环:
while (1){}
//========================= 函数=================================================
//MSP 初始
化 void MSP_init()
{
//设置 LED 的输出端口
P2DIR |= BIT6 | BIT7; // P2.6和 P2.7设置为输出
P2SEL1 &=~Ω(BIT6 | BIT7);//连接 P2.6和 P2.7
P2SEL0 |= BIT6 | BIT7; //至 TB0.5和 TB0.6
P3DIR |= BIT6 | BIT7; // P3.6和 P3.7设置为输出
P3SEL1 |= BIT6 | BIT7; //连接 P3.6和 P3.7
P3SEL0 &=~(BIT6 | BIT7);//至 TB0.2和 TB0.3
//初始化:
P8DIR |= cols;//Output
P8OUT &=~cols;//输出0
P2DIR &=~行;//输入
P2REN |= ROWS;//Pullup 电阻器
P2OUT |= ROWS;//输出为1 (稍后将下拉)
TB0CTL = TBSSEL_ACLK | ID_1 | MC_UP | TBCLR;//setup timer b
}
//=========================== 中断=================================
#pragma vector = TIMER0_B1_VECTOR
__INTERRUPT void T0B1_ISR (void)
{
switch (__evo_in_range (TB0IV、14))
{
情况0:中断; //无中断
案例2:中断; // CCR1未使用
案例4:中断; // CCR2
案例6:中断;
判例8://ccr4
TB0CCTL4 &=~CCIE;//禁用中断
P2IE |= ROWS;//在去抖延迟后重新启用中断
中断;
案例10:中断;
案例12:中断;
案例14:中断;
默认值:break;
}
}
#pragma vector = port2_vector //关联函数。 具有中断矢量
_interrupt void Port_2 (void) // ISR 的名称
{
开关(__evo_in_range (P2IV、P2IV_P2IFG7))
{
//我使用 P2.1-2.4作为输入。
案例 P2IV_NONE:break;//向量0:无中断
案例 P2IV_P2IFG0:中断;//向量2:P2.0
案例 P2IV_P2IFG1://BIT1、依此类推
//在中断上:
P2IE &=~行;//禁用中断
P2IFG &=~0xff;//清除中断标志
TB0CCR4 = TB0R +去抖;//禁用去抖周期的按钮中断
TB0CCTL4 = CCIE;//在 TB0CCR4上启用中断
//测试
P1DIR ^= BIT0;
P1OUT ^= BIT0;
中断;
案例 P2IV_P2IFG2:中断;
案例 P2IV_P2IFG3:中断;
案例 P2IV_P2IFG4:中断;
案例 P2IV_P2IFG5:中断;//矢量12:P2.5
案例 P2IV_P2IFG6:中断;//向量14:P2.6
案例 P2IV_P2IFG7:中断;//向量16:P2.7
默认值:break;
}
}