文章目錄
- 1 單片機最小系統板按鍵原理圖介紹
- 2 庫函數程序設計
- 3 寄存器程序設計
- 4 效果展示
1 單片機最小系統板按鍵原理圖介紹
從圖中看出單片機的PB12引腳接到了按鍵上。
根據按鍵的原理圖,可以分析得到,如果不按下按鍵的時候,引腳輸入的是高電平。按下按鍵的時候,引腳輸入的是低電平。
2 庫函數程序設計
main.c文件。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "stdio.h"int main(void)
{RCC->APB2ENR |= (uint32_t)0x00000010;//打開GPIOC時鐘GPIOC->CRH &= (uint32_t)0xFF0FFFFF;//使用前清零GPIOC->CRH |= (uint32_t)0x00300000;//配置PC13為推挽輸出,最大速度50MHzDelay_Init();Usart_Init(115200);Key_Init();printf("hello world!\r\n");while(1){GPIOC->BSRR = (uint32_t)0x00002000;//PC13引腳輸出高電平Delay_ms(100); //延時100msGPIOC->BRR = (uint16_t)0x2000; //PC13引腳輸出低電平Delay_ms(100); //延時100msif(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0){Delay_ms(10); if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)printf("key is pressed!\r\n");}}
}
key.c文件。
#include "stm32f10x.h"
#include "key.h" void Key_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//開啟GPIOB時鐘GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PB12GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //頻率為50mhzGPIO_Init(GPIOB,&GPIO_InitStructure); //初始化
}
key.h文件。
#ifndef __KEY_H
#define __KEY_Hvoid Key_Init(void);#endif
3 寄存器程序設計
因為寄存器操作可以直接在main.c
文件中寫完,這里只提供給大家main.c
文件哈。
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "key.h"
#include "stdio.h"int main(void)
{RCC->APB2ENR |= (uint32_t)0x00000010;//打開GPIOC時鐘GPIOC->CRH &= (uint32_t)0xFF0FFFFF;//使用前清零GPIOC->CRH |= (uint32_t)0x00300000;//配置PC13為推挽輸出,最大速度50MHzDelay_Init();Usart_Init(115200);//庫函數版本
// //---------------------------------------------------------//
// Key_Init();//---------------------------------------------------------////寄存器版本//---------------------------------------------------------//RCC->APB2ENR |= (uint32_t)0x00000008;//打開GPIOB時鐘GPIOB->CRH &= (uint32_t)0xFFF0FFFF;//使用前清零GPIOB->CRH |= (uint32_t)0x00080000;//配置PB12為上/下拉輸入GPIOB->BSRR = (uint32_t)0x00001000;//配置PB12為上拉//---------------------------------------------------------//printf("hello world!\r\n");while(1){GPIOC->BSRR = (uint32_t)0x00002000;//PC13引腳輸出高電平Delay_ms(100); //延時100msGPIOC->BRR = (uint16_t)0x2000; //PC13引腳輸出低電平Delay_ms(100); //延時100ms//庫函數版本//---------------------------------------------------------//
// if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)
// {
// Delay_ms(10);
// if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)
// printf("key is pressed!\r\n");
// }//---------------------------------------------------------////寄存器版本//---------------------------------------------------------//if((GPIOB->IDR & (uint16_t)0x1000) == 0){Delay_ms(10);if((GPIOB->IDR & (uint16_t)0x1000)== 0)printf("key is pressed!\r\n");}//---------------------------------------------------------//}
}