打印

2个74HC166串联,单片机读74HC166的程序

[复制链接]
5595|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
橡希|  楼主 | 2007-7-11 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2007-7-11 16:13 | 只看该作者

等待中...

使用特权

评论回复
板凳
zhiwei| | 2007-7-12 08:44 | 只看该作者

这个不难

只要三根线,两个PL连接用一个IO口,4个CLK合并用一个IO,第二片的串行数据输出接的一片的串行数据输入。单片机驱动是,先清除PL,发一个CLK完成并行数据锁存;然后置位PL,连发16个脉冲,每个脉冲后读一位即可。
U8 Read_Setting(void)
{
  U8 i,set;
  DDRB  &= ~(1 << PB_SDAT);//数据口方向设定为输入,准备读取数据

  PORTB &= ~(1 << PB_SPE);//74HC166并行有效
  _nop();
  _nop();
  PORTD |= 1 << PD_SCLK;  //上升沿数据锁存到74HC166
  _nop();
  _nop();
  PORTD &= ~(1 << PD_SCLK);
  
  PORTB |= 1 << PB_SPE;   //74HC166串行有效
  for(i = 0, set = 0; i < 8;i ++)//依次读取锁存的8位数据
  {
    set <<= 1;
    if(PINB & (1 << PB_SDAT))//读取该位数据
      set |= 1;
    PORTD |= 1 << PD_SCLK;   //发出一个脉冲
    _nop();
    _nop();
    PORTD &= ~(1 << PD_SCLK);//第8个脉冲将SER发送出来
  }
  
  DDRB  |= 1 << PB_SDAT;//设置为输出口,供显示用
  return set;
}

使用特权

评论回复
地板
古道热肠| | 2007-7-12 09:28 | 只看该作者

这种问题楼主自已应能解决的

  楼上真是好心人,代码都奉送上了。

使用特权

评论回复
5
橡希|  楼主 | 2007-7-17 17:32 | 只看该作者

谢谢各位热心人!我已经作好了。

以下是我的使用笔记:
74hc166 使用方法(包括级联)

74HC166为8位并入串出芯片,其引脚,时序图如图 


硬件介绍,2片74HC166.16位并行输入为16个按键,有键按下,则相应输入为低电平。


注意事项
1,在load并行数据前需要有一个CP的上升的脉冲。
2,在load完并行数据后,输出端Q7已经有了第一个bit的数据,所以后面只需循环移位7次,而不是8次。 若级联n片的话就后面循环8n-1次  否则读出的结果会错位。

以下为单片机相连的基本读程序功能:读取16位串行数据并通过UART 打印出来。如下(测试通过):
;====================================================================
; Date    : 2007 07 10
; Author  : CYH
; Chip    : AT89S52 74HC166
; Function: Receive serial data (8bits/16bit) from 74HC166  (SimScroll)

; _________________Registers Defination:
; A :PUT parallel data
; Modified By: CYH
; Date       : 2007 07 16
; two chip 74hc166 receive 16bits data ok,print date form UART
;====================================================================
      
RBUFF1    EQU   20H  ;RECEIVE BUFF 8bit
RBUFF2    EQU   21H  ;RECEIVE BUFF 8bit


;------8052 Extensions for timer2--- 
T2CON     EQU   0C8H
RCAP2L    EQU   0CAH
RCAP2H    EQU   0CBH
TL2       EQU   0CCH
TH2       EQU   0CDH

;-------pin definition------------
SIMCLK   BIT   P2.5  ;74HC166 CP
SIMCEN   BIT   P2.4  ;74HC166 CE
SIMPEN  BIT   P2.2  ;74HC166  PE

SIMCLR   BIT   P2.1  ;74HC166 MR
SIMSER1  BIT   P2.6  ;74HC166 Q7

      ORG    0023H
      AJMP   UART_Interrupt
      ORG    0040H
      AJMP   MAIN

MAIN: 
      MOV    SP,#7FH
      ACALL  Init_UART
      ACALL  READ_74HC166
      MOV    A,RBUFF1
      ACALL  SentOneByte
      MOV    A,RBUFF2
      ACALL  SentOneByte
      CALL   DELAY
      CALL   DELAY
      AJMP   MAIN


;-------------------------------
;     A : receive data temp store
READ_74HC166:
      MOV    R0,#7 ;counter
      MOV    A,#00H
      CLR    C
      SETB   SIMPEN  ;/PE=0  parallel enable input
      CLR    SIMCEN  ;/CE=0  clock enable input
      CLR    SIMCLR  ;/MR=0  asynchronous master reset(active LOW)
      CLR    SIMCLK  ;CLK=0
      NOP
      SETB   SIMCLR  ;/MR=1

      ;---------------------


      SETB   SIMCLK  ;CLK=1
      CLR    SIMPEN  ;/PE=0  load parallel data 
      NOP
      CLR    SIMCLK  
      NOP
      SETB   SIMCEN  ;/CE=1 inhibit     
      SETB   SIMCLK  ;CLK=0   UP
      SETB   SIMPEN  ;/PE=1
      NOP
      NOP
      CLR    SIMCLK
      CLR    SIMCEN  ;/CE=0 enable clock

      MOV     C,SIMSER1 ;receive first bit
      RLC     A
SHIFT:;shift 7 times  for bit 6~bit0
      SETB    SIMCLK ;
      NOP
      NOP
      MOV     C,SIMSER1
      RLC     A      
      CLR     SIMCLK 
      NOP
      ;NOP
      DJNZ    R0,SHIFT  ;8 bits     
      MOV     RBUFF1,A
      ;-------------------------------------
      MOV    R0,#8 ;shift the other 8 times 
      CLR    A
SHIFT1:
      SETB    SIMCLK ;
      NOP
      NOP
      MOV     C,SIMSER1
      RLC     A      
      CLR     SIMCLK 
      NOP
      NOP
      DJNZ    R0,SHIFT1  ;8 bits
      MOV     RBUFF2,A
      RET
      ;------initial UART----------
Init_UART:

      MOV     SCON,#50H; TIMER2
      MOV     TH2,#0FFH;9600
      MOV     TL2,#0D9H
      MOV     RCAP2H,#0FFH
      MOV     RCAP2L,#0D9H     
      SETB    EA     
      SETB    ES
      MOV     T2CON,#34H;TR2=1
      RET
UART_Interrupt:
      JB      RI,Is_receive
      CLR     TI
      RETI
Is_receive:
      
      CLR     RI
      PUSH   ACC
      MOV    A,SBUF
      ACALL  SentOneByte
      POP    ACC
      
      RETI
SentOneByte:
      clr    ES
      CLR    TI
      MOV    SBUF,A
Wait:
      JNB    TI,Wait
      CLR    TI
      SETB   ES
      RET
;---DELAY about 1s-------
DELAY:      
d1:  mov r6,#40
d2:  mov r7,#40
     djnz r7,$
     djnz r6,d2
     djnz r5,d1
     ret
     END 
 

使用特权

评论回复
6
橡希|  楼主 | 2007-7-17 17:35 | 只看该作者

特别感谢zhiwei:)

使用特权

评论回复
7
橡希|  楼主 | 2007-7-17 17:38 | 只看该作者

function table

确实应该自己仔细阅读datasheet多多思考。

使用特权

评论回复
8
zky2003| | 2007-7-17 17:51 | 只看该作者

这个贴子不能不顶了

这个贴子不能不顶了,加油

使用特权

评论回复
9
古董| | 2007-7-17 18:41 | 只看该作者

我也业顶一个

使用特权

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

本版积分规则

5

主题

24

帖子

0

粉丝