STM32驅動按鍵和LED燈實時顯示二進位制值

2021-10-25 17:56:08 字數 4702 閱讀 6646

基於stm32f407ze開發板的驅動按鍵和led燈實時顯示二進位制值應用例項:

要求:①按鍵s1按下變數+1

②按鍵s2按下變數-1

③按鍵s3按下變數清零

④led實時顯示這個變數的二進位制值(變數的範圍:0~15)

⑤工程管理(函式封裝)

檔案結構:

//key2被按下,且標誌位為1}if

(pein(3

)==0&& key ==1)

//key3被按下,且標誌位為1if(

pain(0

)==1||

pein(2

)==1||

pein(3

)==1)

//key1、key2、key3被鬆開

key =1;

//標誌位置1

sum(num)

;//二進位制實時顯示計數大小

}}

#ifndef __sys_h

#define __sys_h

#include

"stm32f4xx.h"

//io口操作巨集定義

#define bitband(addr, bitnum) ((addr & 0xf0000000)+0x2000000+((addr &0xfffff)<<5)+(bitnum<<2))

#define mem_addr(addr) *((volatile unsigned long *)(addr))

#define bit_addr(addr, bitnum) mem_addr(bitband(addr, bitnum))

//io口位址對映

#define gpioa_odr_addr (gpioa_base+20)

//0x40020014

#define gpiob_odr_addr (gpiob_base+20)

//0x40020414

#define gpioc_odr_addr (gpioc_base+20)

//0x40020814

#define gpiod_odr_addr (gpiod_base+20)

//0x40020c14

#define gpioe_odr_addr (gpioe_base+20)

//0x40021014

#define gpiof_odr_addr (gpiof_base+20)

//0x40021414

#define gpiog_odr_addr (gpiog_base+20)

//0x40021814

#define gpioh_odr_addr (gpioh_base+20)

//0x40021c14

#define gpioi_odr_addr (gpioi_base+20)

//0x40022014

#define gpioa_idr_addr (gpioa_base+16)

//0x40020010

#define gpiob_idr_addr (gpiob_base+16)

//0x40020410

#define gpioc_idr_addr (gpioc_base+16)

//0x40020810

#define gpiod_idr_addr (gpiod_base+16)

//0x40020c10

#define gpioe_idr_addr (gpioe_base+16)

//0x40021010

#define gpiof_idr_addr (gpiof_base+16)

//0x40021410

#define gpiog_idr_addr (gpiog_base+16)

//0x40021810

#define gpioh_idr_addr (gpioh_base+16)

//0x40021c10

#define gpioi_idr_addr (gpioi_base+16)

//0x40022010

//io口操作,只對單一的io口!

//確保n的值小於16!

#define paout(n) bit_addr(gpioa_odr_addr,n)

//輸出

#define pain(n) bit_addr(gpioa_idr_addr,n)

//輸入

#define pbout(n) bit_addr(gpiob_odr_addr,n)

//輸出

#define pbin(n) bit_addr(gpiob_idr_addr,n)

//輸入

#define pcout(n) bit_addr(gpioc_odr_addr,n)

//輸出

#define pcin(n) bit_addr(gpioc_idr_addr,n)

//輸入

#define pdout(n) bit_addr(gpiod_odr_addr,n)

//輸出

#define pdin(n) bit_addr(gpiod_idr_addr,n)

//輸入

#define peout(n) bit_addr(gpioe_odr_addr,n)

//輸出

#define pein(n) bit_addr(gpioe_idr_addr,n)

//輸入

#define pfout(n) bit_addr(gpiof_odr_addr,n)

//輸出

#define pfin(n) bit_addr(gpiof_idr_addr,n)

//輸入

#define pgout(n) bit_addr(gpiog_odr_addr,n)

//輸出

#define pgin(n) bit_addr(gpiog_idr_addr,n)

//輸入

#define phout(n) bit_addr(gpioh_odr_addr,n)

//輸出

#define phin(n) bit_addr(gpioh_idr_addr,n)

//輸入

#define piout(n) bit_addr(gpioi_odr_addr,n)

//輸出

#define piin(n) bit_addr(gpioi_idr_addr,n)

//輸入

#endif

#ifndef led_h

#define led_h

#include

#include

"../sys.h"

void

led_init()

;void

sum(

int n)

;#endif

#include

"led.h"

void

led_init()

void

sum(

int n)

#ifndef key_h

#define key_h

#include

#include

"../sys.h"

#include

"../delay/delay.h"

void

key_init()

;void

key_tone()

;#endif

#include

"key.h"

void

key_init()

//按鍵提示音

void

key_tone()

#ifndef delay_h

#define delay_h

#include

#include

"../sys.h"

void

delay_ms

(int ms)

;#endif

#include

"delay.h"

void

delay_ms

(int ms)

//延時函式

小結 stm32 驅動LED燈

使用位帶操作,位帶操作就是把每個位元膨脹成乙個32位的字,當訪問這些字的時候就訪問這些位元位。然後,埠使能 pb5 pe5 led io void led init void gpio setbits gpiob,gpio pin 5 這個必須要寫,取位址。gpio setbits gpiob,gp...

stm32學習筆記之按鍵驅動Led

由於實驗與按鍵有關,既然有按鍵,那就必須要解釋下按鍵消抖。原理 讀取按鍵電平 按下為1,鬆開為0 當讀到1的時候 按鍵好像被按下了 那麼我們延時10ms再讀 若按鍵讀到為1 說明按鍵真的被按下了 執行操作 若按鍵讀到為0 說明這只是一次機械抖動,咱們不用理他!基於按鍵消抖原理編的按鍵掃瞄函式 int...

STM32的LED燈實驗

實驗目的 讓我的開發板的led燈亮滅閃爍 實驗程式 led.c include stm32f4xx.h 在system目錄下可以找到,把st官方的部分庫抽取出來,組成了乙個system目錄 include sys.h void led init void led.h ifndef led h def...