pic单片机定时器2实现按键按下松开后led灯开始闪烁,闪烁频率1s一次
时间: 2024-05-01 18:16:23 浏览: 185
以下是使用PIC单片机定时器2实现按键按下松开后LED灯开始闪烁,闪烁频率1秒一次的代码:
```c
#include <xc.h>
#define _XTAL_FREQ 4000000 // 声明晶振频率为4MHz
// 配置寄存器
#pragma config FOSC = INTRCIO // 内部振荡器
#pragma config WDTE = OFF // 禁用看门狗定时器
void init(void); // 初始化函数声明
void main(void) {
init(); // 初始化
while (1) {
if (RB0 == 0) { // 检测按键是否按下
__delay_ms(20); // 延时一段时间,消除抖动
if (RB0 == 0) { // 再次检测按键是否按下
while (RB0 == 0); // 等待按键松开
TMR2 = 0; // 定时器2计数器清零
T2CONbits.TMR2ON = 1; // 启动定时器2
while (1) {
if (TMR2 >= 122) { // 定时器2计数器达到一定值,LED灯反转
TMR2 = 0; // 定时器2计数器清零
RB1 = ~RB1; // LED灯反转
}
}
}
}
}
}
void init(void) {
ANSEL = 0; // 将所有模拟输入设置为数字输入
TRISB = 0b00000001; // RB0为输入,RB1为输出
RB1 = 0; // 初始化LED灯为关闭状态
// 配置定时器2
T2CONbits.T2CKPS = 0b11; // 预分频器为1:64
T2CONbits.TMR2ON = 0; // 关闭定时器2
TMR2 = 0; // 定时器2计数器清零
}
```
解释:
首先,声明晶振频率为4MHz,这里用到了宏定义 `_XTAL_FREQ`。
然后,在配置寄存器中设置使用内部振荡器,禁用看门狗定时器。
接着,定义了一个 `init()` 函数,用来初始化 GPIO 和定时器2。
在主函数中,首先调用 `init()` 函数进行初始化。
然后,进入一个无限循环,不断检测按键是否按下。如果按键按下,则进行一些操作。
首先,延时一段时间,消除按键抖动。然后,再次检测按键是否按下,如果按下,则进入一个死循环。
在死循环中,首先将定时器2计数器清零,然后启动定时器2。接着进入一个死循环,不断检测定时器2计数器是否达到一定值。
如果达到一定值,说明已经过了1秒钟,LED灯需要反转。于是,将定时器2计数器清零,然后将 LED 灯状态反转。
这样,LED 灯就可以在按键按下松开后开始闪烁,闪烁频率为1秒一次。
阅读全文