145056710 发表于 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={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};

void main()
{
      unsigned i,j;
      unsigned char backup={{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;
      while(1)
      {
                for(i=0;i<4;i++)
                {
                        for(j=0;j<4;j++)
                        {
                              if(backup != keysta)
                              {
                                        if(backup != 0)
                                        {
                                                P0=LEDchar;
                                        }
                                        backup = keysta;
                              }
                        }
                }
      }
}
void InterruptTimer0() interrupt 1
{
      unsigned char i;
      static unsigned char keyout = 0;
      static unsigned char keybuf={{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00},{0x00,0x00,0x00,0x00}};
      TH0=0xFC;
      TL0=0x67;
      keybuf = (keybuf<<1)|KIN1;
      keybuf = (keybuf<<1)|KIN2;
      keybuf = (keybuf<<1)|KIN3;
      keybuf = (keybuf<<1)|KIN4;
      for(i=0;i<4;i++)
      {
                if((keybuf&0x0F) == 0x00)
                {
                        keysta = 0;
                }
                else if((keybuf&0x0F) == 0x0F)
                {
                        keysta = 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;
                }
      }
}

HC6800-ES-V2.0 发表于 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++;
                        }
                }
        }
}

kylincy 发表于 2019-6-22 11:54:19

HC6800-ES-V2.0 发表于 2018-5-14 07:20
矩阵键盘好像不应该是的程序这样做吧!
普中的例程,矩阵键盘部分:
#define GPIO_KEY P1


为什么我的只有上面两行能显示0-7,下面两行只能显示0-3,
显示效果是这样的:
0123
4567
0123
0123

HC6800-ES-V2.0 发表于 2019-6-22 14:37:08

kylincy 发表于 2019-6-22 11:54
为什么我的只有上面两行能显示0-7,下面两行只能显示0-3,
显示效果是这样的:
0123


你的硬件是HC6800-ES-V2.0版本吗?

kylincy 发表于 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有什么区别吗?

HC6800-ES-V2.0 发表于 2019-6-24 07:22:52

kylincy 发表于 2019-6-23 16:19
我是HC6800-ES-V3.0的,原来是键盘是插在P1口的,后来换到P3口就可以了。
P1和P3有什么区别吗?

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

kylincy 发表于 2019-6-24 10:48:43

HC6800-ES-V2.0 发表于 2019-6-24 07:22
没区别,可能是你的杜邦线没接触好的原因,V3.0的就是这个问题,插杜邦线可能有问题。

我是用的排线,不是杜邦线,后来反复试了几次都是这样,
页: [1]
查看完整版本: 求助大佬,矩阵按键没有反应