单片机驱动74hc165程序

编程实验

72人已加入

描述

74HC165简介

74HC165是八位并行输入/串行输出移位寄存器,两片74HC165串联在一起,在时钟脉冲的作用下,从KB-DAT读入串行数据,可完成对16位键盘数据扫描读取。

74HC165是一款高速CMOS器件,74HC165遵循JEDEC标准no.7A。74HC165引脚兼容低功耗肖特基TTL(LSTTL)系列。

74HC165是8位并行输入串行输出移位寄存器,可在末级得到互斥的串行输出(Q0和Q7),当并行读取(PL)输入为低时,从D0到D7口输入的并行数据将被异步地读取进寄存器内。而当PL为高时,数据将从DS输入端串行进入寄存器,在每个时钟脉冲的上升沿向右移动一位(Q0→Q1→Q2,等等)。利用这种特性,只要把Q7输出绑定到下一级的DS输入,即可实现并转串扩展。

74HC165的时钟输入是一个“门控或”结构,允许其中一个输入端作为低有效时钟使能(CE)输入。CP和CE的引脚分配是独立的并且在必要时,为了布线的方便可以互换。只有在CP为高时,才允许CE由低转高。在PL上升沿来临之前,CP或者CE应当置高,以防止数据在PL的活动状态发生位移。

单片机驱动74hc165程序

单片机

当1脚拉低时,八位并行数据被压入锁存器,但与此同时,D7也已经从7脚输出,因此只要再循环7次将数据读出即可

ucharReadExport(void)

{

unsignedchari=0,receive_date=0;

ucharRead_Int;

Clr_P25;//使能控制。为低电平时,并行数据进入锁存器

Clr_P25;

Read_Int=(P2&0x10);//串行输出数据线

if(Read_Int==0x10)//把最高位读出

receive_date|=0x01;

Clr_P03;

Set_P25;//为高电平时,可以进行串行数据读出

for(i=1;i《=7;i++)//接下来只要进行7次循环

{

Clr_P03;

Set_P03;//时钟线,上升沿有效

Read_Int=(P2&0x10);//串行输出数据线

if(Read_Int==0x10)

{

receive_date|=(0x01《《i);

}

}

returnreceive_date;

}

基于51单片机之74HC165实验例程

**************************Copyright(C)CaKe*****************************************

==================================================

==============**文件名:main.c==============

==============**作者:CaKen==============

==============**版本号:V1.0==============

==============**时间:2014.08.16==============

==============**功能描述:74HC165实验测试==============

====================================================

**********************************************************

#include

#include

//SPI接口

sbitCLK=P3^6;//串行时钟

sbitIN_PL=P1^6;//把数据加载到锁存器中

sbitIN_Dat=P1^7;//数据通过P1.7脚移进单片机内处理

sbitRELAY=P1^4;//继电器

sbitBEEP=P1^5;//蜂鸣器

unsignedcharbdataKey;

sbitK0=Key^0;//位定义

sbitK1=Key^1;//位定义

sbitK2=Key^2;//位定义

sbitK3=Key^3;//位定义

sbitK4=Key^4;//位定义

sbitK5=Key^5;//位定义

sbitK6=Key^6;//位定义

sbitK7=Key^7;//位定义

bitM0,K0J;//位定义

**********************************************************

函数名:

调用:beep();

参数:

返回值:

结果:

备注:蜂鸣器(让蜂鸣器发出动听声音)

************************************************************

voidbeep()

{

unsignedchari,j;

for(i=0;i《2;i++)

{

for(j=0;j《255;j++)

{_nop_();}

BEEP=!BEEP;//BEEP取反

}

BEEP=1;//关闭蜂鸣器

}

*********************************************************

函数名:74HC165函数初始化

调用:HC165_Init();

参数:

返回值:

结果:

备注:IN_PL上升沿,CLK上升沿

********************************************************

unsignedlongHC165_Init(void)

{

unsignedchari;

unsignedintindata;

IN_PL=0;//上升沿

_nop_();//短暂延时产生一定宽度的脉冲

IN_PL=1;//将外部信号全部读入锁存器中

_nop_();

indata=0;//保存数据的变量清0

for(i=0;i《8;i++)

{

indata=indata《《1;//左移一位

if(IN_Dat==1)

indata=indata+1;//如果IN_Dat检测到高电平保存数据的变量加1

CLK=0;//时钟置0

_nop_();//上升沿

CLK=1;//时钟置1

}

return(~indata);//将保存数据的变量取反后返回

}

*********************************************************

函数名:主函数

调用:main

参数:

返回值:

结果:

备注:74HC165控制八个按键

********************************************************

main()

{

while(1)

{

unsignedlongInput=HC165_Init();//调用165驱动程序

Key=Input&0xff;//将数据传给位变量

RELAY=1;

P2=0xff;//清除

if(K0&K0J)

M0=~M0;//实现脉冲输入大家仔细体会

K0J=~K0;

if(M0){RELAY=0;P2=0x7f;}//实现脉冲输入

if(K1){beep();P2=0xbf;}//K1为1时开启蜂鸣器和2个灯

if(K2){beep();P2=0xdf;}

if(K3){beep();P2=0xef;}

if(K4){beep();P2=0xf7;}

if(K5){beep();P2=0xfb;}

if(K6){beep();P2=0xfd;}

if(K7){beep();P2=0xfe;}

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分