74HC165級聯編程篇(四)

       前面的文章已詳細講述了74HC165級聯的原理和工作過程,下面以兩片74HC165級聯來檢測16個輕觸按鍵的狀態爲例,當按鍵被按下時點亮對應的LED。

       直接貼出代碼,相應的語句已做好註釋,結合起前面的文章,相信也很容易理解。

/*** 74hc165.h ***/
#ifndef _74HC165_H
#define _74HC165_H

#include "allhead.h"

sbit HC165_PL = P2^5; //PL 並行數據輸入使能,低電平有效
sbit HC165_CLK = P2^7;//CP 時鐘,上升沿觸發
sbit HC165_OUT = P2^4; //Q7 串行數據輸出
sbit HC165_CE = P2^6;//CE 時鐘使能,低電平有效

void _74hc165_init(void);
void _74hc165_read_2byte(uchar date[2]);

#endif
/*** 74hc165.c ***/
#include "74hc165.h"

//初始化74hc165
void _74hc165_init(void)
{
	HC165_CE = 0; //初始化使能時鐘,後面就不需再使能
	HC165_PL = 1; //PL拉高,不讀取按鍵狀態
	HC165_CLK = 1; //時鐘拉高,便於產生上升沿
}

//讀取兩個74HC165級聯
void _74hc165_read_2byte(uchar date[2])
{
	uchar i;
	uint temp = 0;
	
	HC165_PL = 0; //PL拉低,讀取按鍵狀態
	HC165_PL = 1; //PL拉高,停止按鍵讀取
	
	if(HC165_OUT == 1)        //等於1即並行輸入D7引腳的按鍵被按下
			temp |= 0x01;         //最低位置1表示按鍵被按下,反之則沒按鍵被按下
	for(i = 0; i < 15; i ++)  //因爲最高位不用移位即可讀取,故循環(16-1)次,依次把次高位移到最高位,第一級74HC165優先讀取
	{
		temp = temp << 1;

		HC165_CLK = 0; //HC165_CLK = 0 ——> HC165_CLK = 1 產生上升沿,次高位D(n-1)移到高位D(n)
		_nop_();
		_nop_();
		HC165_CLK = 1;

		if(HC165_OUT == 1)
			temp |= 0x01;
	}
	//將16位數據分離爲兩個8位數據
	date[0] = (uchar)(temp & 0x00ff);//第二級74HC165的數據
	date[1] = (uchar)((temp >> 8) & 0x00ff);//第一級74HC165的數據
}
/*** main.c ***/
#include "allhead.h"
#include "74hc165.h"
#include "74hc595.h"
#include "delay.h"

sbit LED = P1^0;
uchar keyadata = 0;
uchar keystate[1] = {0};
uchar key2state[2]={0,0};

void main(void)
{
	_74hc165_init();//74HC165初始化
	_74hc595_init();//74HC595初始化
	
	while(1)
	{
		LED =0;

		_74hc165_read_2byte(key2state);//讀取兩級74HC165的數據,即16個按鍵的狀態
		_74hc595_send_mult_byte(key2state,2);//將讀取回來的按鍵狀態發送給74HC595點亮LED
		
	}
}

proteus仿真結果如下圖:

proteus仿真文件下載:

下載地址:https://pan.baidu.com/s/1FrhTHa5Cbt-WX39GuQ-p5Q

提取碼:8rjt

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章