51单片机点阵

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言


学习了数码管的静态和动态显示,利用动态数码管显示的原理,搞定点阵。


一、点阵是什么?

1.点阵的原理

在这里插入图片描述

2. 3*3 点阵显示原理

在这里插入图片描述

3. 8*8点阵实物图

在这里插入图片描述

4. 8*8点阵内部原理图

在这里插入图片描述

5. 16*16点阵实物图,显示原理

在这里插入图片描述

二、使用步骤

1.先看原理图,确定点阵是88 1616 ,共阴,共阳?

代码如下(示例):

取段码:用专门的软件。

2.写代码

代码如下(示例):


逐行:

第一行
1.先给段码
P0=0X?
P2=0X?
P1=0X00;

第一行
1.先给段码
P0=0X?
P2=0X?
P1=0X01;

0000~1111   0-15

for(i=0;i<16;i++)
{
	P0=0X?
	P2=0X?
	P1=i;
	delay(?);
	P0=0X00;
	P2=0X00;

}





核心问题,段码怎么来?

在这里插入图片描述
在这里插入图片描述

三、实物操作

1.原理图

在这里插入图片描述

2.编程思路

  1. 段码 P0=0X?
  2. 位选
    P35 pclk
    P36 srclk
    P34 SER

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

J24 接 GND

P35_RCLK

P34_data

P36_SRCLK


一次移位
P34_data=1;
P36_SRCLK=0;
P36_SRCLK=1;

八次移位:
最简单的方法将上面的代码赋值八次
P34_data=;  // 是0 给00,是1给1
P36_SRCLK=0;
P36_SRCLK=1;
........


P35_RCLK=0;
P35_RCLK=1//发送  x =0x01   第一行

// 0000 0001
// 1000 0000
&
//=  0000 0000

//x =x<<1;

// 0000 0010



for(i=0;i<8;i++)
{
	if((x&0x80)==0)
	{
		P34_data=0;  // 是0 给00,是1给1
	}
	esle
	{
		P34_data=1;  // 是0 给00,是1给1
	}
	P36_SRCLK=0;
	P36_SRCLK=1;
	x=x<<1;

}
P35_RCLK=0;
P35_RCLK=1;

P36_SRCLK=0;
P35_RCLK=0//发送0x02   第二行 

for(i=0;i<8;i++)
{

	P34_data=;  // 是0 给00,是1给1
	P36_SRCLK=0;
	P36_SRCLK=1;

}
P35_RCLK=0;
P35_RCLK=1;

P36_SRCLK=0;
P35_RCLK=0

简化的方法:


// 1000 0000
// 1 000  0000 0

for(i=0;i<8;i++)
{
	
	X=X<<1;
	P34_data=CY;  // 是0 给00,是1给1
	
	P36_SRCLK=0;
	P36_SRCLK=1;


}
P35_RCLK=0;
P35_RCLK=1;

P36_SRCLK=0;
P35_RCLK=0

P0=0X?
HC595(0X01)




temp=0x01;
for(i=0;i<8;i++)
{

	P0=0X?
	HC595(temp)  //0x01
	temp=temp<<1;
	delay();
	P0=0X?//,灭
}

四、 书上的代码讲解

4.1代码讲解

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

改变j显示不同的汉字,改变i显示不同行的段码;

n的讲解
在这里插入图片描述

4.2 仿真逐行滚动:

 #include<reg51.h>
 #define uchar unsigned char
 #define uint unsigned int
 #define out0 P0
 #define out2 P2 
 #define out1 P1
 void delay(uint j)
 {
  uchar i=250;
  for(;j>0;j--)
  {
  while(--i);
  i=100;
  }
 }
 uchar code string[]=
 { 


/*文字"电"的16x16点阵*/
0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x03,0xE0,0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,
0x7B,0xEF,0x7B,0xEF,0x03,0xE0,0x7B,0xEF,0x7F,0xBF,0x7F,0xBF,0xFF,0x00,0xFF,0xFF,

/*文字"子"的16x16点阵*/
0xFF,0xFF,0x03,0xF0,0xFF,0xFB,0xFF,0xFD,0xFF,0xFE,0x7F,0xFF,0x7F,0xFF,0x7F,0xDF,
0x00,0x80,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x5F,0xFF,0xBF,0xFF,

/*文字"技"的16x16点阵*/
0xF7,0xFB,0xF7,0xFB,0xF7,0xFB,0x40,0x80,0xF7,0xFB,0xD7,0xFB,0x67,0xC0,0x73,0xEF,
0xF4,0xEE,0xF7,0xF6,0xF7,0xF9,0xF7,0xF9,0xF7,0xF6,0x77,0x8F,0x95,0xDF,0xFB,0xFF,

/*文字"术"的16x16点阵*/
0x7F,0xFF,0x7F,0xFB,0x7F,0xF7,0x7F,0xFF,0x00,0x80,0x7F,0xFF,0x3F,0xFE,0x5F,0xFD,
0x5F,0xFB,0x6F,0xF7,0x77,0xE7,0x7B,0x8F,0x7C,0xDF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,
	 
/*0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,*/	 
	 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	 
	  };
void main()
{
uchar i,j,n;
while(1)
	 {
	  for(j=0;j<4*16;j++)//共有4个汉字  4*32=  4*16*2  
	 // for(j=0;j<4;j++)//共有4个汉字 
	  	{
	  	for(n=0;n<10;n++)//每个汉字整屏扫描40次
	  		{
	  		 for(i=0;i<16;i++)//16行
	  			{
				 out1=i%16;
				 out0=string[i*2+2*j];   //2*j 每次滑动两个字节即16位,刚好移动一行
	  			 out2=string[i*2+1+2*j];
				//	 out0=string[i*2+32*j];
				//	 out2=string[i*2+1+32*j];
	  			 
	  			 delay(4);
	  			 out0=0xff;
	  			 out2=0xff;

	  			}
	  		}
		
	  	}
	 }
}

关键:每次移动一行或者一列,逐次移动则可以得到想要的效果
2*j 每次滑动两个字节即16位,刚好移动一行
可以试着移动多行,当移动16行的时候则为一次移动一个汉字,就变成了书上的代码

				 out0=string[i*2+2*j];   //2*j 每次滑动两个字节即16位,刚好移动一行
	  			 out2=string[i*2+1+2*j];


				 out0=string[i*2+32*j];   //2*j 每次滑动两个字节即16位,刚好移动一行
	  			 out2=string[i*2+1+32*j];

总结

利用动态数码管显示的原理,用点阵显示字符。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值