原创 跟我学STM32之2 按键输入

2009-12-31 21:09 3866 9 9 分类: MCU/ 嵌入式

之前讲了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


按键输入效果:


点击看大图

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /1 下一条