74HC165的級聯電路圖
74HC165是一款高速CMOS器件,74HC165遵循JEDEC標準no.7A。74HC165引腳兼容低功耗肖特基TTL(LSTTL)系列。
74HC165是8位并行讀取或串行輸入移位寄存器,可在末級得到互斥的串行輸出(Q7和Q7),當并行讀取(PL)輸入為低時,從D0到D7口輸入的并行數據將被異步地讀取進寄存器內。
而當PL為高時,數據將從DS輸入端串行進入寄存器,在每個時鐘脈沖的上升沿向右移動一位(Q0→Q1→Q2,等等)。利用這種特性,只要把Q7輸出綁定到下一級的DS輸入,即可實現并轉串擴展。
74HC165的時鐘輸入是一個“門控或”結構,允許其中一個輸入端作為低有效時鐘使能(CE)輸入。CP和CE的引腳分配是獨立的并且在必要時,為了布線的方便可以互換。只有在CP為高時,才允許CE由低轉高。在PL上升沿來臨之前,不論是CP還是CE,都應當置高,以防止數據在PL的活動狀態發生位移。
74HC165是一種并入串出的芯片,我們可以用它來做按鍵檢測。它可以外接8個接鍵,然后將數據轉成串行的送入單片機。如果用74HC165做鍵盤的話,能節省很多IO口。
74hc165使用方法與級聯程序
LCD程序是采用wang1jin帶您從零學單片機里面的1602程序修改。
#include《AT89X52.H》
#include“LCD.h”
#defineuint16unsignedint
#defineuint8unsignedchar
#defineAUDIO_OUTP0
///////////////////////////////////////////////////////
sbitHC165_CE=P1^1;//HC165控制端L有效
sbitHC165_PL=P1^2;//HC165鎖存引腳H高效
sbitHC165_CLK=P1^0;//HC165時鐘引腳
sbitHC165_IN=P1^3;//HC165數據輸出引腳
uint8Address=0;//本地地址變量
uint8Priority=0;//優先級變量
///////////////////////////////////////////////////////
uint8LCD_DATA1[]={
‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’
};
voidInit_INT(void);
voidRead_HC165(void);
voidmain(void){
Init_INT();LCD1602();
Init_Lcd();while(1){
Read_HC165();
Display_LCD_Byte(0,0,‘0’);
Display_LCD_Byte(0,1,‘x’);
Display_LCD_Byte(0,2,LCD_DATA1[Address/16]);
Display_LCD_Byte(0,3,LCD_DATA1[Address%16]);
Display_LCD_Byte(1,0,‘0’);
Display_LCD_Byte(1,1,‘x’);
Display_LCD_Byte(1,2,LCD_DATA1[Priority/16]);
Display_LCD_Byte(1,3,LCD_DATA1[Priority%16]);
}
}
////////////////////////////////////////////////定時器初始化
//////////////////////////////////////////////voidInit_INT(void)
{
TMOD=0x01;
ET0=1;
TR0=1;
EA=1;
TH0=0xF8;
TL0=0xC5;
}
//////////////////////////////////////////////
//讀取優先級和本機地址
//當執行本次程序時
//函數會將165的信號優先級
//以及本機的地址送到Priority和Address
//////////////////////////////////////////////
voidRead_HC165(void)
{
uint8i=0;//臨時變量
uint8BJ_Address=0;
uint8BJ_Priority=0;
HC165_CE=0;//打開165選通端
HC165_PL=0;//允許數據進入165
for(i=0;i《8;i++)//讀8次數據
{
HC165_PL=1;//允許數據移位
HC165_CLK=0;//低電平時讀取數據
if(HC165_IN)//數據高位在前
{
BJ_Priority|=0x80》》i;
}
HC165_CLK=1;//數據移位
}
for(i=0;i《8;i++)//讀取下一個165的數據
{
HC165_CLK=0;
if(HC165_IN)
{
BJ_Address|=0x80》》i;
}
HC165_CLK=1;
}
HC165_CE=1;
HC165_PL=0;
Address=BJ_Address;
Priority=BJ_Priority;
}
#ifndef_LCD_H_
#define_LCD_H_
#include《AT89X52.H》
#defineLCD_DATAP3
sbitRS=P1^5;
sbitRW=P1^6;
sbitEN=P1^7;
voidLCD1602(void);
voidRead_Busy(void);
voidWrite_Lcd(unsignedcharValue,biti);voidInit_Lcd(void);
voidDelay(unsignedinti);
voidDisplay_LCD_Byte(unsignedchary,unsignedcharx,unsignedcharValue);
#endif
#include“LCD.h”
voidLCD1602(void)
{
EN=0;
RS=1;
RW=1;
LCD_DATA=0xFF;
}
voidRead_Busy(void)
{
LCD_DATA=0xFF;
RS=0;
RW=1;
EN=1;
//while(LCD_DATA&0x80);
Delay(100);
EN=0;}
voidWrite_Lcd(unsignedcharValue,biti)//i=0寫指令.i=1寫數據;
{
Read_Busy();
LCD_DATA=Value;
RS=i;RW=0;
EN=1;
EN=0;
}
voidInit_Lcd(void)
{
Delay(15000);
Write_Lcd(0x38,0);
Delay(5000);
Write_Lcd(0x38,0);
Delay(5000);
Write_Lcd(0x38,0);
Write_Lcd(0x08,0);
Write_Lcd(0x01,0);
Write_Lcd(0x06,0);
Write_Lcd(0x0c,0);
}
voidDisplay_LCD_Byte(unsignedchar
y,unsignedcharx,unsignedcharValue)
{
y&=0x01;//y不能大于1x&=0x0F;//x不能大于15
if(y)//是否顯示在第二行;
{
x+=0x40;//顯示在第二行,加0X40;
}
x+=0x80;
Write_Lcd(x,0);//寫入顯示的位置
Write_Lcd(Value,1);//寫入顯示數據}
voidDelay(unsignedinti)
{
while(--i);
}
評論
查看更多