基于51单片机的16*32点阵显示屏设计与实现

文章目录

设计要求

一、开发软件

1、Keil

2、Proteus

3、PCtol2002 

4、Altium Designer

二、硬件部分

1、51单片机最小系统

2、LED点阵屏

3、74HC595

4、74HC154

三、软件部分

1、74HC595写入数据

2、点阵屏显示数据

 3、点阵屏正向移动

4、点阵屏反向移动

         5、字模建立

四、电路与仿真

总结


设计要求

设计并制作“16×32点阵显示屏”。构建点阵译码显示单元、电源单元和控制器单元;自主设计电源转换模块,点阵译码显示模块等。

(1)点阵译码显示模块为16行×32列,可显示汉字,并能滚动显示(左右滚动);
(2)显示内容“海南大学”。


一、开发软件

1、Keil

2、Proteus

3、PCtol2002 

4、Altium Designer

二、硬件部分

1、51单片机最小系统

电路图如下

2、LED点阵屏

LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。

LED点阵屏的结构类似于数码管,只不过是数码管把每一列的像素以“8”字型排列而已
LED点阵屏与数码管一样,有共阴和共阳两种接法,不同的接法对应的电路结构不同
LED点阵屏需要进行逐行或逐列扫描,才能使所有LED同时显示

3、74HC595

74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、24位、32位等,常用于IO口扩展。

 数据由SDI输入,当SCLK为上升沿时,数据整体向下移动,当RCLK为上升沿时数据由移位寄存器向右转存入存储寄存器。

当两片芯片级联时,下一级芯片数据由上一级芯片的QH'输入(为图中的SD0引脚)

4、74HC154

74HC138的功能即将4位二进制(A,B,C和D),译码成16输出状态,并且一共有16输出I/O,这16位输出的特点是:互斥(同时只有一位有效)、低有效(低电平表示有效,表示选中)。简单来说,74HC154实现了用4根线选择16根线(16选1)的功能。

OE1和OE2为芯片的使能端,同时为低电平时芯片有效。

三、软件部分

1、74HC595写入数据

/**
  * @brief  74HC595写入两个字节
  * @param  S X要写入的字节 S为上高8位 X为下低八位
  * @retval 无
  */
void _74HC595_WriteData(unsigned char S,unsigned char X)
{
	unsigned char i;
	RCK=0;
	for(i=0;i<16;i++)
	{
		SCK=0;
		if(i<8)
		{
			SER=X&(0x80>>i);
		}
		else
		{
			SER=S&(0x80>>(i-8));
		}
		SCK=1;
		
	}
	RCK=1;
	
}

2、点阵屏显示数据

/**
  * @brief  LED点阵屏显示一列数据
  * @param  Column 要选择的列,范围:0~31
  * @param  Data 选择列显示的数据,高位在上,1为亮,0为灭
  * @retval 无
  */
void MatrixLED_ShowColumn(unsigned char Column,DataA,DataB)
{
	if(Column < 16)MATRIX_LED_PORT = (Column | 0x20);
	if(Column >= 16)MATRIX_LED_PORT = (Column | 0x10);
	_74HC595_WriteData(DataA,DataB);
	Delay(1);
	MATRIX_LED_PORT&=0x00;
	
}

 3、点阵屏正向移动

while(1)
{
    for(i=0;i<32;i++)
    {			
    	MatrixLED_ShowColumn(i,table1[i+offset],table2[i+offset]);//依次扫描32列
    }
    offset++;                                                     
    if(offset>16*15)offset=0;
}

我在这里解释一下这个代码,首先  

 for(i=0;i<32;i++)
 {			
 	MatrixLED_ShowColumn(i,table1[i+offset],table2[i+offset]);//依次扫描32列
 }

 这个代码是用来实现字符的整体偏移的,即下一次显示时,字符正向移动一格 

 

offset++;                                                     
if(offset>16*15)offset=0;

其中16*15为字符的边界,offset为偏移量,也就是说我们从第offset位开始扫描32列数据并显示

4、点阵屏反向移动

            for(i=0;i<32;i++)                        //将数组的高一位数据赋值给低一位
			{
				Stable1[i]=Stable1[i+1];
				Xtable2[i]=Xtable2[i+1];
			}
			Stable1[31]=table1[31+16*(offset/16+1)-offset%16]; //最高位数据为下一个字符的最后一列数据
			Xtable2[31]=table2[31+16*(offset/16+1)-offset%16];
			for(i=0;i<32;i++)
			{			
				MatrixLED_ShowColumn(32-i,Stable1[i],Xtable2[i]);	
			}

我在这里解释一下这个代码,首先

for(i=0;i<32;i++)                        //将数组的高一位数据赋值给低一位
{
	Stable1[i]=Stable1[i+1];
	Xtable2[i]=Xtable2[i+1];
}

这个代码是用来实现字符的整体偏移的,同上

其次,解释下面这个代码

Stable1[31]=table1[31+16*(offset/16+1)-offset%16]; 
Xtable2[31]=table2[31+16*(offset/16+1)-offset%16];

 以Stable1为例,将它的第31列,也就是最后一列赋值为下一个字 的最后一列,如下

table1[31+16*(offset/16+1)-offset%16]; 

31是因为table1中前32个为空白,与Stable1初始化赋值时重复,故直接跳转

16*(offset/16+1)表示的是处理的第几个字符最后一列数据

-offset%16将一个字符的数据依次从后面提取出来,直到下一个字符

 

5、字模建立

1.使用PCtoLCD2002取字模软件,将模式设置为字符模式

2.字模选项如下图所示

因为我们是按列扫描,行显示,所以取模方式为行列式 

 3.输入要显示的字符,点击生成字模

生成字模如下

0x10,0x60,0x02,0x0C,0xC0,0x10,0x08,0xF7,0x14,0x54,0x94,0x14,0xF4,0x04,0x00,0x00
0x04,0x04,0x7C,0x03,0x00,0x01,0x1D,0x13,0x11,0x55,0x99,0x51,0x3F,0x11,0x01,0x00/*"海",0*/

0x04,0xE4,0x24,0x24,0x64,0xA4,0x24,0x3F,0x24,0xA4,0x64,0x24,0x24,0xE4,0x04,0x00
0x00,0xFF,0x00,0x08,0x09,0x09,0x09,0x7F,0x09,0x09,0x09,0x48,0x80,0x7F,0x00,0x00/*"南",1*/

0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00
0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00/*"大",2*/

0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00
0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00/*"学",3*/

4.将字模上下部分分开,新建两个数组保存数据

unsigned char code table1[]=
{
0x10,0x60,0x02,0x0C,0xC0,0x10,0x08,0xF7,0x14,0x54,0x94,0x14,0xF4,0x04,0x00,0x00,/*"海",上*/
0x04,0xE4,0x24,0x24,0x64,0xA4,0x24,0x3F,0x24,0xA4,0x64,0x24,0x24,0xE4,0x04,0x00,/*"南",上*/
0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,/*"大",上*/
0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,/*"学",上*/
}

unsigned char code table2[]=
{
0x04,0x04,0x7C,0x03,0x00,0x01,0x1D,0x13,0x11,0x55,0x99,0x51,0x3F,0x11,0x01,0x00,/*"海",下*/
0x00,0xFF,0x00,0x08,0x09,0x09,0x09,0x7F,0x09,0x09,0x09,0x48,0x80,0x7F,0x00,0x00,/*"南",下*/
0x80,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x03,0x0C,0x10,0x20,0x40,0x80,0x80,0x00,/*"大",下*/
0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00,/*"学",下*/
}

四、电路与仿真

正向仿真

反向仿真

电路图如下


总结

通过本次课设,使我对于单片机编程,原理图绘制的能力得到巨大的提升。同时,通过本次课设也使我意识到自己在程序编写方面的不足,需提升算法方面的学习。

本次链接更新了Protues的仿真

链接:https://pan.baidu.com/s/1SYA6HQPY8MzctRl3ARqZYw 
提取码:wd70

物联沃分享整理
物联沃-IOTWORD物联网 » 基于51单片机的16*32点阵显示屏设计与实现

发表评论