求助大佬,矩阵按键没有反应
本帖最后由 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;
}
}
}
矩阵键盘好像不应该是的程序这样做吧!
普中的例程,矩阵键盘部分:
#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++;
}
}
}
}
HC6800-ES-V2.0 发表于 2018-5-14 07:20
矩阵键盘好像不应该是的程序这样做吧!
普中的例程,矩阵键盘部分:
#define GPIO_KEY P1
为什么我的只有上面两行能显示0-7,下面两行只能显示0-3,
显示效果是这样的:
0123
4567
0123
0123 kylincy 发表于 2019-6-22 11:54
为什么我的只有上面两行能显示0-7,下面两行只能显示0-3,
显示效果是这样的:
0123
你的硬件是HC6800-ES-V2.0版本吗? HC6800-ES-V2.0 发表于 2019-6-22 14:37
你的硬件是HC6800-ES-V2.0版本吗?
我是HC6800-ES-V3.0的,原来是键盘是插在P1口的,后来换到P3口就可以了。
P1和P3有什么区别吗? kylincy 发表于 2019-6-23 16:19
我是HC6800-ES-V3.0的,原来是键盘是插在P1口的,后来换到P3口就可以了。
P1和P3有什么区别吗?
没区别,可能是你的杜邦线没接触好的原因,V3.0的就是这个问题,插杜邦线可能有问题。 HC6800-ES-V2.0 发表于 2019-6-24 07:22
没区别,可能是你的杜邦线没接触好的原因,V3.0的就是这个问题,插杜邦线可能有问题。
我是用的排线,不是杜邦线,后来反复试了几次都是这样,
页:
[1]