找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2733|回复: 7
打印 上一主题 下一主题
收起左侧

求助单片机+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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

使用道具 举报

板凳
ID:570965 发表于 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那个是低或者拉高,怎么去识别,还请不吝赐教,非常感谢~
回复

使用道具 举报

地板
ID:161164 发表于 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
单片机也会捡测不到

以下是我写的例子






回复

使用道具 举报

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

非常感谢,是我愚钝,只想着只能输入串口了,谢谢~~
回复

使用道具 举报

6#
ID:517466 发表于 2022-1-7 19:43 | 只看该作者
单片机所有IO口都可以即时作为输入端或者输出端。显示LCD一般最多也就需要12、13个IO口,而89C52有40个IO口可以使用。所以你完全可以抛弃164,直接使用IO口驱动LCD,其他未使用的,选一些出来做动态扫描键盘用。
回复

使用道具 举报

7#
ID:624769 发表于 2022-1-7 20:43 | 只看该作者
win_shi 发表于 2022-1-7 13:31
非常感谢您的指导,我也是想用当P26==0时来判断有按键按下,但是不知道怎么去判断是那个按键按下的,查资 ...

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

如果你无法保证164输出单一的低电平,
那么:你只能添加,为了产生单一低电平而操作164的代码,并在该时间点读取P26状态的代码,来判断按键了。
回复

使用道具 举报

8#
ID:712493 发表于 2022-6-17 16:52 | 只看该作者
lkc8210 发表于 2022-1-7 14:52
74hc164的输出是由你控制的
怎么会不知道输出的并口状态呢?
如单片机控制164输出0xFD

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表