中级会员
 
- 积分
- 329
- 金钱
- 329
- 注册时间
- 2016-6-5
- 在线时间
- 53 小时
|
1金钱
主函数:
#include "key.h"
#include "led.h"
#include "usart.h"
#include "sys.h"
#include "delay.h"
int main(void)
{
u16 t, len, times=0;
key_init();
LED_init();
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;
printf("\r\n我发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1,USART_RX_BUF[t]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}
printf("\r\n\r\n");
USART_RX_STA=0;
}
else
{
times++;
if(times%5000==0)
{
printf("\r\n战舰STM32开发板 串口实验\r\n");
}
if(times%200==0) printf("请输入数据,以回车键结束\n");
if(times%30==0) LED_0=!LED_0;
delay_ms(10);
}
}
}
led函数:
#ifndef _led_h
#define _led_h
#include "sys.h"
#define LED_0 PBout(5) //使用位带操作,讲PB.5定义为LED_0;
#define LED_1 PEout(5) //使用位带操作,讲PE.5定义为LED_1;
void LED_init(void); //定义初始化函数
#endif
#include "led.h"
void LED_init(void)
{
GPIO_InitTypeDef GPIO_Initstrue; //定义GPIO初始化结构体
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE,ENABLE); //使能GPIOB和GPIOE的时钟
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_Out_PP; //通用推挽输出
GPIO_Initstrue.GPIO_Pin=GPIO_Pin_5; //引脚5
GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz; //传输速度50M
GPIO_Init(GPIOB,&GPIO_Initstrue); //GPIOB初始化函数
GPIO_SetBits(GPIOB,GPIO_Pin_5); //将GPIOB_5设置为高电平
GPIO_Initstrue.GPIO_Pin = GPIO_Pin_5; //引脚5
GPIO_Init(GPIOE,&GPIO_Initstrue); //GPIOE初始化函数
GPIO_SetBits(GPIOE,GPIO_Pin_5); //将GPIOE_5设置为高电平
}
按键函数:
#ifndef _key_init
#define _key_init
#include "sys.h"
#define key2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)
#define key1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define key0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define wk_up GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
void key_init(void);
u8 key_scan(u8);
#endif
#include "key.h"
#include "delay.h"
#include "sys.h"
#include "stm32f10x.h"
void key_init(void)
{
GPIO_InitTypeDef GPIO_Initstrue; //定义初始化结构体变量
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA,GPIOE的时钟
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IPU; //带上拉输入
GPIO_Initstrue.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //脚2,3,4
//GPIO_Initstrue.GPIO_Speed=GPIO_Speed_50MHz; //传输速度50M
GPIO_Init(GPIOE,&GPIO_Initstrue); //初始化函数
GPIO_Initstrue.GPIO_Mode=GPIO_Mode_IPD; //带下拉输入
GPIO_Initstrue.GPIO_Pin=GPIO_Pin_0; //脚0
GPIO_Init(GPIOA,&GPIO_Initstrue); //初始化函数
}
u8 key_scan(u8 mode)
{
static u8 key_up = 1; //定义按键静态变量
if(mode) //模式1为支持连续按键,模式0为不支持连续按键
{
key_up=1;
} //模式0时,第一次key_up为1,判断按键按下,当按键按下不松开时,第二次进入时,key_up为0,直到
//松开按键,进入else if将按键标志位复原为1,才能进行下一次按键判断。即为不能进行连续按键
if(key_up&&(key2==0||key1==0||key0==0||wk_up==1)) //模式1式时,key_up始终为1,当按键按下时,相应的4个按键电位发生变化,通过检测相应电位的变化
{ //来判断是哪个按键按下,并返回相应的数值
delay_ms(10); //延时10ms,这段时间是用来消除按键抖动的时间,按键抖动一般是5-10ms,设置为10ms,太长浪费程序时间
key_up=0; //按键按下标志位
if(key2==0) return 3; //返回相应的按键值
else if(key1==0) return 2;
else if(key0==0) return 1;
else if(wk_up==1) return 4;
}
else if(key2==1&&key1==1&&key0==1&&wk_up==0) key_up = 1; //如果没按键按下,按键标志位复原
return 0;
}
|
最佳答案
查看完整内容[请看2#楼]
我发现是我初始化函数调用错误,调用 RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE); 时错误的,应该调用 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOA,ENABLE);
|