1. 程式人生 > >嵌入式系統學習——STM32之按鍵輸入

嵌入式系統學習——STM32之按鍵輸入

  之前寫了兩篇關於STM32 GPIO的介紹和運用,跑馬燈用到了GPIO的推輓輸出,但是對於輸入還是沒有用到,這次就運用一下GPIO的上拉輸入。實驗還是和以前51做的實驗一樣,就是判斷按鍵的輸入,然後控制LED燈。這次沒有直接配置暫存器,而是呼叫庫函式和位操作結合。

注:每一塊開發板對應電路都不相同,編寫程式碼需要對應自己的板子,本人兩個LED燈對應的GPIO為:GPIOD13和GPIOD14,並且是共陰極。兩個按鍵對應的GPIO為:GPIOC13和GPIOE0,並且共陰極。

                    

首先,LED初始化和上一篇部落格中的跑馬燈初始化一樣,只需拷貝就可以了。

LED初始化函式:

#include "sys.h"

#define LED1 PDout(13)// PB13
#define LED2 PDout(14)// PB14	
void LED_Init(void)
{
	GPIO_InitTypeDef GPIOINIT;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
	
	GPIOINIT.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIOINIT.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
	GPIOINIT.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOD, &GPIOINIT);
	
	GPIO_ResetBits(GPIOD, GPIO_Pin_13 | GPIO_Pin_14);
}
按鍵輸入最關鍵的是對按鍵的初始化和輸入判斷。這裡按鍵的初始化與LED的初始化不同的是GPIO的模式不一樣了,LED是推輓輸出,按鍵則相反,是輸入,這個時候要考慮是哪一種輸入方式,這裡我的板子上按鍵是共陰極的,所以當按鍵按下的時候IO口輸入的低電平,所以我需要在IO口接上拉電阻,使用上拉輸入模式。

按鍵初始化函式:

#include "stm32f10x.h"

#define KEY0 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13)		//讀取GPIOC13的輸入
#define KEY1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_0)		//讀取GPIOE0的輸入

#define KEY0_PRESS	1			
#define KEY1_PRESS  2

void KEY_Init(void)
{
	GPIO_InitTypeDef GPIOInit;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE, ENABLE);
	
	GPIOInit.GPIO_Mode = GPIO_Mode_IPU;
	GPIOInit.GPIO_Pin = GPIO_Pin_13;
	GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOC, &GPIOInit);
	
	GPIOInit.GPIO_Mode = GPIO_Mode_IPU;		//上拉輸入
	GPIOInit.GPIO_Pin = GPIO_Pin_0;
	GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOE, &GPIOInit);
}


對於按鍵輸入來說,怎麼判斷是連續按,還是不連續按,這是一個重點。以前是將兩種情況分開考慮,寫成了兩個函式,然後判斷,其實,這個可以寫成一個函式,只需新增一個選擇形參,然後對形參進行判斷操作即可。

按鍵輸入函式:

//按鍵處理函式
//返回按鍵值
//mode:0不支援連續按;1支援連續按
//0,沒有按鍵按下
//1,key0按下
//2,key1按下

unsigned char KEY_Scan(unsigned char mode)
{
	static unsigned char key_up = 1;    //按鍵鬆開標誌
	
	if(mode)
	{
		key_up = 1;						//支援連續按
	}
	
	if(key_up && (KEY0 == 0 || KEY1 == 0))
	{
		delay_ms(10);					//去抖
		key_up = 0;
		if(KEY0 == 0)		
			return KEY0_PRESS;
		else if(KEY1 == 0)  
			return KEY1_PRESS;
	}
	else if(KEY0 == 1 && KEY1 == 1)
	{
		key_up = 1;
	}
	return 0;		//無按鍵按下
}

主函式:

#include "led.h"
#include "key.h"
#include "stm32f10x.h"
#include "delay.h"

int main(void)
{
	u8 key;
	LED_Init();
	delay_init();
	KEY_Init();
	LED1=1;	
	while(1)
	{
		key = KEY_Scan(0);
		if(key == 1)
		{
			LED1=!LED1;
		}
		else if(key == 2)
		{
			LED3=!LED3;
		}
		delay_ms(10);	
	}
}

參考:開源電子網

相關推薦

嵌入式系統學習——STM32按鍵輸入

  之前寫了兩篇關於STM32 GPIO的介紹和運用,跑馬燈用到了GPIO的推輓輸出,但是對於輸入還是沒有用到,這次就運用一下GPIO的上拉輸入。實驗還是和以前51做的實驗一樣,就是判斷按鍵的輸入,然後控制LED燈。這次沒有直接配置暫存器,而是呼叫庫函式和位操作結合。 注

嵌入式系統學習——STM32TFT漢字顯示

常用漢字編碼 GB2312 GB13000 GBK BIG5(繁體) 漢字顯示原理 漢字在液晶上的顯示其實就是一些點的顯示與不顯示,這就相當於我們的筆一樣,有筆經過的地方就畫出來,沒經過的地方就不畫

嵌入式系統學習——STM32FATFS檔案系統

檔案系統是什麼? 負責管理和儲存檔案資訊的軟體機構稱為檔案管理系統,簡稱檔案系統。 即在磁碟上組織檔案的方法。 常用的檔案系統: -FAT / FATFS -NTFS: 基於安全性的檔案系統,是W

嵌入式系統學習——STM32電容型觸控式螢幕

觸控式螢幕   觸控式螢幕(touch screen)又稱為“觸控屏”、“觸控面板”,是一種可接收觸頭等輸入訊號的感應式裝置。作為一種新型的電腦輸入裝置,可以用來取代傳統的機械按鍵等輸入裝置。它是目前

嵌入式系統學習——STM32RTOS系統UCOS介紹與移植

前後臺系統:         早期嵌入式開發沒有嵌入式作業系統的概念,直接操作裸機,在裸機上寫程式,比如用51微控制器基本就沒有作業系統的概念。通常把程式分為兩部分:前臺系統和後臺系統。         簡單的小系統通常是前後臺系統,這樣的程式包括一個死迴圈和若干個中斷服務

嵌入式系統學習——STM32SD卡(下)

SDIO簡介-SDIO暫存器 SDIO電源控制暫存器(SDIO_POWER)         該暫存器只有最低2位(PWRCTRL[1:0])有效,其他都是保留位,STM32復位以後,PWRCTRL

計算機三級嵌入式系統學習筆記3

嵌入式最小硬體系統組成: 電源電路 電源模組由以下幾部分組成: 交流變直流(AC-DC) 直流到直流(DC-DC) 低壓差穩壓器(LDO) 時鐘電路 復位電路 除錯測試介面(JTAG測試介面)

STM32學習筆記GPIO輸入與輸出

        1、核心點:對於任意MCU中的外設(模組)操作方法:都是找該模組的工作框圖,根據框圖來寫程式        對於ST中的任何一個外設,都是掛載在不同的時鐘線下的,所有的時鐘線預設都是關閉的;在使用該外設之前,要開啟該外設的時鐘        步驟1 :    

經驗分享:嵌入式系統學習步驟

淩陽教育 嵌入式 嵌入式學習的朋友們,想要學好嵌入式嗎?我們該如何學好嵌入式?看看淩陽教育的老師為大家帶來的一些方便大家了解的嵌入式學習路線與步驟: 1、Linux 基礎 安裝Linux操作系統 Linux文件系統 Linux常用命令 Linux啟動過程詳解 熟悉Linux服務能夠

input按鍵輸入

input.h amp spa 框架 col 通過 fin inux sizeof 通過直接操作驅動來監控鍵盤,只要程序一旦在後臺啟動,無論在任何頁面都可以監控到按鍵的數值。 步驟如下: 1.找到鍵盤掛在點:有兩種方法   方法一:在 /dev/input路徑下通過

系統學習前端FormData詳解

pan 3.2 第一個 實例 open password 訪問表 -name 訪問 FormData1. 概述FormData類型其實是在XMLHttpRequest 2級定義的,它是為序列化表以及創建與表單格式相同的數據(當然是用於

系統學習redis三——redis數據類型string類型及操作

例子 原來 等於 code 上一個 test 類型 一個 字符 redis數據類型介紹 redis數據類型有string類型、hash類型、list類型、set類型、zset類型等。 string類型及操作 string是最簡單的類型,一個key對應一個value,stri

系統學習redis四——redis數據類型hash類型及操作

。。 del code 操作 redis數據類型 src hms 添加 數據類型 hashes數據類型 Redis的hash是一個string類型的field(字段)和value的映射表。它的添加、刪除操作都是0/1(平均操作法)。hash特別適合用於存儲對象。相較於將對象

系統學習redis五——redis數據類型list類型及操作

hello 保留 個數 描述 查詢 元素 例如 ltr 插入 list數據類型介紹 list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的所有值等等,操作中key可以理解為鏈表的名字。redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。

系統學習redis七——redis數據類型zset數據類型及操作

升序 順序 cores 修改 但是 增加 string類型 所有 ger sourted sets數據類型介紹 sorted set是set的一個升級版本,他在set的基礎上增加了一個順序屬性。這一屬性在修改元素的時候可以指定,每次指定後,zset會自動按照新的值調整順序,

系統學習redis八——redis常用命令

指定 flushdb ... integer and ron 格式 包括 代碼高亮 redis提供了豐富的命令對數據庫和各種數據庫類型進行操作,這些命令可以在linux終端使用,包括以下兩種:1、鍵值相關命令2、服務器相關命令 redis命令介紹 一、鍵值相關命令 key

C語言嵌入式系統程式設計修煉

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

spring系統學習--spirngMVC檢視分發

   前面花了一部分時間整理springWebMvc的環境,試圖將我想要表達的內容說出來。 但是感覺並不是很滿意。 不過生活還是要繼續哈哈哈。  趕緊將自己的練習記錄起來,萬一忘了俺就太虧了。。。(環境仍然是基於上一篇的環境:環境) spirngmvc完成試圖的分發

spring系統學習--spirngMVC異常處理

   本篇內容記錄一下springMVC的異常處理內容。  環境是:springmvc環境搭建 過程如下:         1,將錯誤處理的bean類註冊到上下文中。  該bean需要實現一個介面:

spring系統學習--spirngMVCsession管理

   繼續把spirngmvc的關於session管理的筆記記一下。 第一步:  新建相關處理邏輯的控制器: package com.automannn.springMVC_practice.controller; import org.springframe