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) //输入
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章