学习STM32编程——按键扫描键控流水灯

(1) 2024-09-19 09:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
学习STM32编程——按键扫描键控流水灯,希望能够帮助你!!!。

关键代码

uint8_t Key_Scan(uint8_t mode)

{

static uint8_t key_up=1;

if(mode) key_up=1;

if(key_up && (KEY_L==0||KEY_D==0||KEY_R==0||KEY_U==1))

{

delay_ms(20);

key_up=0;

if(KEY_L==0) return KEY_L_PRESS;

else if(KEY_D==0) return KEY_D_PRESS;

else if(KEY_R==0) return KEY_R_PRESS;

else if(KEY_U==1) return KEY_U_PRESS;

}

else if(KEY_L==1&&KEY_D==1&&KEY_R==1&&KEY_U==0)

{

key_up=1;

}

return 0;

}

uint8_t keyValue=0;

LED_WorkModeTypeDef myLEDWorkMode=LED_MODE1;

int main(void)

{

delay_init(168);

LED_Init();

Key_Init();

while(1)

{

keyValue=Key_Scan(0);

switch(keyValue)

{

case KEY_L_PRESS:

myLEDWorkMode=LED_MODE1;

break;

case KEY_D_PRESS:

myLEDWorkMode=LED_MODE2;

break;

case KEY_R_PRESS:

myLEDWorkMode=LED_MODE3;

break;

default:

break;

}

if(myLEDWorkMode==LED_MODE1)

{

LED_Mode1(1000);

}

else if(myLEDWorkMode==LED_MODE2)

{

LED_Mode2();

}

else if(myLEDWorkMode==LED_MODE3)

{

LED_Mode3();

}

}

}

遇到坑,添加如下代码解决

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x+((addr &0xFFFFF)<<5)+(bitnum<<2)) //将位带区地址转换为位带别名区地址

#define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) //表示该十六进制数为地址,并允许直接对其内容进行操作进行操作(其中的volatile关键字常用于寄存器定义,表示从内存重新装载内容,而不是从寄存器拷贝内容)

#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))

//IO口地址映射

#define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x

#define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x

#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x

#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14

#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x

#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x

#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x

#define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14

#define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x

#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x

#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x

#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x

#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10

#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x

#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x

#define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x

#define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10

#define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x

//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) //输入

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复