//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);
}
用以简单的扩展数据口,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);
}