新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2018-9-19
- 在线时间
- 4 小时
|
1金钱
1.首先上代码
/*****************************main.c*****************************/
int main(void)
{
delay_init(168);
led_init();
beep_init();
key_init();
while(1)
{
unsigned char key;
key = key_scan(1); //不能连续按键
switch(key)
{
case 1:
{
LED_blue_on; //DS1
LED_white_off; //DS0
BEEP_OFF;
}break;
case 2:
{
static unsigned char key_cnt;
key_cnt++;
if(key_cnt%2 == 0)
{
LED_blue_on;
LED_white_on;
BEEP_OFF;
}
else
{
LED_blue_off;
LED_white_off;
BEEP_OFF;
}
}break;
case 3:
{
LED_white_on;
LED_blue_off;
BEEP_OFF;
}break;
case 4:
{
LED_blue_off;
LED_white_off;
BEEP_ON;
}break;
default:break;
}
}
}
/*****************************key.c*****************************/
void key_init(void)
{
//使能外设时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
//初始化按键WAKE_UP
GPIO_InitTypeDef* KEY_wake_up;
KEY_wake_up->GPIO_Mode = GPIO_Mode_IN;
KEY_wake_up->GPIO_Pin = GPIO_Pin_0;
KEY_wake_up->GPIO_PuPd = GPIO_PuPd_DOWN;
KEY_wake_up->GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, KEY_wake_up);
//初始化按键0,按键1和按键2
GPIO_InitTypeDef* KEY_0_1_2;
KEY_0_1_2->GPIO_Mode = GPIO_Mode_IN;
KEY_0_1_2->GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
KEY_0_1_2->GPIO_PuPd = GPIO_PuPd_UP;
KEY_0_1_2->GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, KEY_0_1_2);
}
unsigned char key_scan(unsigned char mode)
{
static unsigned char key_value;
static unsigned char KEY_set = 1;
if(mode == 0) //不能连续按键
{
KEY_set = 1;
}
if(KEY_set&&((KEY_0_read==0)||(KEY_1_read==0)||(KEY_2_read==0)||(KEY_wakeup_read==1)))
{
delay_ms(10); //按键消抖
KEY_set = 0;
if(KEY_0_read==0)
{
key_value = key_0_set; //按键0按下
return key_value;
}
else if(KEY_1_read==0)
{
key_value = key_1_set; //按键1按下
return key_value;
}
else if(KEY_2_read==0)
{
key_value = key_2_set; //按键2按下
return key_value;
}
else if(KEY_wakeup_read==1)
{
key_value = key_wakeup_set; //按键WAKE_UP按下
return key_value;
}
}
else
{
KEY_set = 1;
key_value = 0;
}
return key_value;
}
/*****************************key.h*****************************/
#ifndef _KEY_H
#define _KEY_H
#define KEY_0_read GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY_1_read GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define KEY_2_read GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define KEY_wakeup_read GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define key_0_set 1
#define key_1_set 2
#define key_2_set 3
#define key_wakeup_set 4
extern void key_init(void); //按键初始化函数
extern unsigned char key_scan(unsigned char mode); //按键值获取函数
#endif
硬件连接如图:
问题描述:程序编译下载后,DS1常量,按键没有反应。
调试结果:如图
按理说:端口输出化完成以后,GPIOA.0为0,GPIOE.2,.3,.4为1,
但是结果是GPIOA.0为0,GPIOE.2,.3,.4只有GPIOE.2为1,其他为0。为什么?
我在调试过程中在key.c端口初始化完毕后,读端口电平,添加了一个Value变量,神奇的是,程序竟然能够正常运转了,我并没有调用Value这个变量,
添加变量后代码如下:
/*****************************key.c*****************************/
void key_init(void)
{
volatile unsigned char Value;
//使能外设时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
//初始化按键WAKE_UP
GPIO_InitTypeDef* KEY_wake_up;
KEY_wake_up->GPIO_Mode = GPIO_Mode_IN;
KEY_wake_up->GPIO_Pin = GPIO_Pin_0;
KEY_wake_up->GPIO_PuPd = GPIO_PuPd_DOWN;
KEY_wake_up->GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, KEY_wake_up);
Value = KEY_wakeup_read;
//初始化按键0,按键1和按键2
GPIO_InitTypeDef* KEY_0_1_2;
KEY_0_1_2->GPIO_Mode = GPIO_Mode_IN;
KEY_0_1_2->GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
KEY_0_1_2->GPIO_PuPd = GPIO_PuPd_UP;
KEY_0_1_2->GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, KEY_0_1_2);
Value = KEY_0_read;
}
调试结果如下:
初始化竟然正常了,这是为何?
请各位大神指教,不胜感激。
最后我的KEIL中仿真时,Peripherals选项卡下没有general purpose I/O窗口,这个应如何设置?
|
最佳答案
查看完整内容[请看2#楼]
好了,再部门同事的指导下,我终于明白了,折磨了我两天了
GPIO_InitTypeDef* KEY_wake_up;
KEY_wake_up->GPIO_Mode = GPIO_Mode_IN;
KEY_wake_up->GPIO_Pin = GPIO_Pin_0;
KEY_wake_up->GPIO_PuPd = GPIO_PuPd_DOWN;
KEY_wake_up->GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, KEY_wake_up);
指针的使用这样子是没有错的,但是问题就在于这个指针指向什么呢,我在定 ...
|