OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4963|回复: 9

各位大哥,小弟在学习矩阵键盘接口,这些个16进制如何算的啊?求助啊

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
发表于 2015-3-17 09:22:48 | 显示全部楼层 |阅读模式
5金钱
int KEY_Scan(void) //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。
{
u8 KeyVal; //keyVal为最后返回的键值。
GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0f00)); //先让PB8到PB11全部输出高。

if((GPIOB->IDR & 0xf000)==0x0000)  //如果PB12到PB15全为0,则没有键按下。此时,返回值为-1.
return -1;
else
{
   delay_ms(5);    //延时5ms去抖动。
   if((GPIOB->IDR & 0xf000)==0x0000)//如果延时5ms后,PB12到PB15又全为0,则,刚才引脚的电位变化是抖动产生的.
   return -1;
}

GPIO_Write(GPIOB,(GPIOB->ODR & 0xf0ff | 0x0100)); //让PB11到PB8输出二进制的0001.

switch(GPIOB->IDR & 0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=15; break;
case 0x2000: KeyVal=11; break;
case 0x4000: KeyVal=7; break;
case 0x8000: KeyVal=3; break;
}

最佳答案

查看完整内容[请看2#楼]

stm32 有PORTA,B,C等几组端口  每组端口有16个IO,对应0~15,每个IO可以配置为输入或者输出, 作通用IO的时候,要给IO赋值就配置成输出(往GPIOx->ODR写数据),若要读取IO状态则配置为输入(从GPIOx->IDR读数据) ODR和IDR 都是32位的寄存器,但高16位是保留的,只有低16位有效,这低16位就对应着每组端口的16个IO(0~15) 所以在输出的时候,16进制0xf0ff就表示IO口 8、9、10、11输出低,其他的输 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-3-17 09:22:49 | 显示全部楼层
stm32 有PORTA,B,C等几组端口  每组端口有16个IO,对应0~15,每个IO可以配置为输入或者输出,
作通用IO的时候,要给IO赋值就配置成输出(往GPIOx->ODR写数据),若要读取IO状态则配置为输入(从GPIOx->IDR读数据)
ODR和IDR 都是32位的寄存器,但高16位是保留的,只有低16位有效,这低16位就对应着每组端口的16个IO(0~15)
所以在输出的时候,16进制0xf0ff就表示IO口 8、9、10、11输出低,其他的输出高。懂?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
 楼主| 发表于 2015-3-17 10:05:18 | 显示全部楼层
比如这个GPIOB->ODR & 0xf0ff | 0x0f00和
if((GPIOB->IDR & 0xf000)==0x0000)  //如果PB12到PB15全为0,则没有键按下。此时,返回值为-1

这两个是怎么算的啊?GPIOB->ODR与上0xf0ff 再或上x0f00吗?那这个GPIOB->ODR的值是多少啊??求解啊??GPIOB->IDR的值呢?
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
 楼主| 发表于 2015-3-17 10:09:57 | 显示全部楼层
。。。。。。。。。。。。。。。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
 楼主| 发表于 2015-3-17 10:14:10 | 显示全部楼层
是我的问题太简单了啊、、、
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
 楼主| 发表于 2015-3-17 10:42:45 | 显示全部楼层
看来是的,没人给回答了、、
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
 楼主| 发表于 2015-3-17 11:41:49 | 显示全部楼层
原子哥呢???
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5782
金钱
5782
注册时间
2013-11-22
在线时间
1212 小时
发表于 2015-3-17 18:27:15 | 显示全部楼层
ODR (OUTPUT DATA REGISTOR)  输出数据寄存器   控制端口输出数据
IDR  (INPUT DATA REGISTOR)    输入数据寄存器   控制端口输入数据 (读取IO状态)
推荐LZ去看C   看手册
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
 楼主| 发表于 2015-3-17 19:03:19 | 显示全部楼层
回复【7楼】lycreturn:
---------------------------------
能解答一下这个0xf0ff怎么来的啊??谢谢。手册看了啊?可还是糊涂啊、、、
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2015-3-17
在线时间
0 小时
 楼主| 发表于 2015-3-30 08:38:40 | 显示全部楼层
回复【9楼】lycreturn:
---------------------------------
懂了~~~谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-24 07:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表