本文是關于LED點陣的使用,使用74HC595模塊實現對LED點陣的控制。
文章目錄
- 一、8x8LED點陣的原理
- 1.1 LED點陣顯示原理
- 1.2 LED點陣內部結構圖
- 1.3 開發板上的LED點陣原理圖
- 1.4 74HC595芯片
- 二、使用74HC595模塊實現流水燈效果
- 三、 使用74HC595模塊控制LED點陣對角線亮
一、8x8LED點陣的原理
1.1 LED點陣顯示原理
LED點陣是由發光二極管排列組成的顯示器件,被廣泛應用于汽車報站器、廣告屏等。如下所示:
proteus中的8x8點陣如下:
通常應用較多的是8x8點陣,使用多個8x8點陣可組成不同分辨率的LED點陣顯示屏,比如16x16點陣可以使用4個8x8點陣構成。
1.2 LED點陣內部結構圖
8x8LED點陣內部結構圖如下,這兩種圖片只是接法不同,要點亮LED,左圖需要行置為高電平,列置為低電平;右圖則需要行置為低電平,列置為高電平。
8x8點陣共由64個發光二極管組成,且每個發光二極管是放置在行線和列線的交叉點上,當對應的某一行置高電平,某一列置低電平,則相應的二極管將點亮。
比如對于左圖,如果要將第一個點點亮,則將第一行的⑨腳接高電平,第一列的13腳接低電平,第一個點就會點亮;如果要將第一行點亮,則第一行的⑨腳接高電平,所有列(13、3、4、10、6、11、15、16腳)接低電平,第一行就會點亮;如果要將第一列點亮,則第一列的13腳接低電平,所有行(9、14、8、12、1、7、2、5腳)接高電平,第一列就會點亮;如果要將對角線點亮,可以動態顯示,首先點亮第一個點,然后點亮第2行第2列的點…這樣依次循環點亮,就可以顯示對角線的點。
如果要顯示數字或字符,在需要的位置點亮,比如顯示0(如下),可以循環點亮如下位置的LED。
1.3 開發板上的LED點陣原理圖
開發板上使用了74HC595芯片實現串轉并,接到LED點陣模塊,原理圖如下:
74HC595起到了擴展IO口的功能,從原理圖可以看到74HC595使用3個IO口輸入,有8個IO口輸出。這8個IO口控制LED點陣的行(從第一行到最后一行分別是D7-D0),使用P0口控制LED點陣的列(從第一列到最后一列分別是P07-P00)。
比如對于如上結構圖左圖所示,如果要點亮第一個LED,那么P0口應該置為0x7f,D7-D0應該置為0x80。
1.4 74HC595芯片
74HC595芯片具有8為串行輸入/輸出或者并行輸出移位寄存器,具有三態輸出(高電平、低電平、高阻態)。是總線驅動的并行輸出。通常用于串行輸入到并行輸出的數據轉換。
74HC595引腳說明如下:
符號 | 引腳 | 描述 |
---|---|---|
Q0…Q7(QA…QH) | 15,1-7 | 并行數據輸出 |
GND | 8 | 邏輯地 |
Q7’ | 9 | 串行數據輸出 |
/MR(/SRCLR) | 10 | 主復位(低電平有效),接到GND就處于復位狀態,要接到電源處于高電平狀態 |
SHCP(SRCLK) | 11 | 移位寄存器時鐘輸入 |
STCP(RCLK) | 12 | 存儲寄存器時鐘輸入 |
/OE | 13 | 輸出有效(低電平有效),在開發板上有一個端子,如果要使輸出有效,就短接到GND,如果要使輸出無效,就短接到VCC。也可以連接到一個IO口進行控制。進行LED點陣實驗時要短接到地,使輸出有效。 |
DS(SER) | 14 | 串行數據輸入,輸入的數據經過74HC595芯片轉換為并口輸出 |
VCC | 16 | 電源 |
74HC595功能如下,H=高電平,L=低電平,↑=上升沿,↓=下降沿,Z=高阻態,NC=無變化,X=無效
輸入 | 輸入 | 輸入 | 輸入 | 輸入 | 輸出 | 輸出 | 功能 |
---|---|---|---|---|---|---|---|
SHCP | STCP | OE | MR | DS | Q7’ | Qn | |
X | X | L | ↓ | X | L | NC | MR為低電平時僅影響移位寄存器 |
X | ↑ | L | L | X | L | L | 移位寄存器到輸出寄存器,STCP上升沿會將數據輸出 |
X | X | H | L | X | L | Z | 清空移位寄存器,并行輸出為高阻態 |
↑ | X | L | H | H | Q6’ | NC | 邏輯高電平移入移位寄存器狀態0,包含所有的移位寄存器狀態移入 |
X | ↑ | L | H | X | NC | Qn | 移位寄存器的內容到達存儲寄存器并從并口輸出 |
↑ | ↑ | L | H | X | Q6’ | Qn’ | 移位寄存器內容移入,先前的移位寄存器的內容到達存儲寄存器并輸出 |
從上表可以知道,當主復位MR為高電平,輸出使能OE為低電平時,數據在SHCP上升沿進入移位寄存器,在STCP上升沿輸出到并行端口。
74HC595的數據端:
Q0-Q7:八位并行輸出端,可以直接控制數碼管的8個段。
Q7’:級聯輸出端,可以接下一個595的SER端。
SER:串行數據輸入端。
74HC595控制端說明
- /SCLR(10腳):主復位腳,低電平時清空移位寄存器,通常接VCC。
- SCK(11腳):上升沿數據寄存器移位,下降沿移位寄存器數據保持不變。
- RCK(12腳):上升沿時移位寄存器的數據進入存儲寄存器,下降沿存儲寄存器數據不變。
- /OE(13腳):輸出使能,高電平時禁止輸出。
二、使用74HC595模塊實現流水燈效果
在proteus中硬件設計如下,實現的功能為使用74HC595芯片實現流水燈效果。
根據上面對74HC595的介紹,DS引腳是輸入的串行數據,SHCP上升沿會進行移位寄存器的移位操作,STCP上升沿時會將數據輸出到并行端口。
軟件代碼如下:
/*實現功能:74HC595芯片控制LED點陣實現LED流水燈的效果[2023-12-08] zoya
*/
#include "reg52.h"
#include "intrins.h"typedef unsigned char u8;
typedef unsigned int u16;sbit DS = P3^4; // 74HC595輸入數據端口
sbit STCP = P3^5; // 74HC595存儲寄存器端口,上升沿時移位寄存器進入存儲寄存器
sbit SHCP = P3^6; // 74hc595移位寄存器端口,上升沿時移入數據// 延時函數,i=1延時10us
void Delay(u16 i)
{while(i--);
}// 74HC595芯片將輸入的串行數據轉換為并行數據輸出
void HC595SendByte(u8 dat)
{u8 i;STCP = 1; // 高電平時存儲寄存器數據保持不變SHCP = 1; // 高電平時移位寄存器數據保持不變for(i=0;i<8;i++){DS = dat >> 7; // 每次輸入最高位數據dat <<= 1; // 移位后將dat數據左移一位,保證下一次移入的數據在最高位// 實現移位寄存器的時序,需要SHCP有一個上升沿,所以先將SHCP置0,然后置1SHCP = 0;_nop_(); // 空指令,不做任何操作,當做延時使用_nop_();SHCP = 1;}// 數據已經在移位寄存器了,現在將移位寄存器的數據輸出到存儲寄存器// STCP上升沿時將數據從移位寄存器輸出到存儲寄存器STCP = 0;_nop_();_nop_();STCP = 1;
}void main()
{u8 ledNum = ~0x01; // 首先點亮D0// HC595SendByte(0xff);while(1){HC595SendByte(ledNum);ledNum = _crol_(ledNum,1); // 左移,逐個點亮D0-D7Delay(50000);}
}
仿真結果:
三、 使用74HC595模塊控制LED點陣對角線亮
在proteus中設計如下LED點陣,實現使用74HC595控制LED點陣對角線燈亮的功能。
代碼實現如下:
/*實現功能:74HC595芯片控制LED點陣實現對角線點亮[2023-12-08] zoya
*/
#include "reg52.h"
#include "intrins.h"#define GPIO_LED P0 // LED點陣列控制IO口typedef unsigned char u8;
typedef unsigned int u16;sbit DS = P3^4; // 74HC595輸入數據端口
sbit STCP = P3^5; // 74HC595存儲寄存器端口,上升沿時移位寄存器進入存儲寄存器
sbit SHCP = P3^6; // 74hc595移位寄存器端口,上升沿時移入數據
u8 ledNum = 0x01;// 延時函數,i=1時延時10us
void Delay(u16 i)
{while(i--);
}// 74HC595芯片將輸入的串行數據轉換為并行數據輸出
void HC595SendByte(u8 dat)
{u8 i;STCP = 1; // 高電平時存儲寄存器數據保持不變SHCP = 1; // 高電平時移位寄存器數據保持不變for(i=0;i<8;i++){DS = dat >> 7; // 每次輸入最高位數據dat <<= 1; // 移位后將dat數據左移一位,保證下一次移入的數據在最高位// 實現移位寄存器的時序,需要SHCP有一個上升沿,所以先將SHCP置0,然后置1SHCP = 0;_nop_(); // 空指令,不做任何操作,當做延時使用_nop_();SHCP = 1;}// 數據已經在移位寄存器了,現在將移位寄存器的數據輸出到存儲寄存器// STCP上升沿時將數據從移位寄存器輸出到存儲寄存器STCP = 0;_nop_();_nop_();STCP = 1;
}void main()
{// 點亮LED點陣的第一個燈,P00=0,其它為1u8 dNum = ~0x01;GPIO_LED = ledNum;while(1){HC595SendByte(dNum);GPIO_LED = ledNum;Delay(200);dNum = _crol_(dNum,1);ledNum = _crol_(ledNum,1);}
}
仿真結果: