單片機C51 - 16 x 16點陣使用指針顯示漢字

       近年來,點陣LED顯示屏利用發光二極管構成的點陣模塊或像素單元組成可變面積的顯示屏幕,以可靠性高、使用壽命長、環境適應能力強、性能價格比高、使用成本低等特點,已成爲衆多顯示媒體以及戶外作業顯示的電子工具,廣泛地應用於車站、賓館、金融、證券、郵電、體育等廣告發布或交通運輸等行業。本文中所介紹的16x16LED顯示屏是採用4塊最基本的8X8 LED點陣顯示模塊,理解8X8 LED點陣的工作原理就可以基本掌握LED點陣顯示技術。 

LED點陣顯示的基本原理  

      8X8點陣LED結構如下圖所示


       從圖中可以看出,8X8點陣是由一排排的LED燈組成的,它們的陰端連接到行,陽端連接到列,當想要點陣顯示什麼數字或者字母或者圖形的時候,只需要點亮相應的LED就可以了。比如說我們想點亮左上角第一個LED,而其它的都是滅的,我們只需要將行1位置置爲1,其它行位置置爲0,列1位置置爲0,其他位置置爲1則可以點亮左上角第一個LED,而其它的不亮。且每個發光二極管是放置在行線和列線的交叉點上,當對應的某一列置1電平,某一行置0電平,則相應的二極管就亮;要實現顯示圖形或字體,只需考慮其顯示方式。通過編程控制各顯示點對應LED陽極和陰極端的電平,就可以有效的控制各顯示點的亮滅。

       當在LED點陣上顯示中文時,可以用現成的漢字取模工具去生成,而不需要手動去計算(字模生成軟件:點擊打開鏈接)。在16x16點陣中,點陣顯示是通過4塊8x8LED顯示的,而最先輸入的8x8LED塊會被壓入最後(右下角塊),所以發送字節數據的時候是從最後一塊往第一塊發。16 x 16點陣使用指針顯示“點陣使用指針顯示漢字”10個漢字代碼如下:

#include <reg51.h>
#include <intrins.h>
#include "array.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;

/*******************************************************************************
* 函 數 名         : HC595SendData
* 函數功能		   : 通過595發送四個字節的數據
* 輸    入         : BT3:第四個595輸出數值
*                  * BT2: 第三個595輸出數值
*                  * BT1:第二個595輸出數值
*                  * BT0:第一個595輸出數值
* 輸    出         : 無
*******************************************************************************/
void HC595SendData(  uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{  
	uchar i;
	for(i = 0; i < 8; i++)
	{
		MOSIO = BT3 >> 7 ;	//從高位到低位
		BT3 <<= 1;
		S_CLK = 0;
		S_CLK = 1;		
	}

	for(i = 0; i < 8; i++)
	{
		MOSIO = BT2 >>7;
		BT2 <<= 1;
		S_CLK = 0;
		S_CLK = 1;	
	}

	for(i = 0; i < 8; i++)
	{
		MOSIO = BT1 >> 7;
		BT1 <<= 1;
		S_CLK = 0;
		S_CLK = 1;	
	}

	for(i = 0; i < 8; i++)
	{
		MOSIO = BT0 >> 7;
		BT0 <<= 1;
		S_CLK = 0;
		S_CLK = 1;
	}
   
	//--輸出--//
	R_CLK = 0;
	R_CLK = 1; //片選
	R_CLK = 0;
}

void main()
{
	int i, j, ms;
	uchar *p[] = {tab1, tab2, tab3, tab4, tab5, tab6, tab7, tab8, tab9, tab10};	//--定義一個指針數據指向漢字--//
	while(1)
	{
		for(i = 0; i < 10; i++)	   //總共10個漢字
		{
			for(ms = 50; ms > 0; ms--)
			{
				for(j = 0; j < 16; j++)	  //顯示一個字
				{
					//--因爲字模軟件取的數組是高電平有效,所以列要取反--//
					HC595SendData(~(*(p[i]+2*j+1)),~(*(p[i]+2*j)),tab0[2*j],tab0[2*j+1]);
				}

				HC595SendData(0xff,0xff,0x00,0x00);	//清屏
			}	
		}
	}
}
array.h
//--字模生成器生成出對應的C代碼--//
unsigned char code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
                             0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00}; 

unsigned char code tab1[] = {128,0,128,0,128,0,128,127,128,0,128,0,248,31,8,16,8,16,8,16,248,31,0,0,72,34,136,68,132,68,2,64};	//點

unsigned char code tab2[] = {0,2,62,2,34,2,210,127,18,1,10,5,146,4,146,63,34,4,34,4,34,4,214,127,10,4,2,4,2,4,2,4};	//陣

unsigned char code tab3[] = {8,2,8,2,248,127,4,2,4,2,230,63,38,34,37,34,228,63,4,2,68,2,132,2,4,1,132,2,68,12,52,112};	//使

unsigned char code tab4[] = {0,0,252,31,132,16,132,16,132,16,252,31,132,16,132,16,132,16,252,31,132,16,132,16,132,16,130,16,130,20,1,8};	//用

unsigned char code tab5[] = {136,0,136,32,136,28,136,3,191,64,136,64,8,127,40,0,152,63,140,32,139,32,136,63,136,32,136,32,138,63,132,32};	//指

unsigned char code tab6[] = {8,4,8,4,120,4,4,4,4,4,62,4,201,127,8,4,127,4,8,4,8,4,72,4,40,4,24,4,8,4,0,4};	//針

unsigned char code tab7[] = {0,0,248,15,8,8,8,8,248,15,8,8,8,8,248,15,32,2,34,34,36,34,40,18,40,10,32,2,255,127,0,0};	//顯

unsigned char code tab8[] = {0,0,252,31,0,0,0,0,0,0,0,0,255,127,128,0,128,0,136,8,136,16,132,32,130,64,129,64,160,0,64,0};	//示

unsigned char code tab9[] = {0,0,228,31,72,16,72,16,65,16,130,8,146,8,144,8,8,5,8,5,7,2,4,2,4,5,132,8,68,16,48,96};	//漢

unsigned char code tab10[] = {64,0,128,0,254,127,2,64,1,32,248,7,0,2,0,1,128,0,255,127,128,0,128,0,128,0,128,0,160,0,64,0};	//字




發佈了73 篇原創文章 · 獲贊 276 · 訪問量 84萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章