中级会员
 
- 积分
- 384
- 金钱
- 384
- 注册时间
- 2023-7-23
- 在线时间
- 89 小时
|
1金钱
编程之后,led都不正常了。
这是key。c的代码
#include "key.h"
#include "delay.h"
void KEY_Init(void)
{
RCC->APB2ENR|=1<<2;
RCC->APB2ENR|=1<<6;
GPIOA->CRL&=0XFFFFFFF0;
GPIOA->CRL|=0X00000008;
GPIOE->CRL&=0XFFF00FFF;
GPIOE->CRL|=0X00088000;
GPIOE->ODR|=3<<3;
}
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;
if(mode) key_up=1;
if(key_up&&(KEY0==0||KEY1==0||WK_UP==1||TPAD==0))
{
delay_ms(10);
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(WK_UP==1)return 3;
else if(TPAD==1)return 4;
}else if(KEY0==1&&KEY1==1&&WK_UP==0&&TPAD==1)key_up=1;
return 0;
}
void TPAD_Reset(void)
{
GPIOA->CRL&=0XFFFFFF0F; //PA1 输入
GPIOA->CRL|=0X00000030; //推挽输出
GPIOA->ODR&=~(1<<1); //输出 0,放电
delay_ms(5);
GPIOA->CRL&=0XFFFFFF0F; //PA1 输入
GPIOA->CRL|=0X00000040; //浮空输入
}
vu16 tpad_default_val=0;
u8 TPAD_Init(void)
{
u16 buf[10];
u16 temp;
u8 j,i;
for(i=0;i<10;i++)//连续读取 10 次
{
buf=TPAD;
delay_ms(10);
}
for(i=0;i<9;i++)//排序
{
for(j=i+1;j<10;j++)
{
if(buf>buf[j])//升序排列
{
temp=buf;
buf=buf[j];
buf[j]=temp;
}
}
}
temp=0;
for(i=2;i<8;i++)temp+=buf;//取中间的 8 个数据进行平均
tpad_default_val=temp/6;
//printf("tpad_default_val:%d\r\n",tpad_default_val);
if(tpad_default_val>0xFFFF/2)return 1;//初始化数值不正常!
return 0;
}
这是key。h的代码
#ifndef __KEY_H
#define __KEY_H
#include "sys.h"
//KEY端口定义
#define KEY0 PEin(4) //
#define KEY1 PEin(3) //
#define WK_UP PAin(0)
#define TPAD PAin(1)
#define KEY0_PRES 1 //
#define KEY1_PRES 2 //
#define WKUP_PRES 3
#define TPAD_PRES 4
u8 KEY_Scan(u8);
void KEY_Init(void); //初始化
void TPAD_Reset(void);
u8 TPAD_Init(void);
#endif
这是主函数的代码
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
//ALIENTEK精英STM32F103开发板 实验1
//跑马灯 实验
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司
int main(void)
{
u8 key;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
LED_Init(); //初始化与LED连接的硬件接口
BEEP_Init();
KEY_Init();
LED0=0;
TPAD_Reset();
TPAD_Init();
while(1)
{
while(1)
{
key=KEY_Scan(0);
if(key)
{
switch(key)
{
case TPAD_PRES:
LED1=!LED1;
LED0=!LED0;
TPAD_Reset();
break;
case WKUP_PRES:
BEEP=!BEEP;
break;
case KEY1_PRES:
LED1=!LED1;
break;
case KEY0_PRES:
LED0=!LED0;
break;
}
}else delay_ms(10);
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
那你就用tim1
按键呢是个机械开关导体 按下了导通 那就接地了或者接高
电容按键应该是叫触摸按键
手摸上去之后 改变了容值
那充放电时间就改变了
是通过这样判断的 和 机械的 判断电平不一样的
|