在 C 中使用相同的 I/O 控制键盘
Controlling a keypad with same I/O in C
我有一个问题困扰了我一天多了,我无法用我的技能解决这个问题。
所以问题如下。我正在尝试从 4x4 键盘获取输出,这不是问题,但输入和输出位于相同的引脚上。我知道 74hc573 应该在 LE 变低后保持信息,但我只是想不通如何在不向前一个芯片提供新信息的情况下读取 74hc541 的输出,因为状态会再次发生变化。目前我只能对角读取键,因为在那种情况下输入和输出匹配。
整个电路的原理图可以看这里:
这里有问题的部分:
我在 C 中尝试了很多不同的方法来让它工作,但我能做的最好的是从 1 到 C 的对角线,因为共享 I/O.
希望大家指点一下,帮助我理解这一点。
和我的代码,它只是应该负责获取输出的部分。
while(1)
{
for(i=0;i<4;i++)
{
P3_7=0;
P3_6=1;
in=((0b11110111>>i)&0b00001111);
//in=0b11110111;
*keypad=in;
*led=in;
P3_7=0;
P3_6=0;
*keypad=0x00;
P3_7=1;
out=*keypad;
P3_7 是 RD,P3_6 是 WR,还没有给它们正确的定义
修改后的代码
while(1)
{
for(i=0;i<4;i++)
{
P3_7=0;
P3_6=1;
in=((0b11110111>>i)&0b00001111);
*keypad=in;
*led=*keypad;
vardelay(100);
P3_7=0;
P3_6=0;
*keypad=0xff;
P3_7=1;
out=(*keypad&0b00001111);
if (in==0b1101&&out==0b1101)
{
P3_7=1;
P3_6=1;
lcd_senddata('5');
}
else if(in==0b1110&&out==0b1101)
{
P3_7=1;
P3_6=1;
lcd_senddata('2');
}
单击“5”时,它会同时打印 5 和 2。我不确定为什么
关键是能够控制LE引脚。锁存 Q1,然后禁用 LE。扫描 A1-A4 以测试按钮 1、2、3 和 F。如果 LE 为低,状态 Q1-4 不应在扫描期间改变。然后启用LE,切换到Q2,禁用LE并扫描下一行,依此类推。
原来我想多了,我不得不简单地从同一个地址写入和读取。就这些。像这样一个简单的代码,将工作
if (*keypad=0b11111101)
{
out=*keypad;
if (out==0b11111110)
lcd_senddata('4');
else if (out==0b11111101)
lcd_senddata('5');
else if (out==0b11111011)
lcd_senddata('6');
else if (out==0b11110111)
lcd_senddata('E');
我有一个问题困扰了我一天多了,我无法用我的技能解决这个问题。 所以问题如下。我正在尝试从 4x4 键盘获取输出,这不是问题,但输入和输出位于相同的引脚上。我知道 74hc573 应该在 LE 变低后保持信息,但我只是想不通如何在不向前一个芯片提供新信息的情况下读取 74hc541 的输出,因为状态会再次发生变化。目前我只能对角读取键,因为在那种情况下输入和输出匹配。
整个电路的原理图可以看这里:
这里有问题的部分:
我在 C 中尝试了很多不同的方法来让它工作,但我能做的最好的是从 1 到 C 的对角线,因为共享 I/O.
希望大家指点一下,帮助我理解这一点。
和我的代码,它只是应该负责获取输出的部分。
while(1)
{
for(i=0;i<4;i++)
{
P3_7=0;
P3_6=1;
in=((0b11110111>>i)&0b00001111);
//in=0b11110111;
*keypad=in;
*led=in;
P3_7=0;
P3_6=0;
*keypad=0x00;
P3_7=1;
out=*keypad;
P3_7 是 RD,P3_6 是 WR,还没有给它们正确的定义
修改后的代码
while(1)
{
for(i=0;i<4;i++)
{
P3_7=0;
P3_6=1;
in=((0b11110111>>i)&0b00001111);
*keypad=in;
*led=*keypad;
vardelay(100);
P3_7=0;
P3_6=0;
*keypad=0xff;
P3_7=1;
out=(*keypad&0b00001111);
if (in==0b1101&&out==0b1101)
{
P3_7=1;
P3_6=1;
lcd_senddata('5');
}
else if(in==0b1110&&out==0b1101)
{
P3_7=1;
P3_6=1;
lcd_senddata('2');
}
单击“5”时,它会同时打印 5 和 2。我不确定为什么
关键是能够控制LE引脚。锁存 Q1,然后禁用 LE。扫描 A1-A4 以测试按钮 1、2、3 和 F。如果 LE 为低,状态 Q1-4 不应在扫描期间改变。然后启用LE,切换到Q2,禁用LE并扫描下一行,依此类推。
原来我想多了,我不得不简单地从同一个地址写入和读取。就这些。像这样一个简单的代码,将工作
if (*keypad=0b11111101)
{
out=*keypad;
if (out==0b11111110)
lcd_senddata('4');
else if (out==0b11111101)
lcd_senddata('5');
else if (out==0b11111011)
lcd_senddata('6');
else if (out==0b11110111)
lcd_senddata('E');