51单片机8x8led点阵_51单片机8×8点阵程序

51单片机8x8led点阵_51单片机8×8点阵程序看此篇博文之前建议先看博主的上一篇博文:51单片机教程:8*8点阵显示字符、数字、简单汉字教你如何用4个8乘8点阵拼成一个16乘16点阵一、点阵原理市面上有很多种类的点阵,但是最常用的还是这

看此篇博文之前建议先看博主的上一篇博文:51单片机教程:8*8 点阵显示字符、数字、简单汉字

取走点赞哦~

教你如何用4个8乘8点阵拼成一个16乘16点阵

资料链接:点阵16乘16.rar
一、点阵原理
市面上有很多种类的点阵,但是最常用的还是这种8乘8点阵
在这里插入图片描述
内部结构如下图
在这里插入图片描述
可以发现点阵就是由led构成,并且有一排是阳极,另一排是阴极,有一排是控制行,另一排是控制列。
打开proteus搜索MATRIX,看到各种型号的点阵,选择8乘8即可
在这里插入图片描述
任意选择一个颜色的点阵,我们发现引脚没有做任何标记,默认上排:阴极、控制列;下排:阳极、控制行
(一定要自己测一下,proteus仿真布置的点阵每次方向都可能发生改变)
在这里插入图片描述
什么意思呢,也就是跟下图对应关系,只不过引脚位置发生改变
在这里插入图片描述

二、4个 “ 2乘2 ” 点阵拼成一个 “ 4乘4” 点阵
我们先从简单开始理解,首先画出4个 “2乘2” 点阵
在这里插入图片描述
然后把上下方向的阴极控制列连接起来
把左右方向的阳极控制行连接起来
就拼成了一个4*4点阵
在这里插入图片描述
二、4个 “ 8乘8 ” 点阵拼成一个 “ 16乘16” 点阵
注意:proteus的点阵真的很难用,找不到方向,得自己测
测量两个内容:控制列还是控制行、阴极还是阳极
在这里插入图片描述

三、仿真:依次显示 “化作尘”,间隔为1秒

这里使用了74hc138与74hc595,不了解原理的自行百度,不做讲解
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对应代码:

/* hc595与hc138控制8*8点阵 一开始写这个程序的时候,程序运行占用存储空间超过了128b 错误: 点阵(四)16乘16.C(98): error C249: 'DATA': SEGMENT TOO LARGE 导致程序无法运行,原因是数组占用了大量的内存 后来在数组名前加了code解决了这个问题 意思是把数组存储到程序存储区4kb而不是 data区128b */

#include <regx51.h>

sbit SH_CP = P3^0;
sbit DS = P3^1;
sbit ST_CP = P3^2;

//不需要改变的数组保存到code程序存储区
unsigned char code b[3][32] = { 
   
/*-- 文字: 化 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x01,0x10,0x01,0x10,0x21,0x08,0x11,0x08,0x09,0x0C,0x05,0x0C,0x03,0x0A,0x01,
0x89,0x01,0x48,0x01,0x28,0x01,0x08,0x41,0x08,0x41,0x08,0x41,0x08,0x7E,0x08,0x00,

/*-- 文字: 作 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x90,0x00,0x90,0x00,0x90,0x00,0x88,0x7F,0x48,0x01,0x4C,0x01,0x2C,0x01,0x0A,0x1F,
0x09,0x01,0x08,0x01,0x08,0x01,0x08,0x3F,0x08,0x01,0x08,0x01,0x08,0x01,0x08,0x01,

/*-- 文字: 尘 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x80,0x00,0x80,0x00,0x90,0x04,0x90,0x08,0x88,0x10,0x84,0x20,0x82,0x20,0x00,0x00,
0x80,0x00,0x80,0x00,0xFC,0x1F,0x80,0x00,0x80,0x00,0x80,0x00,0xFF,0x7F,0x00,0x00,
  };

void delayms(unsigned int m)
{ 
   
	int i,j;
	for(i=0; i<m; i++)
		for(j=0; j<120; j++);
}

void hc_595(unsigned int temp,unsigned int temp1)	  //595段码程序
{ 
   
	char t;
	bit val;
	for(t=0; t<8; t++)
	{ 
   
	   
		val = temp & 0x80;     //第一个数据传到第一个595输出
		DS = val;
		SH_CP = 0;;  
		SH_CP = 1;
		temp = temp<<1;
	}
	for(t=0; t<8; t++)
	{ 
   
	   
		val = temp1 & 0x80;    //第二个数据传输到第二个595输出
		DS = val;
		SH_CP = 0;;  
		SH_CP = 1;
		temp1 = temp1<<1;
	}
	ST_CP = 0;;   
	ST_CP = 1;	
} 

void hc_138()
{ 
   
	unsigned int n,t,i;
	for(i=0; i<3; i++)				  //显示3个汉字
	{ 
   
		for(t=0; t<30; t++)			   //用来延时1秒
		{ 
   
			for(n=0; n<16; ++n)		   //一次显示一个汉字
			{ 
   	
				if(n<8)       //第一个138的高电平向下移动
				{ 
   
					P3_6 = 1;   //第一个138使能,第二个138不工作
					P2 = n;		   
				}
				else         //第二个138的高电平向下移动
				{ 
   
					P3_6 = 0;	 //第二个138使能,第一个138不工作
					P2 = n-8;    
				}
				hc_595(b[i][2*n],b[i][2*n+1]);	 //发送段码
				delayms(2);
			}
		}
	}
}


void main(void)
{ 
   
	while(1)
	{ 
   
			hc_138();
	}
}

今天的文章51单片机8x8led点阵_51单片机8×8点阵程序分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87089.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注