點陣字體:玩轉16×16LED點陣屏-字體教程免费ppt模版下载-道格办公

玩轉16×16LED點陣屏

屏幕的驅動文章更是少之又少。這裡我將提供一些關於如何驅動16x16 LED點陣屏幕的入門知識和文章鏈接。驅動16x16 LED點陣屏幕通常需要使用到單片機或者其他微控制器。以下是一些常見的步驟和技術:1. 硬件接口:首先,需要了解點陣屏幕的硬件接口和引腳定義。常見的接口包括行選通(ROW)和列選通(COL)。你可以查找點陣屏幕的數據手冊來獲取詳細的接口信息。 2. 刷新頻率:點陣屏幕是通過快速切換每個LED的開關狀態來顯示圖像的。為了達到連續的顯示效果,刷新頻率至少應達到50Hz以上。 3. 顯示驅動:為

在單片機發燒友圈子中,有關用單片機驅動LED、數碼管、LCD等的入門文章隨處可見,有關驅動LED點陣屏的文章則不多,至於真正能夠顯示一個國標漢字的16×16點陣屏的則更少。本文向大家介紹一款用ATmega48單片機控制16×16點陣屏顯示漢字,並可做出多種動畫特效的實驗小系統,讓你盡顯編程技巧,盡情玩轉16×16點陣屏這一漢字顯示最小單位。

原理說明

1.計算機顯示漢字的基本原理

計算機顯示屏上的漢字實際上是由一組有序排列的像素構成的。如果有筆劃的像素不亮,而其周圍的像素都是亮的,就能看到一個黑色筆劃的漢字。能夠清楚地顯示一個漢字的最小像素數是16×16=256,這是DOS時代就定下的規矩。現在的Windows有了矢量字體,大大豐富了漢字的顯示,能在屏幕上不失真地顯示漢字書法的美。

現在回到16×16LED點陣屏,我們的任務是在這塊方寸之地顯示一個漢字,而且要能上下、左右地滾動,首先要解決的問題就是如何存放這256個漢字筆劃像素的信息。

圖11.1

圖11.2 系統原理圖

當初DOS絕不是隨便定下16×16,即16行與16列的標準的。在計算機世界裡,8位(bit)組成一個字節(byte),而雙字節則構成一個字。於是辦法有了,用兩個字節共16位來代表一行的信息,16行共32個字節,用某位是0還是1來控制點亮還是熄滅對應位置的像素,就能在16× 16LED屏上顯示漢字,存放漢字筆劃信息的問題解決了。

下一個要解決的問題是如何得到一個漢字的點陣信息。圖11.1所示是中國象棋中的帥字,我們將一個漢字的顯示區域劃分成4個8×8的子區,即A區、B區、C區、D區。顯而易見,可以用一個字節來代表一個子區中一行的信息,32個字節就能表示4個子區。獲取點陣信息的方法也就隨之產生了,我們只要按照某種順序,依次將這些信息存入一個容量為32的數組就可以了。存取的順序可以有多種,比如A、B、C、D或A、C、B、D等,存取順序的不同,沒有大的區別,只是影響將來的編程思路。以圖11.1為例,我們按橫向每行(區的順序是A、B、C、D)的順序取得的數據如下(C 語言的表示方式):

0x0F,0xF0,0x30,0x0C,0x44,0x22,0x44,0x22,

A B A B A B A B

0x95,0xFD,0x95,0x25,0x95,0x25,0x95,0x25,

A B A B A B A B

0x95,0x25,0x95,0x25,0x85,0x25,0x89,0x2D,

C D C D C D C D

0x50,0x22,0x40,0x22,0x30,0x0C,0x0F,0xF0

C D C D C D C D

圖11.3 4個8×8LED模塊與單片機端口的尋址關係

2.系統原理

從圖11.2的原理圖中可以看出,單片機ATmega48的3個端口幾乎全部用上。端口D和端口B分別控制縱向左(A區和C區)、右(B區和D區)兩組8×8點陣模塊的列尋址。端口C則通過一個74HC154譯碼器將4位地址值轉換成15個行控制信號。在硬件設計上,這15個控制信號也被分成兩組,分別控制橫向的上(A區和B區)、下(C區和D區)兩組8×8點陣模塊的行尋址。

4個8×8LED模塊與單片機端口的尋址關係如圖11.3所示。搞清這些關係將是軟件設計的基礎。

硬件介紹

1.單片機主控板

圖11.4所示的是AVR單片機最小系統,因為引腳定義完全一致,所以可換插ATmega48/88/168/328系列單片機和ATmega8單片機。這塊板子的電路圖見圖11.5。

圖11.4 AVR單片機最小系統

圖11.5 AVR單片機最小系統電路圖

該板子的一個設計特點是“資源全開放”,因為ATmega48系列單片機具有引腳功能複用的特點,即所有的B端口、D端口和C端口的6個引腳通過插針全部對外開放,使用者負責定義每個引腳的工作模式和狀態。例如,在你的程序中使用了串口功能,D端口的PD0 和PD1兩個引腳就不能用作I/O。同理,如果系統使用了外部晶體振盪器,則PB7和PB6也不能用作他用。從圖4可以看出,端口B和D都將8個引腳通過排針引了出來。而端口C的設計有些獨特,不但將引腳引出,還增加了一排VCC插針和一排GND插針,這主要是為了方便接插伺服電機和眾多傳感器而設計的。大家知道,伺服電機3根引線的排列順序是信號、VCC、GND,很多傳感器也是如此排列3根引腳,而且端口C的引腳從0至5又具有ADC的第二功能。如此一來,需要接插伺服電機和傳感器時就方便多了。板子上還提供專門的位置將串口引出。而外部晶體振盪器則通過開關控制其是否接入系統。當然,改變系統振盪源時不要忘記相關標誌位的設置。 ISP下載部分則是標準的10針插座,可接插多種下載器。

2. 16×16點陣屏模塊

這塊板子上的主要元件就是4個8×8LED模塊和一隻74HC154地址譯碼器,如圖11.6所示。本文不准備詳述點陣模塊這種發光元件的基本原理,愛好者們可以找到很多相關文章,並參照本文前面的說明自行設計搭建。需要強調的是,要搞清模塊的引腳排列,不同廠家的產品並不完全相同。另外要搞清模塊是共陰的還是共陽的,這主要決定著地址譯碼器的選擇。

圖11.6 16×16點陣屏模塊

本文中用到的這塊板子使用的是共陽模塊,就是當某列的引腳為高電位,而某行的引腳為低電位時,處於該行與該列交叉點的LED被點亮。 74HC154譯碼器的輸出為低電平有效,因此,當單片機端口B和D的某個引腳輸出高電位即1時,此時74HC154譯碼器的某個引腳有效(輸出低電平) ,則處於交叉點的LED被點亮。

3.系統搭建

圖11.7 系統搭建方法

系統搭建非常簡單,如圖11.7所示。使用兩根8線排纜將單片機主控板的D端口和B端口分別與16×16點陣屏的對應端口插接,用一組4線杜邦頭的跳線將單片機主控板C端口的0~3 與16×16點陣屏的4位地址線接插,另用一根電源引線通過單片機主控板C端口任意一組VCC、GND插針引出接入16×16點陣屏,即可完成系統搭建。

程序

所謂程序就是數據+算法。首先設計一個有效的數據結構,再根據硬件電路的尋址方式,有序地將數據送達正確的點位(算法),我們要求的圖案就顯示出來了。

筆者選取了幾個例子與愛好者朋友分享,作為拋磚引玉,相信朋友們會設計出更豐富多彩的程序。

一個漢字垂直向上移動例程序

#include

#include

#include

#pragma data:eeprom

//中國象棋中的帥字點陣,存儲在EEPROM中

char table[]={

0x0F,0xF0,0x30,0x0C,0x44,0x22,0x44,0x22, 0x95,0xFD,0x95,0x25,0x95,0x25,0x95,0x25, 0x95,0x25,0x95,0x25,0x85,0x25,0x89,0x2D, 0x50, 0x22,0x40,0x22,0x30,0x0C,0x0F,0xF0};

#pragma data:data

//一個粗略的延時子程

void delay_1ms(void)

unsigned int i;

for (i=1;i < 1000;i++) ;

//端口初始化函數

void port_init(void)

PORTB=0x00;

DDRB=0xFF;

PORTC=0x00;

DDRC=0x0F;

PORTD=0x00;

DDRD=0xFF;

void main(void)

char i,K,L;

char B_port[32];

port_init();//數據準備

for (i=0;i <32;i++)

{//從EEPROM 讀出數據,初始化數組B_port。

EEPROM_READ(i, B_port[i]);

K=0;//初始化計數變量K

while(1)//無限循環

for(L=0;L<10;L++)//滾屏速度控制

for(i=0;i<16;i++)//點陣屏刷新

PORTD=B_port[i*2];//送端口D

PORTB=B_port[i*2+1];//送端口B

PORTC=i;//行尋址

delay_1ms();

//將數組中的數據都順序向前移動一排

for (i=0;i < 29;i+=2)

B_port[i]=B_port[i+2];

B_port[i+1]=B_port[i+3];

//從EEPROM中取出兩個字節,填充到數組最後兩個單元中

EEPROM_READ(K, B_port[30]);

K++;

EEPROM_READ(K, B_port[31]);

K++;

if (K >=32)//行更新計數

K=0;

1.數據準備

從本文前述關於16×16點陣漢字信息的提取,結合實例中的硬件尋址方式,大家不難想像,只要將這32個字節順序存入一個數組,然後每兩個字節為一組送往D端口和B端口形成列地址,再通過C端口給出行地址,對應行的LED將被選中,位於D、B端口字節中高電位的LED被點亮,其他的不亮,該行的點陣就形成了。如此動作16次,將32個字節依次送出,一幀(16×16點陣)的圖案就顯示出來了。我們只要以小於1ms的時間間隔循環做這組動作,一個漢字(或圖案)就能穩定地顯示在點陣屏上。

2.文字上下滾動

讓漢字在16×16點陣屏上、下滾動(垂直移動)是最為簡單的動作。

向右水平移動漢字例程序

#include

#include

//中國象棋中的帥字點陣,以數組形式存儲在RAM中

char table[]={

0x0F,0xF0,0x30,0x0C,0x44,0x22,0x44,0x 22,

0x95,0xFD,0x95,0x25,0x95,0x25,0x95,0x 25,

0x95,0x25,0x95,0x25,0x85,0x25,0x89,0x 2D,

0x50,0x22,0x40,0x22,0x30,0x0C,0x0F,0x F0};

//工作數組

char A_array[16][4];

//一個粗略的延時子程

void delay_1ms(void)

unsigned int i;

for (i=1;i < 1000;i++) ;

//端口初始化函數

void port_init(void)

PORTB=0x00;

DDRB=0xFF;

PORTC=0x00;

DDRC=0x0F;

PORTD=0x00;

DDRD=0xFF;

//數據準備函數

void A_arr_prepare(void)

char i,j;

for (i=0;i < 16;i++)

j=i*2;

A_array[i][3]=table[j];

A_array[i][2]=table[j+1];

A_array[i][1]=0;

A_array[i][0]=0;

void main(void)

char i,L;

char m0,m1,m2,m3;

//用於存儲移出位的變量

port_init();

//數據準備

A_arr_prepare();

while(1)

for(L=0;L < 10;L++)//滾屏速度控制

for(i=0;i<16;i++)//點陣屏刷新

PORTD=A_array[i][1];

PORTB=A_array[i][0];

PORTC=i;

delay_1ms();

//整屏數據右移一列

for (i=0;i < 16;i++)

if (A_array[i][0] & 0x01==1)

//保留移出位

m0=0x80;//如果是1,保留在高位。

else

m0=0;

if (A_array[i][1] & 0x01==1)

m1=0x80;

else

m1=0;

if (A_array[i][2] & 0x01==1)

m2=0x80;

else

m2=0;

if (A_array[i][3] & 0x01==1)

m3=0x80;

else

m3=0;

A_array[i][3]=A_array[i][3]>>1;//字節右移一位

A_array[i][3]=A_array[i][3] | m0;//將前一字節的高位移入

A_array[i][2]=A_array[i][2]>>1;

A_array[i][2]=A_array[i][2] | m3;

A_array[i][1]=A_array[i][1]>>1;

A_array[i][1]=A_array[i][1] | m2;

A_array[i][0]=A_array[i][0]>>1;

A_array[i][0]=A_array[i][0] | m1;

向上滾動時的流程圖如圖11.8所示,其實現程序在ICC 7平台調試通過。這個小例程使用EEPROM存儲漢字點陣信息,主要是作為練習,愛好者也可以使用RAM中的數組省去EEPROM的讀動作。

3. 文字左右移動

左右移動(水平橫向移動)稍微複雜一些,因為要進行數據位的循環移動。在下面的例子中,我們使用一個二維數組A_array[16][4],目的是在漢字水平移動時有一個字的空格,當然你也可以試著只留半個空格或不留空格。此例程沒有使用EEPROM,而是在RAM中建立一個存放點陣數據的數組table[ ]。在數據準備階段,將數組table[ ]中的數據導入數組A_array[16][4]的後兩列,即A_array[16][3]和A_array[16][2]。顯示完一幀後,再對這16組4個字節向右移位,實現整幀的右移。數組A_array[16][4]的移動動作順序如圖11.9所示,該例程的流程圖如圖11.10所示。

圖11.8 文字向上滾動的流程圖

圖11.9 數組A_array[16][4]的移動動作順序

圖11.10 文字向右移動的流程圖

拓展練習

本文僅對16×16點陣屏做一淺顯介紹,相信單片機愛好者可以藉助這個小平台玩出許多花樣,例如對角移動、中心開花、中心會聚、對稱分開或合攏,以及多字連續移動等。文中例程序是用C語言寫的,也可以使用BASIC語言,裡面的一些函數可以改成彙編語言的,將會顯著提高效率。現在,很多愛好者玩起了Arduino,同樣可以驅動這個16×16點陣屏,只是由於Arduino端口開放得不全,所以要加鎖存器,並分步傳送數據,程序會稍微複雜些,但基本思路是相似的。

文章為用戶上傳,僅供非商業瀏覽。發布者:Lomu,轉轉請註明出處: https://www.daogebangong.com/zh-Hant/articles/detail/Play%20with%201616%20LED%20dot%20matrix%20screen.html

(810)
打賞 支付宝扫一扫 支付宝扫一扫
single-end

相關推薦