1. 程式人生 > >74HC595在【8x8LED點陣】中的使用

74HC595在【8x8LED點陣】中的使用

前幾天學了點陣的顯示,今天按自己的思路來總結一下。

首先介紹一下點陣的顯示原理。點陣的電路圖和之前學過的矩陣按鍵的電路圖是相似的。

每個燈就相當於座標圖中的一個點,具有唯一獨特的座標位置,這樣就可以通過引腳的訊號來控制每個燈的關和開

col管腳連線的是P0的八個引腳,row管腳連線的是595的八位並行輸出端。

實驗中採取的是逐列顯示,通過P0控制八列每列逐列顯示,其間通過595位移快取器控制每列要亮的led燈。



74HC595是串入並出帶有鎖存功能移位暫存器.如圖:

形象來說,14引腳是搬運工,11是進廠守門員,12是出廠守門員,

11出現上升沿時,從14引腳輸入一位資料,一共重複八次

12引腳上升沿時,將之前進來的八位資料分別從1到7引腳輸出

OE為使能端,低電平時使輸出有效,所以實驗的時候接GND就行

10為主復位,低電平時有效,實驗時讓它為高


附74HC595真值表


用筆對著點陣描摹的愛心,然後一列一列轉成二進位制碼

愛心點陣,親測有效。


#include "reg51.h"			
#include<intrins.h>


typedef unsigned int u16;	 
typedef unsigned char u8;


sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;


u8 ledduan[]={0x38,0x44,0x42,0x21,0x42,0x44,0x38,0x00};
u8 ledwei[]={0x7f
,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

void delay(u16 i)
{
	while(i--);	
}


void Hc595SendByte(u8 dat)
{
	u8 a;
	SRCLK=0;
	RCLK=0;
	for(a=0;a<8;a++)
	{
		SER=dat>>7;
		dat<<=1;


		SRCLK=1;
		_nop_();
		_nop_();
		SRCLK=0;	
	}


	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
}

void main()
{			
	u8 i;
	while(1)
	{
		P0=0x7f;
		for(i=0;i<8;i++)
		{
			P0=ledwei[i];		  //位選
			Hc595SendByte(ledduan[i]);	//傳送段選資料
			delay(100);		   //延時
			Hc595SendByte(0x00);  //消隱
		}	
	}		
}