编程实验
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的活动状态发生位移。
当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;
}
**************************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;}
}
}
全部0条评论
快来发表一下你的评论吧 !