一、8*8點陣結構
下面圖片是8*8點陣內部結構原理圖,一共有16根引腳,如果直接用8位單片機進行控制的話,需要占用單片機2個端口(如:P1,P2),實質上就是控制64個LED燈的亮滅,比如我想讓左上角第一個LED燈亮起,其它燈全滅,那么需要讓h1輸出高電平,L1輸出低電平就可以了。注意要將L2-L8保持在高電平,否則第一行的其它燈也會亮。
二、串并轉換(74HC595)
上面這種控制方式雖然簡單,但是占用單片機的IO口線過多,所以,我們經常會利用74HC595這樣的串并轉換芯片作為驅動芯片,一個595具有8個驅動輸出端(QA-QH),那么我們這里需要2個595就夠用了。通過第一片595的SQH管腳進行級聯,將數據送至第二片595的數據輸入端,這樣單片機只需要3根線就可以實現對2片595的輸出控制。
三、控制時序
對于編寫595的驅動程序來說,看時序圖是最直接了當的方式,手冊上會說的比較多,簡化來說,就是DATA_IN管腳用來輸入數據(實際上就是高低電平),然后SHIFT-CLK管腳提供時鐘,每當SHIFT-CLK的上升沿到來,595會讀入DATA_IN管腳的電平狀態,并存儲在內部的鎖存器中,當8個上升沿讀取結束后,第一片595的8個數據已經全部讀完,但是我們這里是級聯的接法,所以還要繼續讀8個上升沿,然后數據從SQH管腳傳給第二片595的DATA_IN管腳,到這時,16個上升沿的數據都讀進595內部并存儲起來了,注意此時還沒有放到QA-QH這16個輸出口線上,接下來需要LATCH-CLK給出一個下降沿,才將16個管腳的電平狀態進行實際輸出。
看下時許圖,就可以一目了然:
四、程序編寫(靜態顯示)
//先做宏定義,目的是給單片機的管腳起個別名,便于我們能夠見名知義。共用到3個IO口。
//初始化時用到的端口
#define cBRDDOT_Port_Shift GPIO_P4
#define cBRDDOT_Pin_Shift GPIO_Pin_2
#define cBRDDOT_Port_DIn GPIO_P4
#define cBRDDOT_Pin_DIn GPIO_Pin_1
#define cBRDDOT_Port_Latch GPIO_P4
#define cBRDDOT_Pin_Latch GPIO_Pin_3
//定義讓端口輸出高低電平
#define cBRDDOT_Bit_Shift P42
#define cBRDDOT_Bit_DIn P41
#define cBRDDOT_Bit_Latch P43
//接下來做管腳的初始化,全部初始化為輸出。
//設置Shift的管腳,處于輸出模式
GPIO_SetMode(cBRDDOT_Port_Shift, cBRDDOT_Pin_Shift, GPIO_Mode_OUT_PP);
//設置DIn的管腳,處于輸出模式
GPIO_SetMode(cBRDDOT_Port_DIn, cBRDDOT_Pin_DIn, GPIO_Mode_OUT_PP);
//設置Latch的管腳,處于輸出模式
GPIO_SetMode(cBRDDOT_Port_Latch, cBRDDOT_Pin_Latch, GPIO_Mode_OUT_PP);
//接下來目標是點亮左上角第一個LED,下面是實現時序的代碼
void DOT_ScanOut(void)
{
u8 V, i;
cBRDDOT_Bit_Latch = 1;//看時序圖,latch管腳一開始為高電平,這里輸出1
cBRDDOT_Bit_Shift = 0;//時鐘shift-clk一開始為低電平
{
V = 0xfe;//這里是進行點陣的行選擇,為什么是FE,11111110,最低位為0,目的是要選中第一行的8個LED,
for (i=0;i< 8;i++)
{
if (V & 0x80)//每次都將最高位取出來,1000000 & 8位二進制,只有最高位有效
cBRDDOT_Bit_DIn = 1;//如果最高位為高電平,則把DATA-IN輸出高電平,這時候我們就把數據放上去了。
else
cBRDDOT_Bit_DIn = 0;//否則輸出低電平
V < <= 1;//數據向左移一位,原來的次高位變為最高位,原來的最低為補0,直到8個位全部讀完。
cBRDDOT_Bit_Shift = 0;
cBRDDOT_Bit_Shift = 1;//將SHIFT-CLK管腳電平由0變為1,上升沿產生,這時595會讀入DATA-IN的電平狀態并保存
cBRDDOT_Bit_Shift = 1;
cBRDDOT_Bit_Shift = 0;//恢復低電平
}
}
//上面的代碼執行完,可以理解為我們已經選中了一行(第一行0XFE)
//接下來就是要把這一行要亮的燈點亮。
{
V = 0x80;//這里的邏輯是正的,1就代表亮,0代表滅。最左面的燈處于最高位位置。
for (i=0;i< 8;i++)
{
if (V & 0x80)
cBRDDOT_Bit_DIn = 1;
else
cBRDDOT_Bit_DIn = 0;
V < <= 1;
cBRDDOT_Bit_Shift = 0;
cBRDDOT_Bit_Shift = 1;
cBRDDOT_Bit_Shift = 1;
cBRDDOT_Bit_Shift = 0;
}
//8次循環結束,那么就將要這一行要顯示的數據(要點亮的LED燈)也存到595內部了。
}
cBRDDOT_Bit_Latch = 0;//將LATCH-CLK拉成低電平,這時下降沿產生,595會把存儲的數據真正給到輸出口上,對應的LED會亮起。
cBRDDOT_Bit_Shift = 0;
}
五 、程序編寫(動態掃描)****
//但是現在有個問題是,我們剛才的代碼只能同時控制一行的LED亮滅,如果想同時控制8行來顯示圖案的話,就要用動態掃描的方式,從第1行到第8行快速切換,然后放入數據,形成視覺暫留的效果,讓人眼誤以為是同時在顯示。
//也就是說,我們需要一個定時中斷,每次中斷過來我都要更新一行的數據。那么我們就要把上面的程序放到中斷服務函數里面。
//先進行初始化設置,這里用的是timer2
Timer2_Init_AsTimer(False,0, 252, 112);
Timer2_EnaInterrupt();
Timer2_StartWork();
//全局變量
u8 code cBRDDOT_Colomn_Sel[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//每一行的模值
u8 xdata vBRDDOT_Values[8]={0x24,0x7e,0xff,0xff,0x7e,0x3e,0x1b,0x00};//心形圖案
// 下面是中斷服務程序
void BRDDOT_ScanOut(void) interrupt IntNo_Timer2
{
u8 V, i;
//這2行代碼的目的是讓vBRDDOT_ColIndex在0-7之間不斷循環,
//比如當vBRDDOT_ColIndex為8時,二進制對應0000 10000,和0000 0111進行與運算,8變為0.
vBRDDOT_ColIndex++;
vBRDDOT_ColIndex &= 7;
cBRDDOT_Bit_Latch = 1;
cBRDDOT_Bit_Shift = 0;
//輸出Col
{
//行選擇,這里的V就不能是固定值了,因為要逐行顯示,每一次進來會更新一行。
//需要在第1到第8行不斷選擇,所以cBRDDOT_Colomn_Sel數組里面應該放好進行每一行選擇的IO模值
V = cBRDDOT_Colomn_Sel[vBRDDOT_ColIndex];
for (i=0;i< 8;i++)
{
if (V & 0x80)
cBRDDOT_Bit_DIn = 1;
else
cBRDDOT_Bit_DIn = 0;
V < <= 1;
cBRDDOT_Bit_Shift = 0;
cBRDDOT_Bit_Shift = 1;
cBRDDOT_Bit_Shift = 1;
cBRDDOT_Bit_Shift = 0;
}
}
{
//這里面vBRDDOT_Values要存儲8行LED的顯示內容,建議用取模軟件去生成。
//每次中斷進來都會換一行顯示,因為vBRDDOT_ColIndex一直在變。
V = vBRDDOT_Values[vBRDDOT_ColIndex];
for (i=0;i< 8;i++)
{
if (V & 0x80)
cBRDDOT_Bit_DIn = 1;
else
cBRDDOT_Bit_DIn = 0;
V < <= 1;
cBRDDOT_Bit_Shift = 0;
cBRDDOT_Bit_Shift = 1;
cBRDDOT_Bit_Shift = 1;
cBRDDOT_Bit_Shift = 0;
}
}
cBRDDOT_Bit_Latch = 0;
cBRDDOT_Bit_Shift = 0;
}
-
原理圖
+關注
關注
1322文章
6411瀏覽量
239116 -
單片機
+關注
關注
6063文章
44915瀏覽量
646879 -
led燈
+關注
關注
22文章
1595瀏覽量
109344 -
鎖存器
+關注
關注
8文章
922瀏覽量
42107 -
74HC595
+關注
關注
7文章
193瀏覽量
31463
發布評論請先 登錄
挽救一下小蝦們脆弱的心吧,74HC595驅動LED點陣方面
51單片機學習總結(三)8*8點陣屏,串口通信(內含模塊代碼) 精選資料推薦
74HC595驅動LED點陣或數碼管的正確用法 精選資料推薦
如何使用三片74HC595對一個8X8雙色點陣進行控制呢
一種用 74hc138 和 74hc595 驅動 8x8 點陣顯示技術

評論