121人参与 • 2024-08-06 • stm32
key.c
#include "stm32f10x.h" // device header
#include "delay.h"
void key_init1(void){
rcc_apb2periphclockcmd(rcc_apb2periph_gpiod,enable);
gpio_inittypedef gpio_initstructure;
//pd0,1,2,3作为输出,pd4,5,6,7作为输入,且上拉,默认为1
gpio_initstructure.gpio_mode=gpio_mode_out_pp;
gpio_initstructure.gpio_pin=gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_3;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_init(gpiod,&gpio_initstructure);
//0,1,2,3置低电位,即0
gpio_resetbits(gpiod,gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_3);
gpio_initstructure.gpio_mode=gpio_mode_ipu;
gpio_initstructure.gpio_pin=gpio_pin_4|gpio_pin_5|gpio_pin_6|gpio_pin_7;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_init(gpiod,&gpio_initstructure);
}
void key_init2(void){
rcc_apb2periphclockcmd(rcc_apb2periph_gpiod,enable);
//pd0,1,2,3作为输入,且上拉,默认为1;pd4,5,6,7作为输出,且置0
gpio_inittypedef gpio_initstructure;
gpio_initstructure.gpio_mode=gpio_mode_ipu;
gpio_initstructure.gpio_pin=gpio_pin_0|gpio_pin_1|gpio_pin_2|gpio_pin_3;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_init(gpiod,&gpio_initstructure);
gpio_initstructure.gpio_mode=gpio_mode_out_pp;
gpio_initstructure.gpio_pin=gpio_pin_4|gpio_pin_5|gpio_pin_6|gpio_pin_7;
gpio_initstructure.gpio_speed=gpio_speed_50mhz;
gpio_init(gpiod,&gpio_initstructure);
gpio_resetbits(gpiod,gpio_pin_4|gpio_pin_5|gpio_pin_6|gpio_pin_7);
}
uint16_t key_scan(void){
uint16_t row,col,res;//row为行值,col为列值,res=row|col,用于主函数判断
key_init1();//此时pd7...pd0为0x11110000,即0xf0
col=gpio_readinputdata(gpiod); //读取上面的0xf0
col=col&0xf0;//没有任何按键按下那么col必然与0xf0相等
if(col!=0xf0)//说明可能有按键按下,需要消除抖动,进一步确定
{
delay_ms(20);//消除抖动
col=gpio_readinputdata(gpiod);
col=col&0xf0;
if(col!=0xf0)//若还是不相等,表示必然有按键按下
{
col=gpio_readinputdata(gpiod);
col=col&0xf0;//如果s1按下,那此处就是0xe0&0xf0=0xe0
}
key_init2();//此时pd7...pd0为0x00001111,即0x0f
row=gpio_readinputdata(gpiod);//读取上面的0x0f
row=row&0x0f;//没有任何按键按下那么row必然与0x0f相等
if(row!=0x0f)//说明可能有按键按下,需要消除抖动,进一步确定
{
delay_ms(20);//消除抖动
row=gpio_readinputdata(gpiod);
row=row&0x0f;
if(row!=0x0f)//若还是不相等,表示必然有按键按下
{
row=gpio_readinputdata(gpiod);
row=row&0x0f;//若s1按下,那此处就是0x0e&0x0f=0x0e
}
res=row|col;//0xe0|0x0e=0xee,表示按键s1对应的键值为0xee
}
}
return res;
}
key.h
#ifndef __key_h
#define __key_h
void key_init1(void);//获取列值
void key_init2(void);//获取行值
uint16_t key_scan(void);//获取按键值
#endif
main
#include "stm32f10x.h" // device header
#include "delay.h"
#include "key.h"
uint16_t keyvalue=0;
int main(void)
{
while(1)
{
keyvalue=key_scan();//获取按键的键值
switch(keyvalue) //根据键值确定按下的按钮
{
case 0xee:/**待调用函数**/;break;
case 0xde:;break;
case 0xbe:;break;
case 0x7e:;break;
case 0xed:;break;
case 0xdd:;break;
case 0xbd:;break;
case 0x7d:;break;
case 0xeb:;break;
case 0xdb:;break;
case 0xbb:;break;
case 0x7b:;break;
case 0xe7:;break;
case 0xd7:;break;
case 0xb7:;break;
case 0x77:;break;
default:break;
}
}
}
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论