打印

谁能帮忙看看这个程序,新手不懂?

[复制链接]
2120|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xawanggang78|  楼主 | 2010-10-3 22:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xawanggang78 于 2010-10-3 22:50 编辑

;* 1. 通过本例程了解74HC165(并入串出) 的基本原理和使用          *
;* 2.了解掌握SPI总线接口的工作原理及一般编程方法。           *
;* 3. 懂的74HC165在汇编语言中是如何操作                                   *
;*                                               *
;*******************************************************************************/
;================================================
     IN_Dat    EQU  P1.7   ;数据输出  数据通过P1.7脚移进单片机内处理
     IN_PL     EQU  P1.6   ;锁存器控制脉冲 74HC165  shift load    把数据加载到锁存器中
     CLK       EQU  P3.6   ;移位时钟脉冲
  Relay     EQU  P1.4
  Beep    EQU  P1.5
     
;================================================
        ORG  0000H
        LJMP   MAIN
        ORG  0030H
;================================================
MAIN:
  CALL IN_165 ;    调用165子程序
  MOV P2,#0FFH
      SETB Relay
  MOV R3 , A     ;累加器中值暂存R3
  ANL A , #01H
  CJNE A , #01H , K2
  CLR Relay     ;打开继电器
  CLR P2.7     ;打开LED灯
K2:
  MOV  A ,R3
     ANL A , #02H    ;屏蔽第二位
     CJNE A , #02H , K3
  CLR P2.6
  CALL BEEP_B     ;调用蜂鸣器发声
K3:     MOV  A ,R3
     ANL A , #04H    ;屏蔽第三位
     CJNE A , #04H , K4  ;相等则顺序执行
  CLR P2.5
  CALL BEEP_B     ;调用蜂鸣器发声
           
K4:     MOV  A ,R3
     ANL A , #08H    ;屏蔽第四位
     CJNE A , #08H , K5
  CLR P2.4
  CALL BEEP_B     ;调用蜂鸣器发声
K5:    MOV  A ,R3
     ANL A , #10H
     CJNE A , #10H , K6
  CLR P2.3
  CALL BEEP_B
K6:     MOV  A ,R3
     ANL A , #20H
     CJNE A , #20H , K7 ;相等则顺序执行
  CLR P2.2
  CALL BEEP_B
K7:   MOV  A ,R3
     ANL A , #40H
     CJNE A , #40H , K8
  CLR P2.1
  CALL BEEP_B
K8:     MOV  A ,R3
     ANL A , #80H
     CJNE A , #80H , LABLE1
  CLR P2.0
  CALL BEEP_B  
                 
LABLE1:      
        JMP  MAIN

     
;---------------------------------------------------------------
;输入锁存器子程序165  (SPI驱动程序)
;---------------------------------------------------------------
IN_165:
      
        CLR  IN_PL
        NOP     ;用NOP指令产生方波
        NOP
        SETB IN_PL       ;下降沿将数据送到输出锁存器
  NOP
  LCALL R_165
  CPL A
     RET
;--------------------------------------------------------------
;移位寄存器移出数据子程序
;--------------------------------------------------------------
R_165:         
        MOV R4,#08H      ;总共移8次   
        MOV A,#00H
R_LOOP:        
        RL  A      ;左移
  JNB IN_Dat ,Lab
  ADD A , #01H
               
Lab:    SETB CLK         ;上升沿发生移位
     NOP
        NOP
       CLR CLK
        DJNZ R4,R_LOOP
        RET

;--------------------------------------------------------
;蜂鸣器(让蜂鸣器发出动听声音)
;--------------------------------------------------------
BEEP_B:
         MOV  R6,#2
  BL1:   CALL  DEX1
         CPL   Beep
         DJNZ  R6,BL1
         RET
DEX1:   MOV  R7,#255
DEX2:   NOP
         DJNZ  R7,DEX2
         RET
;-----------------------------------------------------
END

相关帖子

沙发
xawanggang78|  楼主 | 2010-10-3 22:48 | 只看该作者
主要是子程序R_165看不懂,大侠帮帮忙,小虾在这里谢谢了。

使用特权

评论回复
板凳
yewuyi| | 2010-10-3 22:59 | 只看该作者
操作IO口软件模拟74HC165的驱动时序.

使用特权

评论回复
地板
zhaigch| | 2010-10-4 00:02 | 只看该作者
看了会,明白了,好久没有看进单片机的东西了!
是这样的:如果输入的数据为10101010,
程序是这样执行的,第一位是1,就对A加一个1,Lab  是为了产生 时钟信号时165工作!
在执行到R_LOOP时,A做一了一位变成了00000010,输入位为0,就继续,再输入为1 , A左移后变成000000100,加1,变成00000101,就这样一次执行吧次,变成10101010,
这个函数的结果是使A中保存165传入的数据!!!!
就这样……

使用特权

评论回复
5
xawanggang78|  楼主 | 2010-10-5 10:53 | 只看该作者
这个语句干吗的:JNB IN_Dat ,Lab

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

19

帖子

1

粉丝