请选择 进入手机版 | 继续访问电脑版

普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 7137|回复: 6

求助大佬,矩阵按键没有反应

 关闭 [复制链接]

5

主题

10

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2018-5-13 20:00:53 | 显示全部楼层 |阅读模式
本帖最后由 145056710 于 2018-5-13 20:55 编辑


#include<reg51.h>

sbit L1=P2^2;
sbit L2=P2^3;
sbit L3=P2^4;
sbit KIN1=P1^4;
sbit KIN2=P1^5;
sbit KIN3=P1^6;
sbit KIN4=P1^7;
sbit KOUT1=P1^3;
sbit KOUT2=P1^2;
sbit KOUT3=P1^1;
sbit KOUT4=P1^0;

unsigned char code LEDchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char keysta[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};

void main()
{
        unsigned i,j;
        unsigned char backup[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};

        EA=1;
                L1=0;
        L2=1;
        L3=0;
        TMOD=0x01;
        TH0=0xFC;
        TL0=0x67;
        ET0=1;
        TR0=1;

        P0=LEDchar[1];
        while(1)
        {
                for(i=0;i<4;i++)
                {
                        for(j=0;j<4;j++)
                        {
                                if(backup[j] != keysta[j])
                                {
                                        if(backup[j] != 0)
                                        {
                                                P0=LEDchar[i*4+j];
                                        }
                                        backup[j] = keysta[j];
                                }
                        }
                }
        }
}
void InterruptTimer0() interrupt 1
{
        unsigned char i;
        static unsigned char keyout = 0;
        static unsigned char keybuf[4][4]={{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00}};
        TH0=0xFC;
        TL0=0x67;
        keybuf[keyout][0] = (keybuf[keyout][0]<<1)|KIN1;
        keybuf[keyout][1] = (keybuf[keyout][1]<<1)|KIN2;
        keybuf[keyout][2] = (keybuf[keyout][2]<<1)|KIN3;
        keybuf[keyout][3] = (keybuf[keyout][3]<<1)|KIN4;
        for(i=0;i<4;i++)
        {
                if((keybuf[keyout]&0x0F) == 0x00)
                {
                        keysta[keyout] = 0;
                }
                else if((keybuf[keyout]&0x0F) == 0x0F)
                {
                        keysta[keyout] = 1;
                }
                keyout++;
                keyout = keyout&0x03;
                switch(keyout)
                {
                        case 0: KOUT4 = 1;KOUT1 = 0;break;
                        case 1: KOUT1 = 1;KOUT2 = 0;break;
                        case 2: KOUT2 = 1;KOUT3 = 0;break;
                        case 3: KOUT3 = 1;KOUT4 = 0;break;
                        default: break;
                }
        }
}
回复

使用道具 举报

20

主题

1343

帖子

8341

积分

论坛元老

Rank: 8Rank: 8

积分
8341
发表于 2018-5-14 07:20:45 | 显示全部楼层
矩阵键盘好像不应该是的程序这样做吧!
普中的例程,矩阵键盘部分:
#define GPIO_KEY P1

/*******************************************************************************
* 函 数 名         : KeyDown
* 函数功能                   : 检测有按键按下并读取键值
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void KeyDown(void)
{
        char a=0;
        GPIO_KEY=0x0f;
        if(GPIO_KEY!=0x0f)//读取按键是否按下
        {
                Delay10ms();//延时10ms进行消抖
                if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
                {
                       
                        //测试列
                        GPIO_KEY=0X0F;
                        switch(GPIO_KEY)
                        {
                                case(0X07):        KeyValue=0;break;
                                case(0X0b):        KeyValue=1;break;
                                case(0X0d): KeyValue=2;break;
                                case(0X0e):        KeyValue=3;break;
                        }
                        //测试行
                        GPIO_KEY=0XF0;
                        switch(GPIO_KEY)
                        {
                                case(0X70):        KeyValue=KeyValue;break;
                                case(0Xb0):        KeyValue=KeyValue+4;break;
                                case(0Xd0): KeyValue=KeyValue+8;break;
                                case(0Xe0):        KeyValue=KeyValue+12;break;
                        }
                        while((a<50)&&(GPIO_KEY!=0xf0))         //检测按键松手检测
                        {
                                Delay10ms();
                                a++;
                        }
                }
        }
}
回复 支持 反对

使用道具 举报

0

主题

4

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 2019-6-22 11:54:19 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-5-14 07:20
矩阵键盘好像不应该是的程序这样做吧!
普中的例程,矩阵键盘部分:
#define GPIO_KEY P1

为什么我的只有上面两行能显示0-7,下面两行只能显示0-3,
显示效果是这样的:
0  1  2  3
4  5  6  7
0  1  2  3
0  1  2  3
回复 支持 反对

使用道具 举报

20

主题

1343

帖子

8341

积分

论坛元老

Rank: 8Rank: 8

积分
8341
发表于 2019-6-22 14:37:08 | 显示全部楼层
kylincy 发表于 2019-6-22 11:54
为什么我的只有上面两行能显示0-7,下面两行只能显示0-3,
显示效果是这样的:
0  1  2  3

你的硬件是HC6800-ES-V2.0版本吗?
回复 支持 反对

使用道具 举报

0

主题

4

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 2019-6-23 16:19:44 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-6-22 14:37
你的硬件是HC6800-ES-V2.0版本吗?

我是HC6800-ES-V3.0的,原来是键盘是插在P1口的,后来换到P3口就可以了。
P1和P3有什么区别吗?
回复 支持 反对

使用道具 举报

20

主题

1343

帖子

8341

积分

论坛元老

Rank: 8Rank: 8

积分
8341
发表于 2019-6-24 07:22:52 | 显示全部楼层
kylincy 发表于 2019-6-23 16:19
我是HC6800-ES-V3.0的,原来是键盘是插在P1口的,后来换到P3口就可以了。
P1和P3有什么区别吗?

没区别,可能是你的杜邦线没接触好的原因,V3.0的就是这个问题,插杜邦线可能有问题。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 2019-6-24 10:48:43 | 显示全部楼层
HC6800-ES-V2.0 发表于 2019-6-24 07:22
没区别,可能是你的杜邦线没接触好的原因,V3.0的就是这个问题,插杜邦线可能有问题。

我是用的排线,不是杜邦线,后来反复试了几次都是这样,
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-3-29 08:23 , Processed in 0.084105 second(s), 30 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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