OpenEdv-开源电子网

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

关于IO口设置问题

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-9-29
在线时间
0 小时
发表于 2013-12-12 11:19:20 | 显示全部楼层 |阅读模式
想把下面4x4键盘改成4x6的,但寄存器设置弄不懂,比如是 0xfff0 表示PA0-PA3、 0x00f0 表示PA4-PA7吗?请高手帮帮忙,说清楚点,谢谢!
void InitKey(void) //初始化矩阵键盘要使用的GPIO口。
{
GPIO_InitTypeDef  GPIOStru;

GPIOStru.GPIO_Mode = GPIO_Mode_Out_PP;  //定义PA0到PA3为推挽输出。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_Init(GPIOA,&GPIOStru);
GPIOStru.GPIO_Mode = GPIO_Mode_IPD;  //定义PA4到PA7为下拉输入。
    GPIOStru.GPIO_Speed = GPIO_Speed_50MHz;
    GPIOStru.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

//因为上面定义引脚为输出时,已经打开整个GPIOA的时钟了,所以此处不再需要函数RCC_APB2PeriphClockCmd()来打开时钟了。
    GPIO_Init(GPIOA,&GPIOStru);
}

int key(void)  //实现矩阵键盘。返回值为,各按键的键值,此键值由用户自己定义。
{
int KeyVal=0; //keyVal为最后返回的键值。

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0xf)); //先让PA0到PA3全部输出高。
if((GPIOA->IDR & 0x00f0)==0x0000)  //如果,PA4到PA7全为0,则,没有键按下。此时,返回值为-1.
return -1;
else
{
delay_ms(5);    //延时5ms去抖动。
if((GPIOA->IDR & 0x00f0)==0x0000)  //如果,延时5ms后,PA4到PA7又全为0,则,刚才引脚的电位变化是抖动产生的.
return -1;
}

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x1)); //让PA3到PA0输出二进制的0001.
switch(GPIOA->IDR & 0x00f0)                //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: Key1(); break;
case 0x0020: Key2(); break;
case 0x0040: Key3(); break;
case 0x0080: Key4(); break;
}

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x2)); //让PA3到PA0输出二进制的0010.
switch(GPIOA->IDR & 0x00f0)                //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: Key5(); break;
case 0x0020: Key6(); break;
case 0x0040: Key7(); break;
case 0x0080: Key8(); break;
}

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x4)); //让PA3到PA0输出二进制的0100.
switch(GPIOA->IDR & 0x00f0)                //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: Key9(); break;
case 0x0020: Key10(); break;
case 0x0040: Key11(); break;
case 0x0080: Key12(); break;
}

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x8)); //让PA3到PA0输出二进制的1000.  
switch(GPIOA->IDR & 0x00f0)                //对PA4到PA7的值进行判断,以输出不同的键值。
{
case 0x0010: Key13(); break;
case 0x0020: Key14(); break;
case 0x0040: Key15(); break;
case 0x0080: Key16(); break;
}
return KeyVal;
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-13 00:06:11 | 显示全部楼层
回复【楼主位】Nonange:
---------------------------------
IDR/ODR的每1个位代表1个IO口
从低到高依次是0~15.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-9-29
在线时间
0 小时
 楼主| 发表于 2013-12-13 17:49:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢,终于完成了。4X6的键盘
GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x1)); //让PA3到PA0输出二进制的0001.
switch(GPIOC->IDR & 0x003f)                 //对PC0到PC5的值进行判断,以输出不同的键值。
{
case 0x0001: Key1(); break;
case 0x0002: Key2(); break;
case 0x0004: Key3(); break;
case 0x0008: Key4(); break;
case 0x0010: Key5(); break;
case 0x0020: Key6(); break;
}

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x2)); //让PA3到PA0输出二进制的0010.
switch(GPIOC->IDR & 0x003f)                 //对PB0到PB5的值进行判断,以输出不同的键值。
{
case 0x0001: Key7(); break;
case 0x0002: Key8(); break;
case 0x0004: Key9(); break;
case 0x0008: Key10(); break;
case 0x0010: Key11(); break;
case 0x0020: Key12(); break;
}

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x4)); //让PA3到PA0输出二进制的0100.
switch(GPIOC->IDR & 0x003f)                 //对PC0到PC5的值进行判断,以输出不同的键值。
{
case 0x0001: Key13(); break;
case 0x0002: Key14(); break;
case 0x0004: Key15(); break;
case 0x0008: Key16(); break;
case 0x0010: Key17(); break;
case 0x0020: Key18(); break;
}

GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x8)); //让PA3到PA0输出二进制的1000.  
switch(GPIOC->IDR & 0x003f)                 //对PC0到PC5的值进行判断,以输出不同的键值。
{
case 0x0001: Key19(); break;
case 0x0002: Key20(); break;
case 0x0004: Key21(); break;
case 0x0008: Key22(); break;
                case 0x0010: Key23(); break;
                case 0x0020: Key24(); break;
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-12-13 19:06:37 | 显示全部楼层
回复【3楼】Nonange:
---------------------------------
恭喜
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 20:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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