一、 電路原理圖。
(1)輸入輸出口
JP1 為輸入口,JP2為輸出口(為串聯下一塊點陣),245為電平轉換。
(2)行控制端電路
有2塊3-8譯碼器組成4-16譯碼器。將A,B,C,D,接入一個8位I/O口,直接對I/O口賦值。
(3)行寫入端電路
二、74HC595介紹。
74HC595 是一款漏極開路輸出的CMOS 移位寄存器,輸出端口為可控的三態輸出
端,亦能串行輸出控制下一級級聯芯片。
10 腳 SCLR 移位寄存器清零端 直接接地,
11 腳 SCK 數據輸入時鐘線
12 腳 RCK 輸出存儲器鎖存時鐘線
13 腳 OE 輸出使能 低電平為輸出有效
14 腳 SI 數據線 串行輸入數據,亦能串行輸出數據到下一級級聯芯片
輸入數據程序:
1. 向595寫一個字節的數據
void write_595(uchar DATA) //向595寫一個字節的數據
{
uchar i;
for(i=0;i<8;i++)
{
SI=(~DATA)&0x01;
SCK=1;
SCK=0;
DATA=DATA>>1;
}
}
2.向多個595寫一個字節的數據
9 腳SQH 位串行數據輸出管腳 將多個595的數據由9腳傳至下一個595,全部寫入后在打開輸出存儲器鎖存時鐘線
for(i=0;i<16;i++) //字從下往上滾動出現
{
k=1;
for(j=i+1;j>0;j--) //向多個595寫一個字節的數據
{
write_595(display[7][k]);
write_595(display[7][k-1]);
write_595(display[6][k]);
write_595(display[6][k-1]);
write_595(display[5][k]);
write_595(display[5][k-1]);
write_595(display[4][k]);
write_595(display[4][k-1]);
k+=2;
hang=16-j; //為138輸入行控制數據
RCK=1;RCK=0;
}
delay_ms(20);
}
3.595-RCK信號與138的輸出使能E2信號為同一信號,故可以相連。
三、74hc138介紹。
3 線-8 線譯碼器
當一個選通端(G1)為高電平,另兩個選通端(/(G2A)和/(G2B))為低電平時,將地址端(A、B、C)的二進制編碼在一個對應的輸出端以低電平譯出。
利用 G1、/(G2A)和/(G2B)可級聯擴展成24 線譯碼器;若外接一個反相器還可級聯擴展成32 線譯碼器。
引出端符號:
A、B、C 譯碼地址輸入端
G1 選通端
/(G2A)、/(G2B) 選通端(低電平有效)
Y0~Y7 譯碼輸出端(低電平有效)
功能表:
邏輯圖:
四、74hc245介紹。
管腳及電路接法。
五、ULN 2003介紹。
ULN2003是一個單片高電壓、高電流的達林頓晶體管陣列集成電路。它是由7對NPN達林頓管組成的,它的高電壓輸出特性和陰極箝位二極管可以轉換感應負載。單個達林頓對的集電極電流是500mA。達林頓管并聯可以承受更大的電流。此電路主要應用于繼電器驅動器,字錘驅動器,燈驅動器,顯示驅動器(LED氣體放電),線路驅動器和邏輯緩沖器。
74hc595通過ULN2003驅動8*8LED點陣屏。
五、8*8點陣屏介紹
8*8點陣屏管腳如上,L1-L8由達林頓管TIP127驅動,H1-H8有ULN2003驅動
(1)TIP127簡介
外延基PNP達林頓功率晶體管,采用TO-220塑料封裝
VCBO 集電極-基極電壓(IE = 0) 60 80 100 V
VCEO 集電極-發射極電壓(IB = 0) 60 80 100 V
VEBO 發射極-基極電壓(IC = 0) 5 V
IC 集電極電流 5 A
ICM 集電極峰值電流 8 A
IB 基極電流 0.1 A
Ptot 耗散功率 Tcase≤25℃ 65 W
(2)ULN 2003介紹。
ULN2003是一個單片高電壓、高電流的達林頓晶體管陣列集成電路。它是由7對NPN達林頓管組成的,它的高電壓輸出特性和陰極箝位二極管可以轉換感應負載。單個達林頓對的集電極電流是500mA。達林頓管并聯可以承受更大的電流。此電路主要應用于繼電器驅動器,字錘驅動器,燈驅動器,顯示驅動器(LED氣體放電),線路驅動器和邏輯緩沖器。
74hc595通過ULN2003驅動8*8LED點陣屏。
附錄:原理圖
源程序:
//16x64點陣程序及滾動效果視頻
#include
#define uchar unsigned char
#define uint unsigned int
#define hang P1 //行掃描接在P1口
sbit SI=P2^3;
sbit SCK=P2^0;
sbit OE=P2^2;
sbit RCK=P2^1;
uint counter;
uchar flag;
void delay_ms(uchar z) //延時0.5秒
{
uchar i,j;
for(i=z;i>0;i--)
for(j=120;j>0;j--);
}
uchar code display[][32]={
/*-- 文字: 好 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE,0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40,
/*-- 文字: 好 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x00,0x11,0xFC,0x10,0x08,0x10,0x10,0xFC,0x20,0x24,0x20,0x24,0x20,0x27,0xFE,0x44,0x20,0x64,0x20,0x18,0x20,0x08,0x20,0x14,0x20,0x26,0x20,0x44,0xA0,0x80,0x40,
/*-- 文字: 學 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x01,0x08,0x10,0x8C,0x0C,0xC8,0x08,0x90,0x7F,0xFE,0x40,0x04,0x8F,0xE8,0x00,0x40,0x00,0x80,0x7F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x02,0x80,0x01,0x00,
/*-- 文字: 習 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x3F,0xFC,0x00,0x04,0x08,0x04,0x04,0x04,0x03,0x04,0x01,0x14,0x00,0x64,0x01,0x84,0x06,0x04,0x38,0x04,0x10,0x04,0x00,0x04,0x00,0x24,0x00,0x14,0x00,0x00,
/*-- 文字: 天 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x08,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x0E,0xC0,0x04,
/*-- 文字: 天 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x08,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x08,0x20,0x10,0x10,0x20,0x0E,0xC0,0x04,
/*-- 文字: 向 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x02,0x00,0x04,0x00,0x08,0x04,0x7F,0xFE,0x40,0x04,0x40,0x24,0x4F,0xF4,0x48,0x24,0x48,0x24,0x48,0x24,0x48,0x24,0x4F,0xE4,0x48,0x24,0x40,0x04,0x40,0x14,0x40,0x08,
/*-- 文字: 上 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x10,0x01,0xF8,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x04,0xFF,0xFE,0x00,0x00};
void write_595(uchar DATA) //向595寫一個字節的數據
{
uchar i;
for(i=0;i<8;i++)
{
SI=(~DATA)&0x01;
SCK=1;
SCK=0;
DATA=DATA>>1;
}
}
void main() //主函數
{
uchar i,j,k;
OE=0; //154使能
EA=1; //開總中斷
TMOD=0x01; //定時器0工作方式0
ET0=1; //定時器0使能
TH0=(65535-50000)/256; //定時器0設置初值
TL0=(65536-50000)%256;
while(1)
{
for(i=0;i<16;i++) //字從下往上滾動出現
{
k=1;
for(j=i+1;j>0;j--) //向多個595寫一個字節的數據
{
write_595(display[7][k]);
write_595(display[7][k-1]);
write_595(display[6][k]);
write_595(display[6][k-1]);
write_595(display[5][k]);
write_595(display[5][k-1]);
write_595(display[4][k]);
write_595(display[4][k-1]);
k+=2;
hang=16-j;
RCK=1;RCK=0;
}
delay_ms(20);
}
TR0=1;flag=1;
while(flag) //停留一秒
{
uchar j;
for(j=0;j<16;j++)
{
write_595(display[7][j*2+1]);
write_595(display[7][j*2]);
write_595(display[6][j*2+1]);
write_595(display[6][j*2]);
write_595(display[5][j*2+1]);
write_595(display[5][j*2]);
write_595(display[4][j*2+1]);
write_595(display[4][j*2]);
hang=j;
RCK=1;RCK=0;
}
}
TR0=0;
for(i=16;i>0;i--) //字滾動出顯示區
{
k=31;
for(j=i-1;j>0;j--)
{
write_595(display[7][k]);
write_595(display[7][k-1]);
write_595(display[6][k]);
write_595(display[6][k-1]);
write_595(display[5][k]);
write_595(display[5][k-1]);
write_595(display[4][k]);
write_595(display[4][k-1]);
k-=2;
hang=j;
RCK=1;RCK=0;
}
delay_ms(20);
}
for(i=0;i<16;i++) //下四個字滾動出現在顯示區
{
k=1;
for(j=i+1;j>0;j--)
{
write_595(display[3][k]);
write_595(display[3][k-1]);
write_595(display[2][k]);
write_595(display[2][k-1]);
write_595(display[1][k]);
write_595(display[1][k-1]);
write_595(display[0][k]);
write_595(display[0][k-1]);
k+=2;
hang=16-j;
RCK=1;RCK=0;
}
delay_ms(20);
}
TR0=1;flag=1;
while(flag) //停留一秒
{
uchar j;
for(j=0;j<16;j++)
{
write_595(display[3][j*2+1]);
write_595(display[3][j*2]);
write_595(display[2][j*2+1]);
write_595(display[2][j*2]);
write_595(display[1][j*2+1]);
write_595(display[1][j*2]);
write_595(display[0][j*2+1]);
write_595(display[0][j*2]);
hang=j;
RCK=1;RCK=0;
}
}
TR0=0;
for(i=16;i>0;i--) //滾出顯示區
{
k=31;
for(j=i-1;j>0;j--)
{
write_595(display[3][k]);
write_595(display[3][k-1]);
write_595(display[2][k]);
write_595(display[2][k-1]);
write_595(display[1][k]);
write_595(display[1][k-1]);
write_595(display[0][k]);
write_595(display[0][k-1]);
k-=2;
hang=j;
RCK=1;RCK=0;
}
delay_ms(20);
}
}
}
void timer0() interrupt 1 //中斷函數
{
counter++;
if(counter==20) //1秒設置
{
counter=0;
flag=0;
}
TH0=(65535-50000)/256;
TL0=(65536-50000)%256;
}
-
譯碼器
+關注
關注
4文章
310瀏覽量
50156 -
74HC595
+關注
關注
7文章
189瀏覽量
30686 -
74HC138
+關注
關注
5文章
49瀏覽量
20781
原文標題:基于74hc595和74hc138的16x40點陣顯示
文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論