一、開(kāi)發(fā)板按鍵設(shè)置
在"STM32-PZ6806L"開(kāi)發(fā)板上除了復(fù)位按鍵外,還設(shè)計(jì)了4個(gè)按鍵,分別標(biāo)為"UP"、"DOWN"、"LEFT"和"RIGHT",其電路如下:
根據(jù)電路連接得知K_UP按鍵一端與GPIOA_0連接,另一端通過(guò)一個(gè)1KΩ電阻接3.3V,所以在對(duì)GPIOA_0配置時(shí)應(yīng)設(shè)置工作方式為“下拉輸入”,當(dāng)按鍵松開(kāi)時(shí)為低電平,按鍵按下時(shí)為高電平;K_LEFT、K_DOWN和K_RIGHT三個(gè)按鍵的一端分別與GPIOE_2、GPIOE_3和GPIOE_4相連,另一端接地,所以對(duì)GPIOE_2、GPIOE_3和GPIOE_4要配置為“上拉輸入”方式,按鍵松開(kāi)時(shí)為高電平,按鍵按下時(shí)為低電平。
二、項(xiàng)目基本配置
該項(xiàng)目在音樂(lè)播放項(xiàng)目基礎(chǔ)上設(shè)計(jì)。實(shí)現(xiàn)分別按這四個(gè)鍵時(shí),蜂鳴器發(fā)出不同的聲音。音樂(lè)播放項(xiàng)目實(shí)現(xiàn)參看:使用STM32控制無(wú)源蜂鳴器發(fā)聲播放音樂(lè)(STM32_07)
1、復(fù)制pMusic項(xiàng)目文件夾,將文件夾改名為"pKey";
2、在"pKey/User"文件夾下新建"Key"文件夾;
3、使用"Keil uVision5"打開(kāi)"pKey"文件夾下的項(xiàng)目"pMusic"(項(xiàng)目名稱沒(méi)有改變);
4、新建"key.h"和"key.c"文件,保存在"pKey/User/Key"文件夾中;
5、將"key.c"文件添加到項(xiàng)目的"User"組中;
6、配置項(xiàng)目,在"C/C++"選項(xiàng)卡中的"Include Paths"中添加對(duì)".UserKey"路徑的包含,便于其他程序包含"key.h"頭文件時(shí),系統(tǒng)能找到。
三、編程實(shí)現(xiàn)按鍵功能
1、"key.h"頭文件程序
在頭文件中定義按鍵GPIO端口宏、按鍵引腳宏和讀取引腳值的宏,定義Key_Init和ReadKey兩個(gè)函數(shù)的聲明。內(nèi)容如下:
#ifndef __KEY__H
#define __KEY__H
#include "system.h"
#include "stm32f10x_gpio.h"
#define KEY_UP_PORT GPIOA
#define KEY_OTHER_PORT GPIOE
#define KEY_UP GPIO_Pin_0
#define KEY_LEFT GPIO_Pin_2
#define KEY_DOWN GPIO_Pin_3
#define KEY_RIGHT GPIO_Pin_4
//使用庫(kù)函數(shù)方式讀取按鍵
#define K_UP GPIO_ReadInputDataBit(KEY_UP_PORT, KEY_UP)
#define K_LEFT GPIO_ReadInputDataBit(KEY_OTHER_PORT, KEY_LEFT)
#define K_DOWN GPIO_ReadInputDataBit(KEY_OTHER_PORT, KEY_DOWN)
#define K_RIGHT GPIO_ReadInputDataBit(KEY_OTHER_PORT, KEY_RIGHT)
void Key_Init(void);
u8 ReadKey(u8 mode);
#endif
2、"key.c"程序文件程序
"Key_Init"函數(shù)實(shí)現(xiàn)對(duì)GPIOA和GPIOE的使能,配置GPIOA_0為下拉輸入方式,配置GPIOE_2、GPIOE_3和GPIOE_4為上拉輸入方式。"ReadKey"函數(shù)實(shí)現(xiàn)按鍵掃描,通過(guò)參數(shù)"mode"選擇單次掃描(mode=0, 按鍵從按下到松開(kāi)為一次按鍵)和連續(xù)掃描(mode=1,按鍵按下時(shí)到松開(kāi)可以被視為多次按鍵)。
#include "key.h"
#include "stm32f10x_Rcc.h"
#include "SysTick.h"
void Key_Init()
{
GPIO_InitTypeDef GPIO_mode;
//使能GPIOA和GPIOE時(shí)鐘
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOE, ENABLE );
GPIO_mode.GPIO_Mode = GPIO_Mode_IPD;
GPIO_mode.GPIO_Pin = KEY_UP;
GPIO_mode.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_UP_PORT,&GPIO_mode);
GPIO_mode.GPIO_Mode = GPIO_Mode_IPU;
GPIO_mode.GPIO_Pin = KEY_DOWN|KEY_LEFT|KEY_RIGHT;
GPIO_mode.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_OTHER_PORT,&GPIO_mode);
}
/*
mode=0--單次掃描
mode=1--連續(xù)掃描
*/
u8 ReadKey(u8 mode)
{
static u8 key = 1;
if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))
{
delay_ms(10);
key = 0;
if(K_UP==1)
{
return 1;
}
else if(K_DOWN==0)
{
return 2;
}
else if(K_LEFT==0)
{
return 3;
}
else if(K_RIGHT==0)
{
return 4;
}
}
else if(K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)//按鍵松開(kāi)
{
key = 1;
}
if(mode==1)
{
key = 1;
}
return 0;
}
3、"main.c"程序
在主函數(shù)中,首先初始化SysTick、蜂鳴器IO口、Key按鍵IO口,然后反復(fù)讀取按鍵,根據(jù)按鍵值調(diào)用"beep.c"中的Sound函數(shù)實(shí)現(xiàn)發(fā)聲。程序如下:
#include "beep.h"
#include "SysTick.h"
#include "key.h"
int main()
{
u8 key, i;
u16 tone[] = {0,262,294,330,349};
SysTick_Init(72);
BEEP_Init();
Key_Init();
while(1)
{
key = ReadKey(0);
if(key!=0){
for(i=0; i<100;i++)
Sound(tone[key]);
}
}
}
4、下載hex文件到開(kāi)發(fā)板,按"UP"、"DOWN"、"LEFT"和"RIGHT"能聽(tīng)到蜂鳴器發(fā)出Do,Re,Mi,F(xiàn)a的聲音。
上一篇:STM32外部中斷方式按鍵操作(STM32_09)
下一篇:在STM32項(xiàng)目中使用SysTick實(shí)現(xiàn)延時(shí)(STM32_06)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 阿里黑科技落地!夸克AI眼鏡全球首發(fā),高德、淘寶、支付寶都能用
- 化繁為簡(jiǎn), 適配復(fù)雜磁場(chǎng)環(huán)境,MT73xx 3D雙路輸出霍爾鎖存器賦能車(chē)規(guī)電機(jī)精準(zhǔn)控制
- 9.5億美元收購(gòu)恩智浦MEMS傳感器業(yè)務(wù),意法半導(dǎo)體 在傳感器領(lǐng)域的地位再升級(jí)
- 高性能電動(dòng)滑板車(chē) BLDC 電機(jī)驅(qū)動(dòng)器:技術(shù)解析與應(yīng)用展望
- 5G工業(yè)網(wǎng)關(guān)的“邊緣計(jì)算+AI推理”一體化設(shè)計(jì),PLC協(xié)議解析與缺陷檢測(cè)的實(shí)時(shí)聯(lián)動(dòng)
- AR眼鏡的“工業(yè)指令投射”系統(tǒng),SLAM的空間定位、PLC數(shù)據(jù)實(shí)時(shí)疊加顯示
- 多光譜氣體傳感器的抗交叉干擾設(shè)計(jì)
- 多模態(tài)融合感知的“語(yǔ)義-幾何”聯(lián)合建模
- 工業(yè)觸摸屏的“壓感-手勢(shì)”多模態(tài)交互設(shè)計(jì)
- 工業(yè)機(jī)器人高精度力控的“雙模融合”傳感器設(shè)計(jì)
- 東芝推出用于短距離數(shù)據(jù)傳輸?shù)膯蜗蚬饽K適配器
- 光伏并網(wǎng)、光儲(chǔ)和用戶側(cè)儲(chǔ)能系統(tǒng)哪個(gè)最具投資價(jià)值?
- 2018Medtec中國(guó)展,不容錯(cuò)過(guò)??!
- 安森美半導(dǎo)體榮獲“年度杰出合作供應(yīng)商獎(jiǎng)”
- 藍(lán)牙Mesh采用數(shù)量大大超出預(yù)期
- 數(shù)據(jù)資源成各國(guó)數(shù)字經(jīng)濟(jì)新競(jìng)爭(zhēng)點(diǎn)
- 天津大學(xué)研究出了3D打印模塊式軟體機(jī)器人
- 微創(chuàng)醫(yī)療擬登陸科創(chuàng)板
- 研究人員開(kāi)發(fā)出能夠預(yù)測(cè)另一臺(tái)機(jī)器人意圖的機(jī)器人
- 激光雷達(dá)第一股禾賽科技擬科創(chuàng)板上市募資20億
- 請(qǐng)教一個(gè)小問(wèn)題
- 看看這個(gè)延時(shí)函數(shù)有毛病嗎
- protell 99se經(jīng)典教程
- 找 arabic 字體,求助,我在網(wǎng)上找了兩天了也沒(méi)找到。
- 12V700MA 電源方案
- 全MOS運(yùn)放電路的調(diào)試
- 為什么EVC編程用USB下載老不通?
- 有獎(jiǎng)直播:安森美先進(jìn)的封裝和驅(qū)動(dòng)技術(shù)助力碳化硅能源應(yīng)用 報(bào)名開(kāi)始啦~
- 后來(lái)我發(fā)現(xiàn)這么早注冊(cè)的我居然威望是負(fù)數(shù)的
- multisim仿真感覺(jué)波形不對(duì)