欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

单片机__LED点阵学习收获

程序员文章站 2022-03-26 18:04:38
@[TOC]单片机__LED点阵学习收获LED点阵原理本仿真器的LED点阵为共阳极LED点阵小灯亮的原理:点阵行控的有八个端口,点阵列控八个端口当点阵行控的端口为1(高电平,5v),其所对应的点阵列控的端口为0(低电平,接地)时,小灯便会亮。LED点阵显示字码原理:动态显示效应LED点阵一次最多只能显示一行或者一列,显示字码是一种动态显示效应。(动态显示是利用人眼的暂留效应来多位显示的。)代码实现首先解释一下行选通控制和列选通控制:1.//--行选通控制--//unsigned...

@[TOC]单片机__LED点阵学习收获

LED点阵原理

本仿真器的LED点阵为共阳极
单片机__LED点阵学习收获单片机__LED点阵学习收获

LED点阵小灯亮的原理:
点阵行控的有八个端口,点阵列控八个端口
当点阵行控的端口为1(高电平,5v),其所对应的点阵列控的端口为0(低电平,接地)时,小灯便会亮。

LED点阵显示字码原理:
动态显示效应
LED点阵一次最多只能显示一行或者一列,显示字码是一种动态显示效应。(动态显示是利用人眼的暂留效应来多位显示的。)

代码实现

首先解释一下行选通控制和列选通控制:
1.

//--行选通控制--//
unsigned char code TAB[8]  = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

行选通控制就是通过控制一行一行的显示来动态显示字码。
想要显示哪一行,就将那一行的端口置为1,其余端口全为0.
例如:0x01就是只显示第一行,0x02只显示第二行,以此类推。
2.

unsigned char code TAB[8]  = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

列选通控制通过一列一列的来动态显示字码
列选通控制是让显示的那一列端口为0,其实端口为1来实现

①显示一个字符

例如:0
P0连接点阵行控(反接),P2连接点阵列控。
消隐
解释:消隐意思是在全部数码显示完后再全部熄灭后再跳到第一个显示。
????对这个解释存疑????
原因:因为数码管在动态循环显示字码时会因为没有让所有数码管熄灭导致送入字码时串码出现的阴影,就是说把你想要显示那位的字码串到其他位的数码管上显示了,由于速度快所以呈现阴影
for(i= 0; i<4000; i++ ) //两个字之间的扫描间隔时间
这个for循环的作用其实就是调控字码显示的时间,i<4000说明显示的时间就是4000次指令的执行时间那么长。

#include<reg51.h>

//--列选通控制--//
unsigned char code TAB[8]  = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

//--点阵字码--//
unsigned char code CHARCODE[8]=
{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00} ;

void main()
{	
 	unsigned char tab;
	unsigned int  i;

	while(1)
	{	
		for(i= 0; i<4000; i++ )   //两个字之间的扫描间隔时间
		{
			for(tab=0;tab<8;tab++)
			{	
				P2=0xFF;				   //消隐
				P0=CHARCODE[tab];  //输出字码
				P2=TAB[tab];			   
			}
		}
	}	
}

②显示数字,字母,汉字

#include <reg52.h>

//--列选通控制--//
//依次使第一列,第二列......第八列处于低电平,使之有效
unsigned char code TAB[8]  = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

//--点阵字码--//
//因为是列选通控制,所以是纵向取模

//数字 
unsigned char code INTCODE[10][8]=
{
	{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00}, //0
	
	{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00}, //1
	
	{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00}, //2
	
	{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00}, //3
	
	{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00}, //4
	
	{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00}, //5
	
	{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00}, //6
	
	{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00}, //7
	
	{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00}, //8
	
	{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00} //9
};

//字母 
unsigned char code CHARCODE[2][8]=
{
	{0x00,0x00,0x7E,0x02,0x02,0x02,0x02,0x00},
	{0x00,0x00,0x7E,0x50,0x50,0x70,0x00,0x00}
};

 // 8x8 显示文字好困难
unsigned char code ChineseCharacter[3][8]=
{
	{0x00,0x07,0x75,0x55,0x55,0x75,0x07,0x00},
	{0x00,0x00,0x1C,0x14,0x7F,0x14,0x1C,0x00},
	{0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x00}
};


void main()
{	
 	unsigned char tab;
	unsigned int  i;
    unsigned int  j=0;

	while(1)
	{

		while(1)
		{	
			for(i= 0; i<5000; i++ )   //两个字之间的扫描间隔时间  ,5000次执行一条指令的时间就是这个字符动态显示的时间
			{
				for(tab=0;tab<8;tab++)
				{	
					P2=0xFF;			 //消隐			  
					P0=INTCODE[j][tab];  //输出字码		  
					P2=TAB[tab];			   			          
				}
			}
	
			j++;
			if(j == 10)
			{
				j = 0;
				break; //跳出while循环
			}
		}
		while(1)
		{
		 		for(i=0;i<5000;i++)
		    	{
			 	  for(tab=0;tab<8;tab++)
			    	{
				    	P2=0xFF;
					    P0=CHARCODE[j][tab];
						P2=TAB[tab];
					}
				}
				j++;
				if(j==2)
				{
					j=0;
					break;
				}		
		}
		
		while(1)
		{
		 	  for(i=0;i<20000;i++)
		    	{
			 	  for(tab=0;tab<8;tab++)
			    	{
				    	P2=0xFF;
					    P0=ChineseCharacter[j][tab];
						P2=TAB[tab];
					}
				}
				j++;
				if(j==3)
				{
					j=0;
					break;
				}	
		}	
	}
}

③显示动画


#include<reg51.h>

//--定义要使用的IO口--//
#define READPORTS 		P2
#define GREENPORTS 		P1
#define COMMONPORTS		P0

//--列选通控制--//
unsigned char code TAB[8]  = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

//--点阵字码--//
unsigned char code CHARCODE[6][8]=
{
	{0x04,0x64,0xDF,0x90,0xDF,0x64,0x04,0x00},   //平着
	{0x0C,0x64,0xDF,0x90,0xDF,0x64,0x0C,0x00},	 //举起
	{0x04,0x64,0xDF,0x90,0xDF,0x64,0x04,0x00},	 //平着
	{0x06,0x64,0xDF,0x90,0xDF,0x64,0x06,0x00},   //落下
	{0x1C,0x36,0x22,0x1C,0x17,0x14,0x1F,0x14},   //倒下
	{0x1C,0x36,0x22,0x1C,0x17,0x14,0x1F,0x14}    //倒下
};


void main()
{	
 	unsigned char tab, j;
	unsigned int  i;

	while(1)
	{	
		for(i= 0; i<4000; i++ )   //两个字之间的扫描间隔时间
		{
			for(tab=0;tab<8;tab++)
			{	
				READPORTS=0xFF;				   //消隐
				COMMONPORTS=CHARCODE[j][tab];  //输出字码
				READPORTS=TAB[tab];			   
			}
		}
		j++;
		if(j == 6)
		{
			j = 0;
		}
	}	
}

通过行选通控制来流动显示我爱你

出了点问题,还没有实现
会糊

取模软件zimo

白色的点代表0,黑色的代表1

两种取模方式:1.纵向取模 2.横向取模
注意:当纵向取模时要所接的的数据线反接。
举例:当P0接点阵行控,P2接点阵列控时,连接P0的数据线需要 反接,这样才能和取模软件给出的十六进制数对应。

为什么纵向取模是要反接?
请听下次分晓

本文地址:https://blog.csdn.net/weixin_45893046/article/details/109610017

相关标签: 单片机 c语言