? ? ? 本設(shè)計(jì)使用了一個(gè)4位的數(shù)碼管,為共陽(yáng)型,為了節(jié)省單片機(jī)的IO口,使用了兩片74HC595作為數(shù)碼管的驅(qū)動(dòng)芯片,共占用3個(gè)IO口。74HC595部分電路圖如下:
與單片機(jī)相連接的三個(gè)腳分別為: HC_DAT,HC_RCK,HC_CLK。兩片595采用級(jí)聯(lián)方式,即U2的第9腳接到U3的第14引腳。
74HC595是8位的移位寄存器,串入并出,并具有鎖存功能,被廣泛的用于數(shù)碼管、點(diǎn)陣的驅(qū)動(dòng)電路中。其管腳介紹如下:
15: 數(shù)據(jù)輸出A-接數(shù)碼管數(shù)據(jù)A段;
l: 數(shù)據(jù)輸出B-接數(shù)碼管數(shù)據(jù)B段;
2: 數(shù)據(jù)輸出C-接數(shù)碼管數(shù)據(jù)C段;
3: 數(shù)據(jù)輸出D-接數(shù)碼管數(shù)據(jù)D段;
4: 數(shù)據(jù)輸出E-接數(shù)碼管數(shù)據(jù)E段;
5: 數(shù)據(jù)輸出F-接數(shù)碼管數(shù)據(jù)F段;
6: 數(shù)據(jù)輸出G-接數(shù)碼管數(shù)據(jù)G段;
7: 數(shù)據(jù)輸出H-接數(shù)碼管數(shù)據(jù)H段;
16: 電源正腳-接電源正;
8: 電源負(fù)腳=接電源負(fù);
14: 數(shù)據(jù)輸入腳-接單片機(jī)管腳;
12: 數(shù)據(jù)鎖存時(shí)鐘-接單片機(jī)管腳;
11: 數(shù)據(jù)輸入時(shí)鐘-接單片機(jī)管腳;
13: 使能輸出腳-低電平有效,接低電平;
10 :數(shù)據(jù)清零-不清零,接高電平;
9:數(shù)據(jù)級(jí)聯(lián)輸出-接下一片595的數(shù)據(jù)輸入腳
74hc595時(shí)序圖
通過(guò)時(shí)序可以看出:
SCK是上升沿的時(shí)候要把數(shù)據(jù)寫(xiě)入;
RCK是上升沿的時(shí)候數(shù)據(jù)才能鎖存顯示;
有數(shù)據(jù)操作的過(guò)程中RESET必須是高電平;
EN必須是低電平,595才能工作;
知道了以上4點(diǎn)就可以寫(xiě)程序了。其中3、4條是硬件連接上的事情(也可以用單片機(jī)的IO口來(lái)連接,這樣的話可以隨時(shí)控制74HC595的工作與否情況)。寫(xiě)程序主要靠1、2條。下面具體操作。
74hc595驅(qū)動(dòng)4位數(shù)碼管電路連接圖
![74hc595驅(qū)動(dòng)4位數(shù)碼管電路連接圖及程序解析](/uploads/allimg/171117/2755779-1G11F95041O5.jpg)
74hc595驅(qū)動(dòng)4位數(shù)碼管程序解析
//MCU:AT89S52
//晶振:11.0592M.
//采用4位共陽(yáng)極數(shù)碼管
#include 《regx51.h》
//#include 《INTRINS.H》
#define uint unsigned int
#define uchar unsigned char
#define nop() _nop_();_nop_();
sbit CLK=P2^0;
sbit DAT=P2^1;
sbit RCLK=P2^2;
sbit CS1=P2^3;
sbit CS2=P2^4;
sbit CS3=P2^5;
sbit CS4=P2^6;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0};//0-9,-,全滅,全亮——共陽(yáng)極數(shù)碼管
void write595(unsigned char word)
{
uchar num,c;
num=tab[word];
for(c=0;c《8;c++)
{
CLK=0;
DAT=num&0x80;
num=num《《1;
CLK=1;
}
RCLK=0;
// nop();
// nop();
RCLK=1;
}
void select1(void)
{
CS1=0;
CS2=1;
CS3=1;
CS4=1;
}
void select2(void)
{
CS1=1;
CS2=0;
CS3=1;
CS4=1;
}
void select3(void)
{
CS1=1;
CS2=1;
CS3=0;
CS4=1;
}
void select4(void)
{
CS1=1;
CS2=1;
CS3=1;
CS4=0;
}
int main(void)
{
//unsigned char i;
while(1)
{
write595(12);
select1();
//for(i=0;i《10;i++) _nop_();
write595(2);
select2();
//for(i=0;i《10;i++) _nop_();
write595(3);
select3();
//for(i=0;i《10;i++) _nop_();
write595(4);
select4();
//for(i=0;i《10;i++) _nop_();
}
}
評(píng)論