呆猫一号吧 关注:128贴子:235
  • 2回复贴,共1

NO:1对于74HC164与74HC165的控制

只看楼主收藏回复

//09年4月//74HC164与74HC165的控制
用以简单的扩展数据口,164串入并出,165并入串出,都是属于8位的移位寄存器,同74hc595等一样,有共同的功能。
常见应用方向:走字屏,数据传送等
74164是一款8位移位寄存器,串行输入并行输出,常用于端口扩展,引脚排列如下:VCC 电源 GND 地 CP时钟输入断 CR清除端,DSA,DSB数据输入端,当CR为低电平时Q0~Q7 输出均为低电平,当数据输入端任意一引脚为低电平时,禁止数据输入并在CP上升沿作用下决定Q0的状态.当任意一引脚为高电平的时候 允许另一引脚输入数据并且在CP上升沿的作用下决定Q0的状态在使用的时候经常把其中的一个设置永久高电平(74595有同样功能但595比164多了锁存功能)
74hc164子程序(C51)
#include "reg52.h"
sbit CLK =P1^0;
sbit DINA =P1^1;
sbit DINB =P1^2;
sbit CLR164 =P1^3;
bdata unsigned char k;
sbit cc=k^7;
main()
{
unsigned char i;
CLK=0; //CLK=0
DINB=1; //DINB=1
CLR164=0; //CLR=0输出端口清零
CLR164=1; //CLR=1
k=0xAA; //用户输出数据初始化(即并行输出数据)
for(i=0;i<8;i++)
{
DINA=cc; //串行输出一位数据
CLK=1; //移位时钟
CLK=0;
k=k<<1;
}
while(1);
}
74hc164子程序(A51)
    CLK   EQU   P1.0
    DINA  EQU   P1.1
    DINB  EQU   P1.2
    CLR164   EQU   P1.3
    ORG   8000H
    LJMP  MAIN
    ORG   8100H
MAIN:
    MOV   SP,#60H     ;设置堆栈向量
    NOP         ;设置以下端口初始化
    CLR   CLK      ;CLK=0
    SETB  DINB     ;DINB=1
    CLR   CLR164      ;CLR=0输出端口清零
    SETB  CLR164      ;CLR=1
    MOV   A,#0AAH     ;用户输出数据初始化
    MOV   R4,#08H
SLCHG: RLC   A
    MOV   DINA,C      ;串行输出一位数据
    SETB  CLK      ;移位时钟
    NOP
    CLR   CLK
    NOP
    DJNZ  R4,SLCHG
    SJMP  $     ;程序结束,完成一次串并转换
    END
74165   8 位移位寄存器(并行输入,互补串行输出) 
 
A51
PL EQU P1.0
CLK1 EQU P1.1
CLK2 EQU P1.2
SER EQU P1.3
Q7 EQU P1.5
ORG 8000H
LJMP MAIN
ORG 8100H
MAIN: MOV  SP,#60H ;设置堆栈
MOV  R4,#00 ;延时
DJNZ  R4,$
MOV   A,#0 ;变量清零
SETB  Q7 ;Q=1,端口设为输入状态
CLR  SER ;SER=0
CLR  CLK2 ;CLK2=0
CLR  PL ;/PL=0
NOP ;锁存并行输入数据
SETB  PL ;/PL=1
NOP
MOV  R4,#08H ;设置循环变量
CLR  CLK1
PLCHG:
MOV  C,Q7 ;读入一位串行数据
RLC  A
SETB  CLK1 ;时钟脉冲
NOP
CLR   CLK1
NOP
DJNZ  R4,PLCHG
MOV  R7,A ;保存数据
SJMP  $ ;程序结束,完成一次并串转换
END
(C51)
#include "reg52.h"
sbit PL =P1^0;
sbit CLK1 =P1^1;
sbit CLK2 =P1^2;
sbit SER =P1^3;
sbit Q7 =P1^5;
bdata unsigned char k;
sbit cc=k^0;
main()
{
unsigned char i;
for(i=0;i<200;i++);
Q7=1;
k=0;
SER=0;
CLK2=0;
PL =0;
PL=1;
CLK1=0;
  for (i = 0; i < 8; i++)
{
cc = Q7;
if (i == 7) break; 
k = (k << 1);
CLK1 = 1;
CLK1 = 0;
}
while(1);
}



1楼2009-04-26 20:46回复
    • 218.9.149.*
    与74LS164有多大的分别啊?


    2楼2009-04-28 14:06
    回复
      • 124.77.223.*
      74595有同样功能但595比164多了锁存功能


      3楼2009-04-30 14:02
      回复