OpenEdv-开源电子网

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

求救各位大大,扫描矩阵键盘

[复制链接]

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-11-13
在线时间
2 小时
发表于 2013-11-27 15:29:00 | 显示全部楼层 |阅读模式
STM32下,PA3~PA7为矩阵输出,PC8~PC12为输入,使用轮询法扫描

int main(void)
 {
delay_init();      
  LED_Init();
KEY_Init();                  

LED0=0;
while(1)
{
ROW0=ROW1=ROW2=ROW3=ROW4=1;ROW0=0;
if(LINE0==0)LED0=!LED0;
if(LINE1==0)LED0=!LED0;
if(LINE2==0)LED0=!LED0;
if(LINE3==0)LED0=!LED0;
if(LINE4==0)LED0=!LED0;
ROW0=ROW1=ROW2=ROW3=ROW4=1;ROW1=0;
if(LINE0==0)LED0=!LED0;
if(LINE1==0)LED0=!LED0;
if(LINE2==0)LED0=!LED0;
if(LINE3==0)LED0=!LED0;
if(LINE4==0)LED0=!LED0;
ROW0=ROW1=ROW2=ROW3=ROW4=1;ROW2=0;
if(LINE0==0)LED0=!LED0;
if(LINE1==0)LED0=!LED0;
if(LINE2==0)LED0=!LED0;
if(LINE3==0)LED0=!LED0;
if(LINE4==0)LED0=!LED0;
ROW0=ROW1=ROW2=ROW3=ROW4=1;ROW3=0;
if(LINE0==0)LED0=!LED0;
if(LINE1==0)LED0=!LED0;
if(LINE2==0)LED0=!LED0;
if(LINE3==0)LED0=!LED0;
if(LINE4==0)LED0=!LED0;
ROW0=ROW1=ROW2=ROW3=ROW4=1;ROW4=0;
if(LINE0==0)LED0=!LED0;
if(LINE1==0)LED0=!LED0;
if(LINE2==0)LED0=!LED0;
if(LINE3==0)LED0=!LED0;
if(LINE4==0)LED0=!LED0;
}
}

        配置键盘输出口:
       GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
GPIO_Init(GPIOA, &GPIO_InitStructure);
 
     配置键盘输入口:
      
PIO_InitStructure.GPIO_Pin  = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;//PE2~4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
  GPIO_Init(GPIOC, &GPIO_InitStructure);


按键定义:
#define ROW0  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)
#define ROW1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4)
#define ROW2  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5) 
#define ROW3  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)
#define ROW4  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_7)

#define LINE0  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8)
#define LINE1  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)
#define LINE2  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_10) 
#define LINE3  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_11)
#define LINE4  GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_12)




按键处理:
u8 KEY_Scan(u8 mode)
{  
static u8 key_up=1;
if(mode)key_up=1;    
if(key_up&&(LINE0==0||LINE1==0||LINE2==0||LINE3==0||LINE4==0))
{
delay_ms(10);
key_up=0;
}else if(LINE0==1&&LINE1==1&&LINE2==1&&LINE3==1&&LINE4==1)key_up=1;    
  return 0;



想请问大大,我在compiler时,在main主程式里

标注红色背景部分,显示expression must be a modifiable lvalue 的错误讯息,该如何解决?






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-27 16:31:07 | 显示全部楼层
回复【楼主位】richard.lin:
---------------------------------
这样连等于啊???干脆直接操作寄存器来的快,一下子搞定全部的置位或者清零
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2013-11-13
在线时间
2 小时
 楼主| 发表于 2013-11-27 16:49:51 | 显示全部楼层
是想用库函数方法操作,请求大大帮忙解决这错误部份?
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-27 17:26:46 | 显示全部楼层
回复【3楼】richard.lin:
---------------------------------
你的ROWx这些定义为读取了,你还向它写1或者写0????????
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

10

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-11-27
在线时间
11 小时
发表于 2013-11-27 20:36:18 | 显示全部楼层
不太明白你的想法啊,既然ROWx 宏定义成读取GPIO某个引脚的状态,那应该是去判断这个脚0还是1 ,为什么都直接赋值了呢??  你要用库函数版的,还是寄存器版的呢?不管哪一种基本和51的矩阵键盘的思想是一样的吧!
回复 支持 反对

使用道具 举报

4

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-9-30
在线时间
0 小时
发表于 2013-11-28 13:58:34 | 显示全部楼层
我自己写的4*4的矩阵键盘扫描程序

STM-DEMO-KEY.rar

8.21 MB, 下载次数: 108

好好学习,天天向上
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-11-28 14:26:54 | 显示全部楼层
5*5?
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-5-6
在线时间
18 小时
发表于 2013-11-28 15:13:09 | 显示全部楼层
应该用write 而不是用read吧
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 12:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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