c语言实现pic单片机定时器2扫描3个按键20ms一次
时间: 2024-06-10 11:10:25 浏览: 186
C语言实现简单的定时器
这里提供一种基于PIC单片机的定时器2扫描3个按键的C语言代码,每20毫秒执行一次扫描操作。
```
#include <xc.h>
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#define _XTAL_FREQ 20000000 //定义XTAL频率20MHz
void init_timer2(); //初始化定时器2
void scan_key(); //扫描按键
unsigned char key_status = 0; //按键状态,0表示未按下,1表示已按下
void main()
{
TRISA = 0xFF; //将PORTA设置为输入
PORTA = 0x00; //将PORTA输出清零
init_timer2(); //初始化定时器2
while(1)
{
scan_key(); //扫描按键
__delay_ms(20); //延时20ms
}
}
void init_timer2()
{
T2CONbits.T2CKPS = 0b11; //设置预分频器为1:64
T2CONbits.TMR2ON = 1; //使能定时器2
PR2 = 125; //设置周期为125,即20ms
}
void scan_key()
{
if(!key_status) //如果按键未按下
{
if(!PORTAbits.RA0) //按键1按下
{
key_status = 1; //设置按键状态为已按下
//执行按键1按下后的操作
}
else if(!PORTAbits.RA1) //按键2按下
{
key_status = 1; //设置按键状态为已按下
//执行按键2按下后的操作
}
else if(!PORTAbits.RA2) //按键3按下
{
key_status = 1; //设置按键状态为已按下
//执行按键3按下后的操作
}
}
else //如果按键已按下
{
if(PORTAbits.RA0 && PORTAbits.RA1 && PORTAbits.RA2) //如果按键全部松开
{
key_status = 0; //设置按键状态为未按下
}
}
}
```
在代码中,首先定义了一个全局变量`key_status`,用来记录按键状态。在`main()`函数中,将`PORTA`设置为输入,并调用`init_timer2()`函数初始化定时器2。在主循环中,每次执行`scan_key()`函数扫描按键,并延时20毫秒。
`init_timer2()`函数用来初始化定时器2,设置了预分频器为1:64,周期为125,即20毫秒。
`scan_key()`函数用来扫描按键状态,如果按键未按下,则检测按键1、2、3是否有按下,若有则设置`key_status`为1,表示按键已按下。如果按键已按下,则检测按键1、2、3是否全部松开,若已松开则设置`key_status`为0,表示按键未按下。
需要注意的是,由于定时器2的中断未开启,因此不能在定时器中断函数中执行扫描按键的操作,而是在主循环中调用`scan_key()`函数进行扫描。
阅读全文