11.8*8LED點陣

將LED發光二極管分別集成封裝,一共有64個LED。採用動態掃描的方式,可以顯示數字和簡單漢字。
點亮對角線:循環發送每一行點亮對應的數據,再循環使低電平選中每一列。顯示其他的和點亮對角線原理一致。
在這裏插入圖片描述
循環發送行點亮對應的數據,再循環使低電平選中每一列。
在這裏插入圖片描述
循環發送列點亮對應的數據,再循環使低電平點亮每一行。
74HC595串行輸入並行輸出
P00-P07分別是每一列,P00在最右邊,P07在最左邊。
74HC595控制輸出段選D0-D7分別是每一行,D0在最下邊,D7在最上邊。(開發板所用爲第一個原理圖)
在這裏插入圖片描述
10腳控制主復位功能低電平有效,此處直接接VCC使使主復位功能失效。
11腳爲移位寄存器時鐘輸入,控制移位,12腳爲存儲寄存器時鐘輸入,控制存儲輸出,13腳爲輸出有效(低電平),14腳爲串行數據出入
???當11腳來一個上升沿,數據會輸出;12腳來一個上升沿,串行輸入的數據進行移位保存到數據存儲寄存器中
在這裏插入圖片描述
採用移位,先傳送高位,後傳送低位。
使兩個時鐘都延時兩個記憶週期的方法:

#include<intrins.h>
......
_nop_();//延時一個記憶週期
_nop_();//第二個

點亮左上角一個點的程序爲:

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

typedef unsigned char u8;
typedef unsigned int u16;

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

void Hc595SendByte(u8 dat)
{
	u8 a;
	SRCLK=0;
	RCLK=0;//先將兩個時鐘清零
	for(a=0;a<8;a++)
	{
		SER=dat>>7;//1000 0000>>7=1
		dat<<=1;//1000 0000<<1=0000 0000
		SRCLK=1;
		_nop_();
		_nop_();
		SRCLK=0;//上升沿延時兩個記憶週期後下降沿
	}
	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;//同上
}

void main()
{
	Hc595SendByte(0x80);//輸入數據0x80,僅最高位爲高電平
	P0=0x7f;//僅最高位置爲低電平
	while(1);
}

可以通過改變0x80和0x7f來實現一個任意一個點的點亮
注意事項:
1、必須爲#include<reg51.h>因爲52中有RCLK重複定義
2、開發板上,JP595短接,JOE和GND短接(不能光寫程序,要動開發板)
利用LED點陣點亮來顯示數字:

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

typedef unsigned char u8;
typedef unsigned int u16;

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

u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};//依次爲每一列串聯輸入D7-D0
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//依次爲每一行的P7-P0

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;//初始讓P7爲低電平
		for(i=0;i<8;i++)
		{
			Hc595SendByte(ledduan[i]);
			P0=ledwei[i];
			delay(100);
			Hc595SendByte(0x00);
		}
	}
}

可以通過改變ledwei[]的值來使輸出不同的字樣。

???如果不想讓595後邊的小燈泡點亮,可以拔掉JP595短接片

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