<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

stm32矩陣鍵盤原理圖及程序介紹

jf_f8pIz0xS ? 來源:電子發燒友整理 ? 2018-02-09 11:30 ? 次閱讀

STM32F0 系列產品基于超低功耗的 ARM Cortex-M0 處理器內核,整合增強的技術和功能,瞄準超低成本預算的應用。該系列微控制器縮短了采用 8 位和 16 位微控制器的設備與采用 32 位微控制器的設備之間的性能差距,能夠在經濟型用戶終端產品上實現先進且復雜的功能。本文為大家介紹stm32矩陣鍵盤原理圖及程序

stm32矩陣鍵盤原理圖

stm32矩陣鍵盤原理圖及程序介紹

stm32矩陣鍵盤原理圖及程序介紹

stm32矩陣鍵盤原理圖及程序介紹

stm32矩陣鍵盤程序介紹

主要實現:掃描矩陣鍵盤,將檢測到的數據通過spi 通信發送到數碼管顯示。

主要步驟:

1:初始化時鐘

void RCC_Configuration(void)

{

//----------使用外部RC晶振-----------

RCC_DeInit(); //初始化為缺省值

RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速時鐘

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速時鐘使能就緒

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer

FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state

RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK

RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ

RCC_PLLCmd(ENABLE); //Enable PLLCLK

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock

while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source

}

2:配置管腳

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

SPI_InitTypeDef SPI_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//開啟GPIOD外設時鐘

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//D0~D3

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉輸入

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//D4~D7

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出

GPIO_Init(GPIOD, &GPIO_InitStructure);

//初始化管腳電平

GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3);

GPIO_ResetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_SPI1, ENABLE); //開啟SPI1和GPIOA外設時鐘

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//設置SPI的四個引腳模式

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //設置GPIO A1管腳 用于鎖存74HC595輸出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽輸出

GPIO_Init(GPIOA, &GPIO_InitStructure);

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI數據模式 雙線雙向全雙工

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI工作模式 主模式

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //設置SPI數據大小

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //設置時鐘的極性

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //設置時鐘的相位

SPI_InitStructure.SPI_NSS = SPI_NSS_Hard; //NSS腳硬件置位

SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_64;//預分頻值

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;// 數據從高位傳輸

SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值

SPI_I2S_DeInit(SPI1); //將外設SPI1寄存器重設為缺省值;

SPI_Init(SPI1, &SPI_InitStructure);

SPI_Cmd(SPI1, ENABLE);//使能SPI1外設

}

3:編寫矩陣鍵盤掃描函數KEY.c

u8 shu=16;

void KeyScan(void)

{

u8 i;

if((GPIO_ReadInputData(GPIOD) & 0x0f) != 0x0f )

{

Delay_MS(20);

if((GPIO_ReadInputData(GPIOD) & 0x0f) != 0x0f )

{

GPIO_SetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6);

GPIO_ResetBits(GPIOD, GPIO_Pin_7);

switch(GPIO_ReadInputData(GPIOD) & 0x0f)

{

case 0x07: shu=0; break;

case 0x0b: shu=1; break;

case 0x0d: shu=2; break;

case 0x0e: shu=3; break;

}

GPIO_SetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_7);

GPIO_ResetBits(GPIOD, GPIO_Pin_6);

switch(GPIO_ReadInputData(GPIOD) & 0x0f)

{

case 0x07: shu=4; break;

case 0x0b: shu=5; break;

case 0x0d: shu=6; break;

case 0x0e: shu=7; break;

}

GPIO_SetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_6| GPIO_Pin_7);

GPIO_ResetBits(GPIOD, GPIO_Pin_5);

switch(GPIO_ReadInputData(GPIOD) & 0x0f)

{

case 0x07: shu=8; break;

case 0x0b: shu=9; break;

case 0x0d: shu=10; break;

case 0x0e: shu=11; break;

}

GPIO_SetBits(GPIOD, GPIO_Pin_7 | GPIO_Pin_5| GPIO_Pin_6);

GPIO_ResetBits(GPIOD, GPIO_Pin_4);

switch(GPIO_ReadInputData(GPIOD) & 0x0f)

{

case 0x07: shu=12; break;

case 0x0b: shu=13; break;

case 0x0d: shu=14; break;

case 0x0e: shu=15; break;

}

GPIO_SetBits(GPIOD, GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3);

GPIO_ResetBits(GPIOD, GPIO_Pin_4 | GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7);

while((i《50)&&((GPIO_ReadInputData(GPIOD) & 0x0f) != 0x0f))

{

i++;

Delay_MS(10);

}

}

}

}

4: SPI傳送數據函數

void Display_Data(u8 data)

{

u8 i=data;

PAOut(1)=0;

SPI_I2S_SendData(SPI1,DSY_CODE[i]);

Delay_MS(2);

PAOut(1)=1;

Delay_MS(1000);

}

5:主函數

#include“stm32f10x_lib.h”

#include

#include“Exboard.h”

u8 DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};

int main(void)

{ //u8 i;

RCC_Configuration();

GPIO_Configuration();

//EXTI_Configuration();

//NVIC_Configuration();

while(1)

{

KeyScan();

Display_Data(shu);

}

}

附錄:Exboard.h

#ifndef _EXBOARD_H

#define _EXBOARD_H

#endif

#include“stm32f10x_lib.h”

#define GPIOA_IDR (GPIOA_BASE+0x08)

#define GPIOA_ODR (GPIOA_BASE+0x0c)

#define GPIOB_IDR (GPIOB_BASE+0x08)

#define GPIOB_ODR (GPIOB_BASE+0x0c)

#define GPIOC_IDR (GPIOC_BASE+0x08)

#define GPIOC_ODR (GPIOC_BASE+0x0c)

#define GPIOD_IDR (GPIOD_BASE+0x08)

#define GPIOD_ODR (GPIOD_BASE+0x0c)

#define GPIOE_IDR (GPIOE_BASE+0x08)

#define GPIOE_ODR (GPIOE_BASE+0x0c)

#define GPIOF_IDR (GPIOF_BASE+0x08)

#define GPIOF_ODR (GPIOF_BASE+0x0c)

#define GPIOG_IDR (GPIOG_BASE+0x08)

#define GPIOG_ODR (GPIOG_BASE+0x0c)

#define BitBang(Addr,BitNum) *((volatile unsigned long*)(((Addr&0xf0000000)+ 0x2000000)+(((Addr&0xfffff)《《5)+(BitNum《《2))))

#define PAIn(n) BitBang(GPIOA_IDR,n)

#define PAOut(n) BitBang(GPIOA_ODR,n)

#define PBIn(n) BitBang(GPIOB_IDR,n)

#define PBOut(n) BitBang(GPIOB_ODR,n)

#define PCIn(n) BitBang(GPIOC_IDR,n)

#define PCOut(n) BitBang(GPIOC_ODR,n)

#define PDIn(n) BitBang(GPIOD_IDR,n)

#define PDOut(n) BitBang(GPIOD_ODR,n)

#define PEIn(n) BitBang(GPIOE_IDR,n)

#define PEOut(n) BitBang(GPIOE_ODR,n)

#define PFIn(n) BitBang(GPIOF_IDR,n)

#define PFOut(n) BitBang(GPIOF_ODR,n)

#define PGIn(n) BitBang(GPIOG_IDR,n)

#define PGOut(n) BitBang(GPIOG_ODR,n)

#define KEY1 PEIn(0)

#define LED1 PDOut(13)

#define KEY2 PCIn(13)

#define LED2 PGOut(14)

void Delay_MS(u16 dly);

/

void RCC_Configuration(void);

void GPIO_Configuration(void);

//void EXTI_Configuration(void);

//void NVIC_Configuration(void);

extern void KeyScan(void);

void Display_Data(u8 data);

extern u8 shu;

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2244

    文章

    10684

    瀏覽量

    349459
  • 矩陣鍵盤
    +關注

    關注

    7

    文章

    204

    瀏覽量

    31207
收藏 人收藏

    評論

    相關推薦

    求助:4*4矩陣鍵盤原理圖

    各位大俠,小弟初學,求一個4*4矩陣鍵盤原理圖,不勝感激小弟郵箱:619018859@qq.com
    發表于 07-30 14:45

    點陣型LCD_和矩陣鍵盤電路原理圖

    本帖最后由 azsxdcfv1871514 于 2013-1-6 14:29 編輯 點陣型LCD_和矩陣鍵盤電路原理圖
    發表于 08-03 12:41

    什么是矩陣鍵盤

    矩形鍵盤介紹什么是矩陣鍵盤矩陣鍵盤的原理驅動電路
    發表于 01-07 07:43

    矩陣鍵盤和獨立鍵盤的原理介紹

    學到矩陣鍵盤這一塊對網上別人寫的C代碼有些疑問,希望有能看到的大牛幫助解答。矩陣鍵盤和獨立鍵盤原理圖
    發表于 01-13 08:10

    分享STM32矩陣鍵盤掃描及處理的一些經驗

    STM32矩陣鍵盤掃描及處理前言由于最近幫做一個畢業設計需要用到直接輸入目標值去控制輸出,所以才寫這么一個按鍵處理的程序。對于一個才接觸單片機沒多久的大學生菜鳥來說,實現畢設里的每一
    發表于 02-21 06:28

    分享一個stm32矩陣鍵盤程序

    分享一個stm32矩陣鍵盤程序
    發表于 10-10 08:26

    4x4矩陣鍵盤程序原理圖PCB

    4x4矩陣鍵盤程序原理圖PCB,供大家下載。
    發表于 12-21 18:25 ?0次下載

    4X4矩陣鍵盤原理圖

    鍵盤矩陣原理圖
    發表于 02-28 22:35 ?0次下載

    矩陣鍵盤有什么用_矩陣鍵盤有何用途

    本文開始介紹了什么是矩陣鍵盤矩陣鍵盤的組成結構,其次詳細闡述了矩陣
    發表于 02-24 14:01 ?1.6w次閱讀

    4*4矩陣鍵盤驅動程序

    4*4矩陣鍵盤驅動程序
    發表于 11-15 11:51 ?6次下載
    4*4<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>驅動<b class='flag-5'>程序</b>

    基于 STM32F407 使用 4*4 矩陣鍵盤(附完整程序

    STM32F407使用4*4矩陣鍵盤
    發表于 11-20 12:21 ?90次下載
    基于 <b class='flag-5'>STM32</b>F407 使用 4*4 <b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>(附完整<b class='flag-5'>程序</b>)

    STM32f103c8t6矩陣鍵盤程序(串口通信)資料匯總

    STM32f103c8t6矩陣鍵盤程序(串口通信)資料匯總
    發表于 12-08 17:44 ?71次下載

    STM32矩陣鍵盤掃描及處理

    STM32矩陣鍵盤掃描及處理前言由于最近幫做一個畢業設計需要用到直接輸入目標值去控制輸出,所以才寫這么一個按鍵處理的程序。對于一個才接觸單片機沒多久的大學生菜鳥來說,實現畢設里的每一
    發表于 12-27 18:26 ?39次下載
    <b class='flag-5'>STM32</b>的<b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>掃描及處理

    51單片機矩陣鍵盤原理圖

    51單片機矩陣鍵盤原理圖
    發表于 12-30 11:32 ?66次下載

    stm32矩陣鍵盤程序

    電子發燒友網站提供《stm32矩陣鍵盤程序.zip》資料免費下載
    發表于 10-07 15:07 ?11次下載
    <b class='flag-5'>stm32</b><b class='flag-5'>矩陣</b><b class='flag-5'>鍵盤</b>的<b class='flag-5'>程序</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>