当前位置:首页 > 问答

【主控板上d表示什么意思】玩1616LED点阵屏幕

在单片机发烧友圈子里,用单片机驱动LED、数码管、LCD等的入门文章随处可见,驱动LED点阵屏幕的文章数量并不多。实际上,能显示汉字的1616点阵屏幕较少。本文介绍了用ATmega48单片机控制1616点阵屏幕显示汉字、产生多种动画效果的实验小型系统,展示了编程技巧,用1616点阵屏幕这个汉字展示了最小单位。

原理说明

1.电脑展示了汉字的基本原理

电脑显示屏上的汉字实际上是由一组排列有序的像素组成的。如果有笔画的像素不亮,周围的像素都亮,就能看到黑色笔画的汉字。能够清晰显示汉字的最小像素数为1616=256。这是DOS时代制定的规则。目前,Windows拥有矢量字体,大大丰富了汉字显示,可以在屏幕上毫无失真地显示汉字书法的美丽。

现在回到1616LED点阵屏幕,我们的任务是在这个地方显示汉字,并允许上下左右滚动。首先要解决的问题是如何保存这256个汉字笔画像素的信息。

图11.1

图11.2系统结构图

当初DOS不是随便制定1616,也就是16行和16列的标准。在计算机世界中,8位(bit)构成字节(byte),2字节构成一个单词。所以方法是用2字节的总16位表示一行信息,16行总32字节,可以控制哪些人是0还是1打开该位置的像素。通过在1616LED屏幕上显示汉字,保存汉字笔画信息的问题得到了解决。

下一个要解决的问题是如何获取汉字的点阵信息。图11.1显示了中国象棋的精彩文字,将汉字的显示区域分为四个88子区域:A区、B区、C区、D区。显然,子区域中一行的信息可以用1字节表示,32字节可以表示4个子区域。获得点阵信息的方法也应运而生。我们只需按照某种顺序依次将这些信息存储在容量为32的数组中。访问顺序可以不同,如A、B、C、D或A、C、B、D等。访问顺序没有太大差异,只会影响以后的编程想法。在图11.1中,按每行水平(地区顺序为A、B、C、D)顺序获得的数据如下(以C语言表示):

0x0f、0xf 0,0x30,0x0c、0x44,0x22,0x44,0x22、

A B A B A B A

0x95,0xfd、0x95,0x25,0x95,0x25,0x25,0x95,0x25、

A B A B A B A

0x95,0x25,0x95,0x25,0x85,0x25,0x89,0x2d,

C D C D C D C

0x50,0x22,0x40,0x22,0x30,0x0c、0x0f、0xf0

C D C D C D C

图11.3四个88LED模块与单芯片端口寻址的关系

2.系统原理

如图11.2中的原理图所示,单片机ATmega48上的三个端口几乎全部使用。端口D和端口B分别控制两组88光栅模块的列寻址:纵向左侧(A区和C区)和右侧(B区和D区)。端口C通过74HC154解码器将4位地址值转换为15行控制信号。在硬件设计中,这15个控制信号也分为两组,分别控制水平(A区和B区)、下面(C区和D区)两组88光栅模块的行寻址。

4个88LED模块与单片机端口的寻址关系如图11.3所示。澄清这些关系将是软件设计的基础。

硬件简介

1.单片机控制板

图11.4显示了AVR微控制器最小系统。因为针脚定义完全一致,所以可以更换ATmega48/88/168/328系列微控制器和ATmega8微控制器。这块板子的电路图见图11.5。

图11.4 AVR单片机最低系统

3.toutiaoimg.com/large/pgc-image/daba085747c740689aae5d5a52dbf071?from=article.detail&_iz=31825&index=4" width="640" height="342"/>

图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端口开放得不全,所以要加锁存器,并分步传送数据,程序会稍微复杂些,但基本思路是相似的。

1.《【主控板上d表示什么意思】玩1616LED点阵屏幕》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【主控板上d表示什么意思】玩1616LED点阵屏幕》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/why/2964825.html

上一篇

【显像管g2是什么】电子管——难忘的经典

下一篇

【奥迪a6老款行驶中熄火是什么原因】情景奥迪A6L (5个故障案例)

【主控板上d表示什么意思】快点PCBPCB电路板上那些字的意思。

【主控板上d表示什么意思】快点PCBPCB电路板上那些字的意思。

主控板上d表示什么意思相关介绍,Rx是电阻。电路图上有很多电阻。按序列号、R1、R2排列。 Cx是无极电容、电源输入端抗干扰电容器 IC集成电路模块 Ux是集成电路组件(IC) Tx是测试点(用于工厂测试) Spk1是specker...