將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短接片