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




  • 14
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是基于C51单片机16*16LED点阵显示串口输入字符的代码: ```c #include <reg52.h> //C51单片机头文件 #define uchar unsigned char //定义uchar类型 #define uint unsigned int //定义uint类型 sbit DATA=P2^0; //数据线 sbit LATCH=P2^1; //锁存线 sbit CLK=P2^2; //时钟线 void delay(uint i) //延时函数 { while(i--); } void send_byte(uchar dat) //向点阵模块发送字节数据 { uchar i; for(i=0;i<8;i++) //逐位发送8位数据 { CLK=0; DATA=dat&0x80; //取最高位 CLK=1; dat<<=1; //左移一位 } } void send_command(uchar address,uchar dat) //向点阵模块发送指令 { LATCH=0; //锁存线拉低 send_byte(address); //先发送地址 send_byte(dat); //再发送数据 LATCH=1; //锁存线拉高,数据更新 } void init() //点阵模块初始化函数 { send_command(0x09,0x00); //译码方式:不译码 send_command(0x0a,0x01); //亮度设置:中等亮度 send_command(0x0b,0x07); //扫描界限:0~7 send_command(0x0c,0x01); //控制方式:打开普通扫描模式 send_command(0x0f,0x00); //显示测试:关闭 } void display(uchar *p) //显示函数 { uchar i,j,k; for(j=0;j<16;j++) //逐行扫描 { send_command(0x01,0x00); //先清空第j行 send_command(0x0c,j+1); //再选定第j行 for(i=0;i<2;i++) //逐列显示 { k=*p++; //取出下一个字节数据 send_byte(k); //发送到点阵模块 } } } void main() { uchar i; uchar buffer[32]; //缓存区 uchar len; TMOD=0x20; //定时器1工作在方式2 TH1=0xfd; //波特率设置为9600bps TL1=0xfd; SCON=0x50; //串口工作在模式1 PCON=0x00; //波特率不倍频 TR1=1; //启动定时器1 init(); //点阵模块初始化 while(1) { if(RI) //如果接收到一个字符 { RI=0; buffer[len++]=SBUF; //将其存入缓存区 if(len>=32) len=0; //缓存区溢出,从头开始 i=0; while(buffer[i]) //如果缓存区还有数据 { display(&buffer[i]); //显示缓存区中的数据 i+=2; //每次取两个字节数据 delay(500); //延时一段时间 } } } } ``` 在这个代码中,我们使用了一个缓存区来存储串口输入的字符,然后逐个取出并显示16*16LED点阵上。在显示函数中,我们使用点阵模块的地址和数据寄存器来向点阵模块发送指令和数据。同时,我们还使用了一个定时器来控制显示的刷新速度。 需要注意的是,这个代码使用的是基于P2口的硬件SPI方式来控制点阵模块的显示,如果你使用的是其他型号的点阵模块,可能需要修改其中的引脚定义和通讯协议。同时,由于16*16LED点阵显示数据量比较大,如果使用单片机内存较小,可能需要使用外部存储器来存储显示数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值