OpenEdv-开源电子网

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

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

[复制链接]

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2018-2-27
在线时间
43 小时
发表于 2018-5-29 17:07:02 | 显示全部楼层 |阅读模式
STC15的按键,8行2列…行和列不在一组IO口,如何读取键值?

360截图16290616575854.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

4

主题

116

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3905
金钱
3905
注册时间
2017-11-15
在线时间
320 小时
发表于 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控制的一排灯都亮了…
回复 支持 反对

使用道具 举报

4

主题

116

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3905
金钱
3905
注册时间
2017-11-15
在线时间
320 小时
发表于 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 | 显示全部楼层
[mw_shl_code=c,true]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;
                 }
}[/mw_shl_code]
我只扫描了两个按键,按键处理只写了第一个按键,可我按下第一个按键,对应的灯只亮了一点点,而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 | 显示全部楼层
顶顶顶上去!!!!
回复 支持 反对

使用道具 举报

4

主题

116

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3905
金钱
3905
注册时间
2017-11-15
在线时间
320 小时
发表于 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
你这个电路设计可能有问题了,电路又做按键扫描又做显示,而按键扫描是需要一直循环的,那么在循环的时候 ...

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-1 10:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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