切换到宽版
  • 482阅读
  • 7回复

[C51]74HC165 IO口扩展问题新手请教 [复制链接]

上一主题 下一主题
离线495208501
 

发帖
66
M币
876
专家
0
粉丝
2
测试按键不是很灵有时候按了,有时候要按两次! 如何消除抖动!

#include <reg52.h>
#include <intrins.h>
                      
//SPI 接口
sbit    CLK    = P3^6;    //串行时钟
sbit    IN_PL  = P1^6;     //把数据加载到锁存器中
sbit    IN_Dat = P1^7;     //数据通过P1.7脚移进单片机内处理

sbit    RELAY  = P1^4;    //继电器

unsigned char bdata Key;
sbit    K0=Key^0;        //位定义
sbit    K1=Key^1;        //位定义
sbit    K2=Key^2;        //位定义
sbit    K3=Key^3;        //位定义
sbit    K4=Key^4;        //位定义
sbit    K5=Key^5;        //位定义
sbit    K6=Key^6;        //位定义
sbit    K7=Key^7;        //位定义

bit  M0 ,K0J; //位定义



unsigned long HC165_Init(void)
{
  unsigned char i;
  unsigned int indata;
  
   IN_PL=0;      //上升沿
   _nop_();                  //短暂延时 产生一定宽度的脉冲
   IN_PL=1;                  //将外部信号全部读入锁存器中
   _nop_();
            
   indata=0;                 //保存数据的变量清0
   for(i=0; i<8; i++)
    {
   indata=indata<<1;      //左移一位
      if(IN_Dat==1)
     indata=indata+1;  //如果IN_Dat检测到高电平 保存数据的变量加1
      CLK=0;               //时钟置0
        _nop_();    //上升沿
        CLK=1;               //时钟置1  
}  
   return(~indata);          //将保存数据的变量取反后返回
}


    main()
{  


  while(1)
  {
    unsigned long Input=HC165_Init();    //调用165驱动程序
  Key=Input&0xff;                     //将数据传给位变量
      RELAY = 1;

     P2 = 0xff;                          //清除

    if(K0&K0J)
    M0=~M0;               //实现脉冲输入  大家仔细体会
    K0J=~K0;
  

if(M0==0x7f) {RELAY = 0;}

   }    
}
离线mmxx2015

发帖
11
M币
-497
专家
0
粉丝
2
只看该作者 1楼 发表于: 01-31
一般按键消抖是这样做的:
(读取按键-->延时) 循环直到N次结果一样。如果程序没有其它功能,延时可以死循环延时,如果程序有其它功能,等其它程序执行完再读取按键就行了,去抖时间一般30mS左右就行了。
程序中按键变量用8位变量就行了,因为165只有8个输入。
离线495208501

发帖
66
M币
876
专家
0
粉丝
2
只看该作者 2楼 发表于: 02-02
继续等待,大神帮帮我
离线ahyu99

发帖
2643
M币
5961
专家
5
粉丝
41
只看该作者 3楼 发表于: 02-03
没有用过扩展的I/O口做按键。一般都是单片机的负跳变检测按键,如果还有抖动,那么就用一个电阻和一个电容就足够了。
专业回收航母。
离线小茅

发帖
2303
M币
1606
专家
6
粉丝
37
只看该作者 4楼 发表于: 02-08
按键消抖直接并联一个电容就可以了,比软件消抖好用
数码之家终于回归正常的论坛模式了
离线495208501

发帖
66
M币
876
专家
0
粉丝
2
只看该作者 5楼 发表于: 02-12
回 ahyu99 的帖子
ahyu99:没有用过扩展的I/O口做按键。一般都是单片机的负跳变检测按键,如果还有抖动,那么就用一个电阻和一个电容就足够了。 (2019-02-03 20:42) 回 ahyu99 的帖子

谢谢我试下
离线495208501

发帖
66
M币
876
专家
0
粉丝
2
只看该作者 6楼 发表于: 02-12
回 小茅 的帖子
小茅:按键消抖直接并联一个电容就可以了,比软件消抖好用 (2019-02-08 19:08) 回 小茅 的帖子

多大的电容谢谢
离线小茅

发帖
2303
M币
1606
专家
6
粉丝
37
只看该作者 7楼 发表于: 02-14
回 495208501 的帖子
495208501:多大的电容谢谢 (2019-02-12 14:53) 回 495208501 的帖子

100nF就够了,不需要太大
数码之家终于回归正常的论坛模式了