单片机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};	//字




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值