0

我有一个问题,我已经解决了一天多,我无法用我的技能解决这个问题。所以问题如下。我正在尝试从 4x4 键盘获取输出,这不是问题,但输入和输出位于相同的引脚上。我知道 74hc573 应该在 LE 变低后保留信息,但我只是不知道如何在不向前一个芯片提供新信息的情况下从 74hc541 读取输出,因为随后状态再次发生变化。目前我只能对角读取键,因为在这种情况下输入和输出匹配。

整个电路的示意图可以在这里看到:

以及这里有问题的部分:

我在 C 中尝试了许多不同的方法来使其工作,但由于共享 I/O,我能做的最好的就是从 1 到 C 对角线。
希望大家能给点建议,帮助我理解这一点。

和我的代码,它只是应该负责获取输出的部分。

    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。我不知道为什么

4

2 回答 2

0

原来我想多了,我不得不简单地从同一个地址写入和读取。就这些。像这样的简单代码,将工作

    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');
于 2015-01-16T14:21:15.897 回答
0

关键是能够控制 LE 引脚。锁存 Q1,然后禁用 LE。扫描 A1-A4 以测试按钮 1、2、3 和 F。如果 LE 为低电平,则在扫描期间状态 Q1-4 不应改变。然后启用 LE,切换到 Q2,禁用 LE 并扫描下一行,依此类推。

于 2015-01-15T14:09:19.453 回答