开发环境:
联想yoga14s、Windows10、Keil uVision4、开发板STM32F103VB
一、 实验题目
控制最右边三位数码管,设置初始值为995,当按键k1每次按下时数码管三位十进制加1,当加到999时继续加1,显示为000;按键k2每次按下时数码管三位十进制减1,当减到000时继续减1,显示为999
二、 实验目的
掌握stm32的GPIO操作和中断操作,实现数码管显示、按键输入等功能。
三、 实验内容
分析题目,首先我们需要懂得如何操作GPIO。操作GPIO需要3个步骤:1、使用RCC开启GPIO的时钟;2、使用GPIO_Init函数初始化GPIO;3、使用数码管输出和按键输入的函数控制GPIO口。
对于数码管的GPIO口,需要使能GPIOB和GPIOE端口,将GPIOB设置为推挽输出;对于按键的GPIO口,需要使能GPIOC端口,将k0,k1设置成输入,在这里我设置成上拉输入,即输入端口信号默认值为1,当按键按下时,该位置0。代码如下:
u8 KEY_Scan(void){
static u8 key_up=1;//按键按松开标志
if(key_up && (KEY1==0 || KEY2==0))
{
delay_ms(10); //去抖动
key_up=0;
if(KEY1==0)
{
return 1;
}
else if(KEY2==0)
{
return 2;
}
}
else if(KEY1==1 && KEY2==1) key_up=1;
return 0;// 无按键按下
}
在主函数中,设置变量show_w为待显示的值,并初始化为995,再设置变量t用于保存按键输入时的变化值。主函数中利用循环不断检测t的值,如果值不为0,判断是1还是2,如果是1则将show_w值加1,若已为999则将值置为0;如果是2则将show_w值减1,若已为000则将值置为999。
如果t的值没有变,表明此时输入信号稳定,则将show_w的值显示在数码管中。代码如下:
//按键输入实验
int main(void)
{
int show_w=995;
u8 t;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
LED_SEL = 0;
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
while(1){
t=KEY_Scan();//得到键值
if(t)
{
switch(t)
{
case 1:
if(show_w==999){
show_w=0;
}
else show_w++;
break;
case 2:
if(show_w==0){
show_w=999;
}
else show_w--;
break;
}
}else delay_ms(1);
SetLed(7, show_w%10);
delay_ms(1);
SetLed(6, show_w/10%10);
delay_ms(1);
SetLed(5, show_w/100);
delay_ms(1);
}
}
}
四、 实验结果与分析
实验结果:启动时,开发板初始状态为右边三位数码管显示995:
按下k1时,数码管的值加一,加到1000时置为000;按下k2时,数码管的值减一,减到-1时置为999: