之前讲了STM32的初始化,并点亮了LED.现在来做按键输入基本和点亮LED差不多只是把输出改成输入.
以下是按键输入,按键处理部分的代码.
#include <stm32f10x_lib.h>
#include "key.h"
#include "delay.h"
//正点原子
//2009/12/23
//按键输入
#define KEY1 (1<<6) //PC6
#define KEY2 (1<<7) //PC7
#define KEY3 (1<<8) //PC8
//按键初始化函数
//PC.6.7.8 设置成带上拉的输入
void key_init(void)
{
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOC->CRL&=0X00FFFFFF;//PC6.7设置成输入
GPIOC->CRL|=0X88000000;
GPIOC->CRH&=0XFFFFFFF0;//PC8,设置成输入
GPIOC->CRH|=0X08;
GPIOC->ODR|=0X1C0; //PC 6 7 8 上拉输入
}
//按键处理函数
u8 key_scan(void)
{
static u8 key_up=1;//按键按松开标志
u16 key_val=(GPIOC->IDR>>6)&0X07;
if(key_up&&key_val<7)//有按键按下
{
delay_ms(10);//去抖动
key_up=0;
key_val=(GPIOC->IDR>>6)&0X07;
switch(key_val)
{
case 6: return 1;
case 5: return 2;
case 3: return 3;
}
}else if(key_val==7)key_up=1;
return 0;// 无按键按下
}
主函数:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "key.h"
#include "led.h"
//正点原子
//2009/12/23
int main(void)
{
u8 time="0";
u8 L0=0,L1=0,L2=0;
Stm32_Clock_Init(9);//72M
delay_init(72); //延时初始化
//uart_init(72,9600); //设置波特率
led_init();
while (1)
{
switch(key_scan())
{
case 1:LED0_SET(L0);L0=!L0;break;
case 2:LED1_SET(L1);L1=!L1;break;
case 3:LED2_SET(L2);L2=!L2;break;
}
time++;
if(time==100)LED3_SET(0);
else if(time==200)
{
LED3_SET(1);
time=0;
}
delay_ms(5);
}
}
源码:
https://static.assets-stash.eet-china.com/album/old-resources/2009/12/23/8acf1ca3-92a7-4d25-a318-92ce58e8016b.rar
针对STMSKY网络开发板的代码:
https://static.assets-stash.eet-china.com/album/old-resources/2009/12/31/1ad6e001-94bd-4c71-b679-10e7e39cf914.rar
按键输入效果:
文章评论(0条评论)
登录后参与讨论