单片机MK60DZ10来实现运用脉冲累加器PA实现对一个按键动作的计数,要求: (1)每按一下LED0闪烁一次,且按键动作的上升沿计数; (2)计数到10个脉冲时,LED1闪烁一次。运用 lptmr_counter_init(LPT0_ALT1,1,0,LPT_Rising)
时间: 2024-02-06 21:10:09 浏览: 152
单片机脉冲计数
4星 · 用户满意度95%
好的,这是一个简单的单片机程序,可以使用以下代码来实现:
```c
#include "MK60DZ10.h"
#define LED0 (1U<<11) //PTB11
#define LED1 (1U<<28) //PTE28
#define KEY (1U<<4) //PTA4
volatile uint32_t count = 0; //计数器变量,需要使用volatile关键字
void lptmr_counter_init(uint32_t instance, uint32_t prescaler, uint32_t compareValue, uint32_t pinSelect)
{
SIM->SCGC5 |= SIM_SCGC5_LPTIMER_MASK; //使能LPTMR时钟
LPTMR0->CSR = 0; //先清空CSR寄存器
LPTMR0->CMR = compareValue; //设置比较值
LPTMR0->PSR = (LPTMR_PSR_PRESCALE(prescaler) | pinSelect); //设置分频器和输入引脚
LPTMR0->CSR |= (LPTMR_CSR_TEN_MASK | LPTMR_CSR_TIE_MASK); //使能计数器并开启中断
}
void PORTA_IRQHandler(void)
{
if (PORTA->PCR[4] & PORT_PCR_ISF_MASK) //检查中断标志位
{
PORTA->PCR[4] |= PORT_PCR_ISF_MASK; //清除中断标志位
if (count < 10)
{
count++; //计数器加一
if (count == 10)
{
GPIOE->PDOR ^= LED1; //LED1闪烁一次
count = 0; //计数器清零
}
else
{
GPIOB->PDOR ^= LED0; //LED0闪烁一次
}
}
}
}
int main(void)
{
SIM->SCGC5 |= (SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTE_MASK); //使能端口B和端口E时钟
PORTB->PCR[11] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK; //设置PTB11为GPIO输出
PORTE->PCR[28] = PORT_PCR_MUX(1) | PORT_PCR_DSE_MASK; //设置PTE28为GPIO输出
GPIOB->PDDR |= LED0; //设置PTB11为输出
GPIOE->PDDR |= LED1; //设置PTE28为输出
SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK; //使能端口A时钟
PORTA->PCR[4] = PORT_PCR_MUX(1) | PORT_PCR_IRQC(9) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK; //设置PTA4为GPIO输入,带上拉电阻和中断上升沿触发
NVIC_EnableIRQ(PORTA_IRQn); //使能PORTA中断
lptmr_counter_init(LPT0_ALT1, 1, 0, LPT_Rising); //初始化LPTMR计数器
while (1)
{
//主程序不需要做什么
}
}
```
以上代码中使用了LPTMR计数器来计算按键动作的上升沿,每按一下LED0就会闪烁一次,并且计数器会加一,当计数器计数到10个脉冲时,LED1就会闪烁一次。如果需要改变计数器计数的脉冲数,可以修改`compareValue`的值。
阅读全文