金牌会员
 
- 积分
- 1276
- 金钱
- 1276
- 注册时间
- 2016-5-31
- 在线时间
- 499 小时
|
发表于 2017-9-12 16:34:06
|
显示全部楼层
请看我的键盘扫描程序:
按照楼主的提问“第一个不便: 不能使能跨组接口,比如GPIOC和GPIOD同时输出;”
请参照我如下的定义,就不存在你说的问题了,很方便.
struct io_port {
GPIO_TypeDef *GPIO_x;
unsigned short GPIO_pin;
};
struct io_port key_input[8] = {
{GPIOA, GPIO_Pin_0}, {GPIOA, GPIO_Pin_1},{GPIOA, GPIO_Pin_2}, {GPIOA, GPIO_Pin_3},
{GPIOA, GPIO_Pin_4}, {GPIOA, GPIO_Pin_5},{GPIOA, GPIO_Pin_6}, {GPIOA, GPIO_Pin_7},
};
struct io_port key_output[16] = {
{GPIOC, GPIO_Pin_0}, {GPIOC, GPIO_Pin_1}, {GPIOC, GPIO_Pin_2}, {GPIOC, GPIO_Pin_3},
{GPIOC, GPIO_Pin_4}, {GPIOC, GPIO_Pin_5}, {GPIOC, GPIO_Pin_6}, {GPIOC, GPIO_Pin_7},
{GPIOC, GPIO_Pin_8}, {GPIOC, GPIO_Pin_9}, {GPIOC, GPIO_Pin_10}, {GPIOC, GPIO_Pin_11},
{GPIOC, GPIO_Pin_12}, {GPIOC, GPIO_Pin_13},{GPIOC, GPIO_Pin_14}, {GPIOC, GPIO_Pin_15},
};
/*
***************************************************************************
* 功 能: 键值更新函数
*---------------------------------------------------------------------------------------------------------*
* 入口参数: None
* 出口参数: 更新后的键值
***************************************************************************
*/
u8 update_key(void)
{
u8 i, j;
u8 key_val=0xff;
//按键扫描: 行[输出模式]扫描依次输出高电平;
//列[下拉输入模式]检测输入有按键按下,输入为高电平
for(i = 0; i < 16; i++){ //i是输出口,全部初始化输出低电平
GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
for(i = 0; i < 16; i++){ //i是输出口,依次输出高电平
GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
for(j = 0; j < 8; j++){ //j是数入口,键被按下导通,被置为低电平
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0){ //---没有键按下
key_matrix[j] = 1;
}else{ //---有按键按下
key_matrix[j] = 0;
if(key_press_valid==0){
key_press_valid=1;
}
//行数值范围:0~15,共16行; 列数值范围:0~7,共8列
key_val =(i<<4)+j; //识别为哪一行,哪一列的按键按下
}
}
GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
return key_val;
}
|
|