stm103vb按键计数。开发板上电后,数码管左边三位点亮,为000;当K1每按一次后,则显示的三位十进制值加1,当加到999时,再按一次,值变为000;当K2每按下一次后,显示的值减1,当减到000时,再按一次,则值变为999。
时间: 2023-10-16 20:07:32 浏览: 211
以下是STM32F103VB按键计数的代码实现:
```c
#include "stm32f10x.h"
void delay(uint32_t time);
void GPIO_Config(void);
void display(uint16_t num);
int main(void)
{
uint16_t count = 0;
GPIO_Config();
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) //K1按下
{
delay(10); //消抖
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) //确认按键按下
{
count++;
if(count > 999)
count = 0;
display(count);
}
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0); //等待按键释放
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) //K2按下
{
delay(10); //消抖
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0) //确认按键按下
{
if(count == 0)
count = 999;
else
count--;
display(count);
}
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0); //等待按键释放
}
}
}
void delay(uint32_t time)
{
uint32_t i;
for(i = 0; i < time; i++);
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void display(uint16_t num)
{
uint8_t i, j;
uint8_t digit[3];
digit[0] = num / 100; //百位
digit[1] = num % 100 / 10; //十位
digit[2] = num % 10; //个位
for(i = 0; i < 3; i++)
{
GPIO_SetBits(GPIOB, 0x00FF); //清零
GPIO_ResetBits(GPIOB, 1 << i); //选通位
for(j = 0; j < 10; j++)
{
if(j == digit[i])
GPIO_SetBits(GPIOB, 1 << (j + 8));
}
}
}
```
其中,`GPIO_Config()`函数用于配置GPIO口,将K1和K2设置为上拉输入,将数码管的8个段设置为输出,并将数码管的8位选择位设置为PB0、PB1、PB2三个引脚。
`display()`函数用于将计数值以三位数的形式显示在数码管上,先将计数值拆分为百位、十位、个位三个数字,然后将每一位对应的段选通,再将该位需要点亮的段置高。
主函数中,先进行按键消抖处理,然后判断按下的是哪个按键,进行计数值的加减操作,并将计数值显示在数码管上。需要注意的是,当计数值加到999时,再按K1将计数值重置为0,当计数值减到0时,再按K2将计数值重置为999。
阅读全文