OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 1054|回复: 10

STC15的按键,8行2列…行和列不在一组IO口,如何读取键值?

[复制链接]

  离线 

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
发表于 2018-5-29 17:07:02 | 显示全部楼层 |阅读模式
回复

使用道具 举报

  离线 

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
 楼主| 发表于 2018-5-29 18:54:23 | 显示全部楼层
顶顶顶顶顶顶顶顶顶!
回复 支持 反对

使用道具 举报

  离线 

2

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
676
金钱
676
注册时间
2013-6-5
在线时间
104 小时
发表于 2018-5-29 23:03:32 | 显示全部楼层
按IO读,自己组成一个字节
回复 支持 反对

使用道具 举报

  离线 

2

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2017-11-15
在线时间
47 小时
发表于 2018-6-1 09:23:21 | 显示全部楼层
zhxzhx 发表于 2018-5-29 23:03
按IO读,自己组成一个字节

貌似只能用这个方法,设计的时候最好考虑好,方便代码编写。
www.littlebutler.top
回复 支持 反对

使用道具 举报

  离线 

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
 楼主| 发表于 2018-6-2 09:55:43 | 显示全部楼层
IdeaMing 发表于 2018-6-1 09:23
貌似只能用这个方法,设计的时候最好考虑好,方便代码编写。

现在出现一个情况,就是我按下SWA第一个键,由LEDA控制的一排灯都亮了…
回复 支持 反对

使用道具 举报

  离线 

2

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2017-11-15
在线时间
47 小时
发表于 2018-6-4 09:44:38 | 显示全部楼层
616765512 发表于 2018-6-2 09:55
现在出现一个情况,就是我按下SWA第一个键,由LEDA控制的一排灯都亮了…

你试试能不能写程序单独让每一个灯做个流水。
www.littlebutler.top
回复 支持 反对

使用道具 举报

  离线 

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
 楼主| 发表于 2018-6-4 10:52:08 | 显示全部楼层
[C] 纯文本查看 复制代码
sbit SW_A  = P4^0;
sbit SW_B  = P4^1;
sbit LED_A = P4^2;
sbit LED_B = P4^3;
sbit LED_C = P4^4;
//char  stop=0;	//按键扫描标志位,1:停止扫描 0:开始扫描
uint8 idata STC_KeyBuf[16];   //按键存放
//按键扫描
void STC_ReadKey()	
{
//   static unsigned char Su8KeyLock[16]; //按键的自锁
   static unsigned int  Su16KeyCnt[16]; //按键的计时器
	P2 = 0x01; 
	if(0==SW_A)		//无按键按下
	{
//		Su8KeyLock[0] = 0; //按键解锁
		Su16KeyCnt[0] = 0; //  按键去抖动延时计数器清零。     
		STC_KeyBuf[0] = 0;		//无按键
	}
//	else if(0==Su8KeyLock[0])
	else
	{
		Su16KeyCnt[0]++;
		if(Su16KeyCnt[0]>=KEY_SHORT_TIME)	//消抖
		{
//			Su8KeyLock[0] = 1;
			STC_KeyBuf[0] ++;	//读按键按下状态	
		}
	}	
	if(0==SW_B)		//无按键按下
	{
//		Su8KeyLock[1] = 0; //按键解锁
		Su16KeyCnt[1] = 0; //按键去抖动延时计数器清零。  
		STC_KeyBuf[1] = 0;		//无按键
	}
//	else if(0==Su8KeyLock[1])
	else
	{
		Su16KeyCnt[1]++;
		if(Su16KeyCnt[1]>=KEY_SHORT_TIME)	//消抖
		{
//			Su8KeyLock[1] = 1;
			STC_KeyBuf[1] ++;	//读按键按下状态
		}
	}
	delay(20);	//20us
	P2  =0x02;
	if(0==SW_A)		//无按键按下
	{
//		Su8KeyLock[2] = 0; //按键解锁
		Su16KeyCnt[2] = 0; //     
		STC_KeyBuf[2] = 0;		//无按键
	}
//	else if(0==Su8KeyLock[2])
	else
	{
		Su16KeyCnt[2]++;
		if(Su16KeyCnt[2]>=KEY_SHORT_TIME)	//消抖
		{
//			Su8KeyLock[2] = 1;
			STC_KeyBuf[2] ++;	//读按键按下状态
		}
	}	
	if(0==SW_B)		//无按键按下
	{
//		Su8KeyLock[3] = 0; //按键解锁
		Su16KeyCnt[3] = 0; //按键去抖动延时计数器清零。  
		STC_KeyBuf[3] = 0;		//无按键
	}
//	else if(0==Su8KeyLock[3])
	else
	{
		Su16KeyCnt[3]++;
		if(Su16KeyCnt[3]>=KEY_SHORT_TIME)	//消抖
		{
//			Su8KeyLock[3] = 1;
			STC_KeyBuf[3] ++;	//读按键按下状态	
		}
	}
}
//按键执行程序
void STC_KeyProcess1()
{
//	uchar flag=0;    //按键按下标志位
	     if(STC_KeyBuf[0]!=0)	//按键按下
		 {
//			 stop=1;
//			 flag=1;
			 P2 = 0x01;
			 Display(8,3,1);	//数码管显示程序		 
			 LED_A = 0;	   	//拉低P4^2,亮灯
//			 return;
		 }
}

我只扫描了两个按键,按键处理只写了第一个按键,可我按下第一个按键,对应的灯只亮了一点点,而LEDA那一排的第二个灯亮了,如果我扫描了八个灯,那么亮的就是最后一个,因为扫描很快就过去了,这个怎么破?我想过按下的时候暂停扫描,可不知道在哪里又进入扫描,如果是松开就扫描,那结果又和现在一样了
回复 支持 反对

使用道具 举报

  离线 

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
 楼主| 发表于 2018-6-4 10:52:50 | 显示全部楼层
IdeaMing 发表于 2018-6-4 09:44
你试试能不能写程序单独让每一个灯做个流水。

是扫描方式有问题吗?我一个按键就不会这样
回复 支持 反对

使用道具 举报

  离线 

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
 楼主| 发表于 2018-6-4 15:09:11 | 显示全部楼层
顶顶顶上去!!!!
回复 支持 反对

使用道具 举报

  离线 

2

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
467
金钱
467
注册时间
2017-11-15
在线时间
47 小时
发表于 2018-6-5 12:57:03 | 显示全部楼层
616765512 发表于 2018-6-4 10:52
是扫描方式有问题吗?我一个按键就不会这样

你这个电路设计可能有问题了,电路又做按键扫描又做显示,而按键扫描是需要一直循环的,那么在循环的时候对应的灯就要亮。显示电路和按键的电路应该分开,或者按键的时候不显示,显示的时候不是按键。
www.littlebutler.top
回复 支持 反对

使用道具 举报

  离线 

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
 楼主| 发表于 2018-6-5 16:21:46 | 显示全部楼层
IdeaMing 发表于 2018-6-5 12:57
你这个电路设计可能有问题了,电路又做按键扫描又做显示,而按键扫描是需要一直循环的,那么在循环的时候 ...

是可以这样复用的,只是程序会比较复杂…我功力不够
回复 支持 反对

使用道具 举报

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

本版积分规则




关闭

报名原子哥新品发布会&粉丝见面会上一条 /1 下一条

正点原子公众号

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-10-19 19:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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