找回密码
 立即注册

QQ登录

只需一步,快速开始

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

74HC595输出接按键,单片机怎么读取键码?

[复制链接]
跳转到指定楼层
楼主

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2022-12-15 05:59 | 只看该作者
74HC595是串入并出的单向器件,不具有做输入的功能,输出一般是不能简单接按键的,需要软件配合。图示的运用也不是通过595读取键值,而是利用595输出的数码管有规律的位码驱动电平,经KEY端返回单片机识别键值,以达到节省IO口的目的。双向器件可以了解下74HC165。
回复

使用道具 举报

板凳
ID:94031 发表于 2022-12-15 07:00 | 只看该作者
按下按键时读KEY点值,看和Q0-Q3那一路同步就知道是那个键按下。
回复

使用道具 举报

地板
ID:69038 发表于 2022-12-15 08:52 | 只看该作者
595在这电路中和按键没有0.5元钱的关系,595在这边只是个扩口器件而已!!
回复

使用道具 举报

5#
ID:161164 发表于 2022-12-15 09:01 | 只看该作者
若用共阴数码管,KEY引脚要设为上拉
当KEY收到下降沿信号时
位输出595的数值(0xFE,0xFD,0xFB,0xF7)就是键值

若用共阳数码管,KEY引脚要设为下拉
当KEY收到上升沿信号时
位输出595的数值(0x01,0x02,0x04,0x08)就是键值
回复

使用道具 举报

6#
ID:213173 发表于 2022-12-15 09:24 | 只看该作者

仿真没有什么问题,实际运用要考虑按键消抖问题。
  1. #include <reg51.H>
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit P_HC595_SER   = P2^0;
  5. sbit P_HC595_SRCLK = P2^1;
  6. sbit P_HC595_RCLK  = P2^2;
  7. sbit KEY=P2^3;

  8. unsigned char code table[]={0x70,0x79,0xee};//KEY.
  9. unsigned char code display[]={//0~f-.
  10.         0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11.         0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
  12. unsigned char code wela[]={
  13.         0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

  14. /**************** 向HC595发送一个字节函数 ******************/
  15. void Send_595(uchar dat)
  16. {               
  17.         uchar i;
  18.         for(i=0;i<8;i++)
  19.         {
  20.                 dat <<= 1;
  21.                 P_HC595_SER  = CY; //溢出位赋值数据输出端
  22.                 P_HC595_SRCLK = 1; //移位时钟
  23.                 P_HC595_SRCLK = 0;
  24.         }
  25. }
  26. /**************** 向HC595发送2个字节驱动码 ******************/
  27. void DisplayScan()
  28. {       
  29.         static uchar i,j;
  30.         Send_595(wela[i]);//向HC595发送位码
  31. /**********根据位码识别按键********/
  32.         if(!KEY)
  33.         {
  34.                 switch(i)
  35.                 {
  36.                         case 0: j= 4; break;
  37.                         case 1: j= 1; break;
  38.                         case 2: j= 2; break;
  39.                         case 3: j= 3; break;
  40.                 }
  41.         }
  42. /******************************/
  43.         if(i==3)
  44.                 Send_595(display[j]);//向HC595发送段码显示键值
  45.         else
  46.                 Send_595(table[i]);  //向HC595发送段码显示KEY.
  47.         P_HC595_RCLK = 1;       //锁存输出数据
  48.         P_HC595_RCLK = 0;
  49.         i++;
  50.         i%=4;
  51. }

  52. void main()
  53. {
  54.         P_HC595_SRCLK = 0;//初始化移位时钟端
  55.         P_HC595_RCLK  = 0;//初始化锁存输出端
  56.         while(1)
  57.         {
  58.                 DisplayScan();
  59.         }
  60. }

复制代码



回复

使用道具 举报

7#
ID:1034262 发表于 2022-12-15 12:21 | 只看该作者
595会轮流输出高或低,没扫描一个,就读一次KEY即可。
回复

使用道具 举报

8#
ID:961242 发表于 2022-12-26 16:56 | 只看该作者
wulin 发表于 2022-12-15 09:24
仿真没有什么问题,实际运用要考虑按键消抖问题。

有没有STM32的案例程序?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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