找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教单片机+74hc165程序的疑惑

[复制链接]
跳转到指定楼层
楼主
ID:578842 发表于 2021-5-10 14:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
其中这部分,请教大神释疑:
indata|=IN_Dat;
意思是通过或运算把数据赋值给indata,请问IN_Dat的数据是在最低位吗?
0000 0000 0000 0000|0000 0000 0000 0001 ,是这个意思吗?

  1. #include <reg52.H>
  2. #include <intrins.h>

  3. #define  NOP()   _nop_()   /* 定义空指令 */

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

  8. sbit    RELAY  = P1^4;
  9. sbit    BEEP   = P1^5;

  10. unsigned char bdata Key;
  11. sbit    K0=Key^0;         //位定义
  12. sbit    K1=Key^1;         //位定义
  13. sbit    K2=Key^2;         //位定义
  14. sbit    K3=Key^3;         //位定义
  15. sbit    K4=Key^4;
  16. sbit    K5=Key^5;
  17. sbit    K6=Key^6;
  18. sbit    K7=Key^7;

  19. bit  M0 ,K0J;  //位定义
  20. unsigned long ReHC74165(void);         //函数声名
  21. void beep();   

  22. /********************************************************
  23. *        主函数                                                                                                 *
  24. *                                                                                                                 *
  25. ********************************************************/
  26. main()
  27.   {         

  28.   while(1)
  29.   {
  30.     unsigned long  Input=ReHC74165();//调用165驱动程序
  31.          Key=Input&0xff;  //将数据传给位变量
  32.          RELAY = 1;
  33.      P2 = 0xff;          //清除

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

  37.         if(M0) {RELAY = 0; P2 = 0x7f;        }//实现脉冲输入
  38.         if(K1) {beep();    P2 = 0xbf;   }//K1 为1时开启蜂鸣器和2个灯
  39.         if(K2) {beep();    P2 = 0xdf;   }
  40.     if(K3) {beep();    P2 = 0xef;   }
  41.         if(K4) {beep();    P2 = 0xf7;   }
  42.         if(K5) {beep();    P2 = 0xfb;   }
  43.         if(K6) {beep();    P2 = 0xfd;   }
  44.         if(K7) {beep();    P2 = 0xfe;   }
  45.    }   

  46. }

  47. /**********************************************************
  48. *                                                                                                                   *
  49. *        蜂鸣器 (让蜂鸣器发出动听声音)                                                   *
  50. ************************************************************/
  51. void beep()
  52. {
  53.   unsigned char i , j;
  54.   for (i=0;i<2;i++)
  55.    {

  56.    for (j = 0; j<255; j++) {_nop_();}
  57.    BEEP=!BEEP;                 //BEEP取反
  58.    }
  59.   BEEP=1;                      //关闭蜂鸣器
  60. }

  61. /*************************此部分为74HC165的驱动程序使用SPI总线连接*************************************/


  62. /*********************************************************************************************************
  63. ** 函数名称:  74HC165
  64. ** 功能描述:
  65. ** 管脚描述:请参考相关的芯片资料(学习光盘中以配)
  66. *********************************************************************************************************/
  67. unsigned long ReHC74165(void)
  68. {  
  69.   unsigned char i;
  70.   unsigned int indata;
  71.                
  72.    IN_PL=0;
  73.    NOP();    //短暂延时 产生一定宽度的脉冲
  74.    IN_PL=1;         //将外部信号全部读入锁存器中
  75.    NOP();

  76.    indata=0;   //保存数据的变量清0  
  77.    for(i=0; i<8; i++)
  78.     {
  79.           indata=indata<<1;         //左移一位

  80.            CLK=0;   //时钟置0
  81.       NOP();
  82.          indata|=IN_Dat;
  83.       CLK=1;   //时钟置1         
  84.         }

  85.    return indata;         //将保存数据的变量取反后返回
  86. }



复制代码

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

使用道具 举报

沙发
ID:578842 发表于 2021-5-10 17:14 | 只看该作者
顶一顶帖子,求各位老师指教
回复

使用道具 举报

板凳
ID:917199 发表于 2021-5-10 18:38 | 只看该作者

印象中好像是这样的:
indata|=IN_Dat     ------->indata=indata|IN_Dat
如果
indata=0000 0000 0000 0000       IN_DAT=0000 0000 0000 0001
那么结果应该是indat=0000 0000 0000 0001
回复

使用道具 举报

地板
ID:917199 发表于 2021-5-10 18:39 | 只看该作者
一样的小白,仅供参考
回复

使用道具 举报

5#
ID:578842 发表于 2021-5-10 18:50 | 只看该作者
timerzero 发表于 2021-5-10 18:38
印象中好像是这样的:
indata|=IN_Dat     ------->indata=indata|IN_Dat
如果

关键是IN_Dat是单一位的芯片数据输出脚,感觉和16位的数据有点不合,是不是还有不知道的规则,就是想问这一点。
也就是说:是不是遇到这样的数据输出单片机就自动把它放在最低位?
回复

使用道具 举报

6#
ID:917199 发表于 2021-5-10 19:14 | 只看该作者
unsigned int indata
看来是8位数据,像串口那样逐位接受?     我小白等一位大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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