OpenEdv-开源电子网

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

求大神帮我看下,我写的矩阵键盘程序不得行……

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-11-8
在线时间
0 小时
发表于 2016-11-8 16:13:53 | 显示全部楼层 |阅读模式
1金钱
#include<reg51.h>
//**********延时函数*******//
void delay_ms(unsigned int n)
{
        unsigned int i=0,j=0;
        for(i=0;i<n;i++)
                for(j=0;j<123;j++);
}
//*******按键二维数组*******//
unsigned char key [4][4]=
{
        1,2,3,4,
        5,6,7,8,
        9,10,11,12,
        13,14,15,16,
};

//*********主函数**********//
void main()
{       
        int row,col,temp;
        while(1)
        {
//****扫描第四列****//
                 P2=0x7f;                          
                 col=3;
                 P2=0xff;
                 temp=P2;                         
                 temp=temp&0xf0;                       
                 switch(temp)
                 {
                         case 0xfe:row=0;break;
                        case 0xfd:row=1;break;
                        case 0xfb:row=2;break;
                        case 0xf7:row=3;break;
                 }
//****扫描第三列****//
                 P2=0xbf;                          
                 col=2;
                 P2=0xff;
                 temp=P2;                       
                 temp=temp&0xf0;                       
                 switch(temp)
                 {
                         case 0xfe:row=0;break;
                        case 0xfd:row=1;break;
                        case 0xfb:row=2;break;
                        case 0xf7:row=3;break;
                 }
//****扫描第二列***//
                 P2=0xdf;                          
                 col=1;
                 P2=0xff;
                 temp=P2;                         
                 temp=temp&0xf0;                       
                 switch(temp)
                 {
                         case 0xfe:row=0;break;
                        case 0xfd:row=1;break;
                        case 0xfb:row=2;break;
                        case 0xf7:row=3;break;
                 }
//******扫描第一列***//
                 P2=0xef;                          
                 col=0;
                 P2=0xff;                       
                 temp=P2;
                 temp=temp&0xf0;                        官方.png
                 switch(temp)
                 {
                         case 0xfe:row=0;break;
                        case 0xfd:row=1;break;
                        case 0xfb:row=2;break;
                        case 0xf7:row=3;break;
                 }
        P3=key [row][col];
        }
}

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

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-8 22:00:47 | 显示全部楼层
直接在郭天祥程序上一步步改吧
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-10-29
在线时间
4 小时
发表于 2016-11-9 14:25:56 | 显示全部楼层
一个矩阵 写这么复杂干嘛
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2016-11-10 16:01:41 | 显示全部楼层
首先第一个你的col=3,=2,=1,=0。这四句话无论如何都会执行完,那么最终col=0。感觉整个程序的思路不对,也不清晰,就是一个翻转扫描而已,先吧P2=0X0F;让低位全高,再检测P2是否等于0X0F;(因为如果按键按下就会把两个联通的引脚同时拉低),如果不等于,根据P2的值可以找到是哪一列被按下。同样。再把P2的值赋为0xf0,去检测某一行被按下。行和列确定了,具体的按键值不就知道了吗。
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2016-7-26
在线时间
33 小时
发表于 2016-11-10 17:40:29 | 显示全部楼层
网上一大把例程啊
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-11-11
在线时间
9 小时
发表于 2016-11-11 19:46:11 | 显示全部楼层
直接发给你一个头文件和源文件好了。直接调用。
#ifndef _arraykeys_h_
#define _arraykeys_h_
#define ARRAYKEYSPORT P3
extern unsigned char arraykeys(void);
#endif
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-11-11
在线时间
9 小时
发表于 2016-11-11 19:46:32 | 显示全部楼层
#include<reg52.h>
#include"arraykeys.h"
void delay5ms(void)
{
    unsigned char a,b;
    for(b=15;b>0;b--)
        for(a=152;a>0;a--);
}
unsigned char arraykeys(void)
{
        unsigned char x,y,z=0;
        ARRAYKEYSPORT=0xf0;//端口置11110000
        if((ARRAYKEYSPORT&0xf0)!=0xf0)
        {
                delay5ms();
                if((ARRAYKEYSPORT&0xf0)!=0xf0)
                {
                        x=ARRAYKEYSPORT&0xf0;//保存反列态
                        ARRAYKEYSPORT=x|0x0f;//端口反置00001111
                        y=ARRAYKEYSPORT&0x0f;//保存反行态
                        for(;(ARRAYKEYSPORT&0x0f)!=0x0f;)//按键松手死循环
                        {
                                //此处可以添加按键松手死循环时候的可执行代码

                        }
                        z=x+y;//行列值合并
                }
        }
        switch(z)
        {
                //第一行
                case 0xee:        return 0x01;        break;
                case 0xde:        return 0x02;        break;
                case 0xbe:        return 0x03;        break;
                case 0x7e:        return 0x04;        break;
                //第二行
                case 0xed:        return 0x05;        break;
                case 0xdd:        return 0x06;        break;
                case 0xbd:        return 0x07;        break;
                case 0x7d:        return 0x08;        break;
                //第三行
                case 0xeb:        return 0x09;        break;
                case 0xdb:        return 0x0a;        break;
                case 0xbb:        return 0x0b;        break;
                case 0x7b:        return 0x0c;        break;
                //第四行
                case 0xe7:        return 0x0d;        break;
                case 0xd7:        return 0x0e;        break;
                case 0xb7:        return 0x0f;        break;
                case 0x77:        return 0x10;        break;
                default:return 0;break;
        }                       
}
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-11-11
在线时间
9 小时
发表于 2016-11-11 19:50:02 | 显示全部楼层
话说我这是看了教程理解了之后自己在教程附带的源码里改的。
回复

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-11-11
在线时间
9 小时
发表于 2016-11-11 19:54:16 | 显示全部楼层
刚刚买的板子,刚刚近的论坛,菜鸟一枚,希望大家多多指教。
回复

使用道具 举报

28

主题

218

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
498
金钱
498
注册时间
2013-11-19
在线时间
92 小时
发表于 2016-11-15 23:04:24 | 显示全部楼层
学生时代是可以这么写,工程实践中这样写 恐怕。。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 19:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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