初级会员

- 积分
- 173
- 金钱
- 173
- 注册时间
- 2016-11-25
- 在线时间
- 37 小时
|
本帖最后由 Mylittledonkey 于 2018-1-25 21:11 编辑
今天刚撸的新鲜代码,程序在stm32f103c8t6 72M时钟下最长运行时间 2.8us ,void key_scan(void) 函数在30k Hz中断中调用。按键电路如图。
欢迎交流,希望指出不足之处!谢谢啦
/* Private typedef -----------------------------------------------------------*/
typedef struct {
uint16_t output[4];
uint16_t value[4];
uint16_t long_press_count[4];
uint16_t read;
uint16_t num;
uint16_t scan_count;
}_key;
/* Private variables ---------------------------------------------------------*/
_key key;
/* Private functions ---------------------------------------------------------*/
void key_init(void)
{
key.num=0;
key.output[0]=GPIO_Pin_4;
key.output[1]=GPIO_Pin_5;
key.output[2]=GPIO_Pin_6;
key.output[3]=GPIO_Pin_7;
}
void key_scan(void) //30k Hz ~2.8us
{
if(++key.scan_count>30)
{
if(key.read==0)
{
GPIOA->ODR|=key.output[key.num];
key.read=1;
}
else
{
if((GPIOB->IDR & GPIO_Pin_5)==GPIO_Pin_5)
{
if(key.value[key.num]==0)
{
if(++key.long_press_count[key.num]>1)
{
key.value[key.num]=1;
key.long_press_count[key.num]=0;
}
}
else if(key.value[key.num]==1)
{
if(++key.long_press_count[key.num]>300 )
{
key.long_press_count[key.num]=0;
key.value[key.num]=2;
}
}
}
else
{
key.long_press_count[key.num]=0;
}
GPIOA->ODR &= ~key.output[key.num];
if(++key.num>3)key.num=0;
key.read=0;
}
key.scan_count=0;
}
}
|
-
按键引脚定义
-
-
key.rar
551 Bytes, 下载次数: 131
|