标题: 求助单片机+74HC164扫描按键怎么实现思路及驱动 [打印本页]

作者: win_shi    时间: 2022-1-7 10:40
标题: 求助单片机+74HC164扫描按键怎么实现思路及驱动
74HC164是 二位串入、8位并出移位寄存器
时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA 和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
八位输出已经搞定,研究明白;代码如下,可是键盘扫描如何实现,还请指教!
实现发送单片机代码如下:
#define HC164_CLR_L  P2^0=0;
#define HC164_CLR_H  P2^0=1;
#define HC164_OUT_L  P2^1=0;
#define HC164_OUT_H  P2^1=1;
void hc164SetDat(u8 dat) //发数据
{
        u8 i;     
        for(i=0;i<8;i++)
        {
                HC164_OUT_L;                 
                if(dat&0x80)
                  {
                    HC164_CLR_H;                     
                  }
                else
                  {
                    HC164_CLR_L;                       
                  }
                HC164_OUT_H;               
                dat = dat<<1;              
        }
}

74hc164.jpg (390.94 KB, 下载次数: 54)

74hc164.jpg

作者: 188610329    时间: 2022-1-7 13:14
在你程序中, 你应该清楚地知道在任意时间点, D1,D2,D3,D4 状态的吧?
当P2.6 = 0 的时候, D1~D4 哪个处于 低电平, 说明 这一时刻 与之对应的 K1~K4 中的哪个按键被按下。
一般,LCD 不太适合用这个方式因为不需要时时更新LCD的内容。
通常,这个方式比较适合用在动态扫描 的 LED上 , 接在LED的公共端,在更新位码的时候顺便 判断一下If(P26 == 0)  就能立刻确定按键了。
作者: win_shi    时间: 2022-1-7 13:31
188610329 发表于 2022-1-7 13:14
在你程序中, 你应该清楚地知道在任意时间点, D1,D2,D3,D4 状态的吧?
当P2.6 = 0 的时候, D1~D4 哪个处于 ...

非常感谢您的指导,我也是想用当P26==0时来判断有按键按下,但是不知道怎么去判断是那个按键按下的,查资料说74hc164只支持输入,所以输出的并口状态如何获取呢,也就是k1 k2 k3 k4那个是低或者拉高,怎么去识别,还请不吝赐教,非常感谢~
作者: lkc8210    时间: 2022-1-7 14:52
win_shi 发表于 2022-1-7 13:31
非常感谢您的指导,我也是想用当P26==0时来判断有按键按下,但是不知道怎么去判断是那个按键按下的,查资 ...

74hc164的输出是由你控制的
怎么会不知道输出的并口状态呢?
如单片机控制164输出0xFD
而又捡测到P26 == 0
就说明K1按下

但正如沙发所说的
这个方式只适合用在动态扫描 的 LED上
因为你不能保证164输出单一低电平
如164输出0xF9而按下的是K2
单片机就可能以为是K1按下

而且如果164的D1长期输出高点平(机会很小但有可能出现)
就算按下K1
单片机也会捡测不到

以下是我写的例子







作者: win_shi    时间: 2022-1-7 15:48
lkc8210 发表于 2022-1-7 14:52
74hc164的输出是由你控制的
怎么会不知道输出的并口状态呢?
如单片机控制164输出0xFD

非常感谢,是我愚钝,只想着只能输入串口了,谢谢~~
作者: suncat0504    时间: 2022-1-7 19:43
单片机所有IO口都可以即时作为输入端或者输出端。显示LCD一般最多也就需要12、13个IO口,而89C52有40个IO口可以使用。所以你完全可以抛弃164,直接使用IO口驱动LCD,其他未使用的,选一些出来做动态扫描键盘用。
作者: 188610329    时间: 2022-1-7 20:43
win_shi 发表于 2022-1-7 13:31
非常感谢您的指导,我也是想用当P26==0时来判断有按键按下,但是不知道怎么去判断是那个按键按下的,查资 ...

地板已经解释得很详细了,

如果你无法保证164输出单一的低电平,
那么:你只能添加,为了产生单一低电平而操作164的代码,并在该时间点读取P26状态的代码,来判断按键了。
作者: fj51hei    时间: 2022-6-17 16:52
lkc8210 发表于 2022-1-7 14:52
74hc164的输出是由你控制的
怎么会不知道输出的并口状态呢?
如单片机控制164输出0xFD

这个会出现两键同时被按下的情形,会出现显示不正常问题?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1