74HC573包含八路3態(tài)輸出的非反轉(zhuǎn)透明鎖存器,是一種高性能硅柵CMOS器件。當(dāng)使能為低時(shí),輸出將鎖存在已建立的數(shù)據(jù)電平上。這種電路可以驅(qū)動(dòng)大電容或低阻抗負(fù)載,可以直接與系統(tǒng)總線接口并驅(qū)動(dòng)總線,而不需要外接口。特別適用于緩沖寄存器,I/O 通道,雙向總線驅(qū)動(dòng)器和工作寄存器。
? ? ? ?74HC573內(nèi)部結(jié)構(gòu)原理圖
?
74HC573的八個(gè)鎖存器都是透明的D型鎖存器,當(dāng)使能(G)為高時(shí),Q輸出將隨數(shù)據(jù)(D)輸入而變。當(dāng)使能為低時(shí),輸出將鎖存在已建立的數(shù)據(jù)電平上。輸出控制不影響鎖存器的內(nèi)部工作,即老數(shù)據(jù)可以保持,甚至當(dāng)輸出被關(guān)閉時(shí),新的數(shù)據(jù)也可以置入。這種電路可以驅(qū)動(dòng)大電容或低阻抗負(fù)載,可以直接與系統(tǒng)總線接口并驅(qū)動(dòng)總線,而不需要外接口。特別適用于緩沖寄存器,I/O通道,雙向總線驅(qū)動(dòng)器和工作寄存器。那74hc573是怎么驅(qū)動(dòng)8位數(shù)碼管的呢?下面給大家詳細(xì)介紹。
? ? ? 74HC573驅(qū)動(dòng)8位共陰數(shù)碼管連接圖
? ? ?74HC573驅(qū)動(dòng)8位共陽數(shù)碼管連接圖
? ?
74hc573驅(qū)動(dòng)8位數(shù)碼管程序分享
? ? ? ? ? ?基于51單片機(jī)74hc573驅(qū)動(dòng)8位數(shù)碼管的部分程序代碼如下:
/************************************************\
* 8位共陽數(shù)碼管顯示函數(shù)(使用74hc573鎖存器) *
* 力求程序高效,簡(jiǎn)潔 *
\************************************************/
/************************************************\
* 分多個(gè)函數(shù)的原因: *
* 顯示要求不同,函數(shù)的執(zhí)行效率不同 *
* 為了實(shí)現(xiàn)程序的高效性,顯示要求不同調(diào)用不同的函數(shù)*
\************************************************/
#include
#define DISPLAY_IO P2
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit duan=P3^0; //定義段
sbit wei=P3^1; //定義位
unsigned char code w[]={ //共陰
//0-F無小數(shù)點(diǎn)
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
//0-F帶小數(shù)點(diǎn)
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,
0xb9,0xde,0xf9,0xf1,
//小數(shù)點(diǎn) 負(fù)號(hào)
0x80, 0x40};
/************************************************\
* 顯示任意內(nèi)容 *
* n[0-7]數(shù)組的值表示數(shù)碼管位置從左至右的內(nèi)容 *
\************************************************/
void display_any(uchar n[8])
{
uchar i,delay=0;
for(i=0;i《8;i++)
{
//清除段鎖存器內(nèi)容
DISPLAY_IO=0xff;
duan=1;
duan=0;
//位值送入位鎖存器
DISPLAY_IO=0x01《
wei=1;
wei=0;
//段值送入段鎖存器
DISPLAY_IO=0xff-n[i];
duan=1;
duan=0;
//延時(shí)0-255(越長(zhǎng)越亮,但太長(zhǎng)會(huì)閃)
delay=100;
while(delay--);
}
//清除段鎖存器內(nèi)容 不讓第一個(gè)數(shù)最亮
DISPLAY_IO=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10進(jìn)制無符號(hào)整數(shù)顯示 *
* 傳入n為0到9999 9999 *
* 傳入浮點(diǎn)型小數(shù)點(diǎn)后忽略,范圍不正確顯示不正確 *
* 右對(duì)齊,左邊無多余0 *
\************************************************/
void display_ulong(ulong n)
{
uchar i=8,delay=0;
do
{
//清除段鎖存器內(nèi)容
DISPLAY_IO=0xff;
duan=1;
duan=0;
//位值送入位鎖存器
DISPLAY_IO=0x01《《(--i);
wei=1;
wei=0;
//段值送入段鎖存器
DISPLAY_IO=0xff-w[n%10];
duan=1;
duan=0;
n/=10;
//延時(shí)0-255(越長(zhǎng)越亮,但太長(zhǎng)會(huì)閃)
delay=100;
while(delay--);
}while(n》0);
//清除段鎖存器內(nèi)容 不讓第一個(gè)數(shù)最亮
DISPLAY_IO=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10進(jìn)制有符號(hào)整數(shù)顯示 *
* 傳入n為-999 9999到9999 9999 *
* 傳入浮點(diǎn)型小數(shù)點(diǎn)后忽略,范圍不正確顯示不正確 *
* 右對(duì)齊,左邊無多余0 *
\************************************************/
void display_long(long n)
{
uchar i=8,delay=0;
bit flag=0;
if(n《0)
{
flag=1;
n=-n;
}
do
{
//清除段鎖存器內(nèi)容
DISPLAY_IO=0xff;
duan=1;
duan=0;
//位值送入位鎖存器
DISPLAY_IO=0x01《《(--i);
wei=1;
wei=0;
//段值送入段鎖存器
DISPLAY_IO=0xff-w[(n==100000000?33:n%10)];
duan=1;
duan=0;
n/=10;
if(n==10000000)
n=-1;
if(n==0&&flag==1)
n=100000000;
//延時(shí)0-255(越長(zhǎng)越亮,但太長(zhǎng)會(huì)閃)
delay=100;
while(delay--);
}while(n》0);
//清除段鎖存器內(nèi)容 不讓第一個(gè)數(shù)最亮
DISPLAY_IO=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10進(jìn)制無符號(hào)實(shí)型顯示 *
* 傳入n為0到9999 9800 *
* 傳入范圍不正確顯示不正確 *
* 右對(duì)齊,左邊無多余0,右邊小數(shù)點(diǎn)后無多余0 *
\************************************************/
void display_udouble(double n)
{
uchar i=8,delay=0,point_position=0;
ulong n_long=n; //將n賦值給整形變量
while(n_long!=n) //此循環(huán)的功能:使n變?yōu)?位整數(shù),并記下小數(shù)點(diǎn)位置
{
n*=10;
n_long=n;
point_position++;//每乘一次,小數(shù)點(diǎn)左移一位
}
do
{
//清除段鎖存器內(nèi)容
DISPLAY_IO=0xff;
duan=1;
duan=0;
//位值送入位鎖存器
DISPLAY_IO=0x01《《(--i);
wei=1;
wei=0;
//段值送入段鎖存器
DISPLAY_IO=0xff-w[n_long%10+((7-i)==point_position?16:0)];
duan=1;
duan=0;
n_long/=10;
//延時(shí)0-255(越長(zhǎng)越亮,但太長(zhǎng)會(huì)閃)
delay=100;
while(delay--);
}while(n_long》0);
//清除段鎖存器內(nèi)容 不讓第一個(gè)數(shù)最亮
DISPLAY_IO=0xff;
duan=1;
duan=0;
}
/************************************************\
* 10進(jìn)制有符號(hào)實(shí)型顯示 *
* 傳入n為-999 999到9999 9800 *
* 傳入范圍不正確顯示不正確 *
* 右對(duì)齊,左邊無多余0,右邊小數(shù)點(diǎn)后無多余0 *
\************************************************/
void display_double(double n)
{
uchar i=8,delay=0,point_position=0;
bit flag=0;
long n_long=n; //將n賦值給整形變量
while(n_long!=n) //此循環(huán)的功能:使n變?yōu)?位整數(shù),并記下小數(shù)點(diǎn)位置
{
n*=10;
n_long=n;
point_position++;//每乘一次,小數(shù)點(diǎn)左移一位
}
if(n_long《0)
{
flag=1;
n_long=-n_long;
}
do
{
//清除段鎖存器內(nèi)容
DISPLAY_IO=0xff;
duan=1;
duan=0;
//位值送入位鎖存器
DISPLAY_IO=0x01《《(--i);
wei=1;
wei=0;
//段值送入段鎖存器
DISPLAY_IO=0xff-w[(n_long==100000000?33:(n_long%10+((7-i)==point_position?16:0)))];
duan=1;
duan=0;
n_long/=10;
if(n_long==10000000)
n_long=-1;
if(n_long==0&&flag==1)
n_long=100000000;
//延時(shí)0-255(越長(zhǎng)越亮,但太長(zhǎng)會(huì)閃)
delay=100;
while(delay--);
}while(n_long》0);
//清除段鎖存器內(nèi)容 不讓第一個(gè)數(shù)最亮
DISPLAY_IO=0xff;
duan=1;
duan=0;
}
/************************************************\
* 2-16任意進(jìn)制無符號(hào)不去零整數(shù)顯示 *
* 傳入n為0到X,X=((進(jìn)制)^8)-1 *
* 傳入范圍不正確顯示不正確 *
* 不自動(dòng)去0 *
\************************************************/
void display_number(ulong n,uchar jin_zhi)
{
uchar i,delay=0;
for(i=0;i《8;i++)
{
//清除段鎖存器內(nèi)容
DISPLAY_IO=0xff;
duan=1;
duan=0;
//位值送入位鎖存器
DISPLAY_IO=0x01《《(7-i);
wei=1;
wei=0;
//段值送入段鎖存器
DISPLAY_IO=0xff-w[n%jin_zhi];
duan=1;
duan=0;
n/=jin_zhi;
//延時(shí)0-255(越長(zhǎng)越亮,但太長(zhǎng)會(huì)閃)
delay=100;
while(delay--);
}
//清除段鎖存器內(nèi)容 不讓第一個(gè)數(shù)最亮
DISPLAY_IO=0xff;
duan=1;
duan=0;
}
/************************\
* 8位數(shù)碼管測(cè)試程序 *
\************************/
void main(void)
{
uint i,t=200;
char n[8]={1,2,4,8,16,32,64,128};
while(1)
{
i=t;
while(i--)
{
display_any(n);
}
i=t;
while(i--)
{
display_ulong(123);
}
i=t;
while(i--)
{
display_long(-123);
}
i=t;
while(i--)
{
display_udouble(123.45);
}
i=t;
while(i--)
{
display_double(-123.45);
}
i=t;
while(i--)
{
display_number(0x123abc,16);
}
}
?
}
評(píng)論
查看更多