LED点阵基础讲解及字符显示

51单片机重新学习之LED点阵:

1.LED点阵简介

1.1什么是点阵液晶?

(1)外观
(2)作用:显示器件。类似于数码管,只不过内部的LED都是圆点 的,而数码管做成了长条与点。
(3)内部构造:点阵的优势:可以8+8个IO口独立控制8*8个LED亮灭。
(4)如何工作:内部LED的亮与灭。多个LED的亮灭配合组成想显示的内容。

1.2如何驱动LED点阵液晶?

(1)单片机端口直接驱动(费IO端口)
(2)使用串转并移位锁存器进行驱动(74HC595)
串转并:一列输入,一排输出的操作
移位:数据一位一位的移动,放进去的操作。
锁存:把串行放入芯片中的数据给芯片某个指令放到并行输出口的并更新寄存器中的值的的那个操作。

1.3HC595的连接
1.4时序的引入

(1) 时序就是芯片之间通信引脚上电平变化以时间轴为参考的变化顺序。
(2)学会看时序,学会时序的调整与转化。
(3)HC595芯片:SCLK 和 RCLK 。SCLK是移位时钟,每一个SCLK上升沿会对SER引脚进行采样,就向595内部输入了一位,如此循环8次就发送一个字节。RCLK是锁存时钟,QA-QH的8位并行输出信号在RCLK上升沿时就进行一次锁存。
(4)C51位定义 ,关键件sbit sbit SER = P3^4;

1.5实战
#include <reg51.h>

//点亮点阵
//接线:
/*
//P3^4 SER 
  P3^5 RCLK	上升沿时移位寄存器的数据进入存储寄存器 下降沿时存储寄存器的数据保持不变
  P3^6 SCLK 上升沿时数据寄存器的数据移位 

*/
sbit SER = P3^4;
sbit RCLK = P3^5;
sbit SCLK = P3^6;

#define uchar unsigned char
void main(void)
{
	uchar i = 0;
	uchar d1 = 0;
	uchar d2 = 0;
	uchar d3 = 0xff;
	uchar d4 = 0xff;

	SCLK = 0;
	RCLK = 0; 	//都初始化为低
	for(i=0; i<8; i++)
	{
	//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
	//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
	//最后一次发送的是最低位。
		SER = d1 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
		SCLK = 0;
		SCLK = 1; 	//制造上升沿,为数据移位做准备
		d1 = d1 << 1;			
	}

	for(i=0; i<8; i++)
	{
	//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
	//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
	//最后一次发送的是最低位。
		SER = d2 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
		SCLK = 0;
		SCLK = 1; 	//制造上升沿,为数据移位做准备
		d2 = d2 << 1;			
	}

	for(i=0; i<8; i++)
	{
	//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
	//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
	//最后一次发送的是最低位。
		SER = d3 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
		SCLK = 0;
		SCLK = 1; 	//制造上升沿,为数据移位做准备
		d3 = d3 << 1;			
	}

	for(i=0; i<8; i++)
	{
	//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
	//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
	//最后一次发送的是最低位。
		SER = d4 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
		SCLK = 0;
		SCLK = 1; 	//制造上升沿,为数据移位做准备
		d4 = d4 << 1;			
	}

	//至此,32bit数据已经 移位过去了,现在就是要锁存了。
	RCLK = 0;
	RCLK = 1;

	while(1);				
}
1.6实战:进行函数封装,提高阅读性。
#include <reg51.h>

//点亮点阵
//接线:
/*
//P3^4 SER 
  P3^5 RCLK	上升沿时移位寄存器的数据进入存储寄存器 下降沿时存储寄存器的数据保持不变
  P3^6 SCLK 上升沿时数据寄存器的数据移位 

*/
sbit SER = P3^4;
sbit RCLK = P3^5;
sbit SCLK = P3^6;

#define uchar unsigned char

void SendData(unsigned char d);
void main(void)
{
	uchar i = 0;
	uchar d1 = 0;
	uchar d2 = 0;
	uchar d3 = 0xfe;
	uchar d4 = 0xfe;

	SCLK = 0;
	RCLK = 0; 	//都初始化为低
	SendData(d1);
	SendData(d2);
	SendData(d3);
	SendData(d4);
	RCLK = 0;
	RCLK = 1;

	while(1);
				
}

void SendData(unsigned char d)
{
	unsigned char i = 0;
	for(i=0; i<8; i++)
	{
	 	SER = d >> 7;	
		SCLK = 0;
		SCLK = 1; 	
		d = d << 1;
	}

}
1.7字模引入。

(1)字模简单的说就是在屏幕上要显示的字的模型。
(2)表现形式:放在点阵上就是一些LED点亮,而另一些LED点灭,这种亮灭组合最后显示出来的是一个字。
(3)字模的大小:以16 * 16的点阵来说,16 * 16的点阵有256个点,256个点用256个二进制位表示,那么就有256/8 = 32个字节。所有这种情况下字模的大小就是32个unsigned char型的数据。
(4)字模的获取:字模提取软件。
(5)字模的提取不是唯一的,与自己提取字模的方法有关,也是可以变的。
(6)字模软件的使用:最终是为了得到字模数组。
(7)利用显示代码显示时,需要对取模软件得到的字模数组进行调整。比如:我们显示的是在阴极上,但是取模软件上取得是1表示亮0表示灭,正好与我们的想反,所以我们需要按位取反。

#include <reg51.h>

//点亮点阵
//接线:
/*
//P3^4 SER 
 P3^5 RCLK	上升沿时移位寄存器的数据进入存储寄存器 下降沿时存储寄存器的数据保持不变
 P3^6 SCLK 上升沿时数据寄存器的数据移位 

*/
sbit SER = P3^4;
sbit RCLK = P3^5;
sbit SCLK = P3^6;

#define uchar unsigned char

void SendData(uchar d1, uchar d2, uchar d3, uchar d4);
void display(uchar varry[32],uchar hang[32]);

#define uchar unsigned char
//取模方式:阴码,逐行式,顺向(高位在前)
//uchar yang[32] = 
//{0x08,0x00,0x88,0x1F,0x08,0x08,0x08,0x04,0x3F,0x02,0x08,0x01,0x8C,0x7F,0x1C,0x49,
//0x2A,0x49,0x2A,0x49,0x89,0x48,0x88,0x44,0x48,0x44,0x28,0x42,0x08,0x29,0x88,0x10};/*"杨",0*/

//uchar yang1[32] = 
//{0x00,0x00,0x3E,0x00,0xA2,0x3F,0x92,0x20,0x92,0x20,0x8A,0x20,0x92,0x20,0x92,0x20,
//0xA2,0x3F,0xA2,0x20,0xA2,0x20,0x96,0x20,0x8A,0x20,0x82,0x20,0x82,0x3F,0x82,0x20};/*"阳",0*/

uchar rui[32] =
{0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x08,0x20,0x01,0x00,0x24,0x88,0x24,0x24,
0x43,0xE4,0x00,0x00,0x24,0x24,0x12,0x12,0xA0,0xA0,0xA4,0xA4,0x1C,0x1C,0x00,0x00};/*"蕊",0*/




uchar hang[] = 
{0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,
0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
};

void main(void)
{	/*
SendData(~0x00,~0x08,0x00,0x01);	//显示第一行
SendData(~0x1F,~0x88,0x00,0x02);	//显示第二行
SendData(~0x08,~0x08,0x00,0x04);	//显示第三行
SendData(~0x04,~0x08,0x00,0x08);	//显示第四行
SendData(~0x02,~0x3F,0x00,0x10);	//显示第五行
SendData(~0x01,~0x08,0x00,0x20);	//显示第六行
SendData(~0x7F,~0x8C,0x00,0x40);	//显示第七行
SendData(~0x49,~0x1C,0x00,0x80);	//显示第八行
 */
 display(rui,hang);
//while(1);				
}

//发送数据函数
/*
d1 表示列 d2 表示列 d3 表示行(9-16) d4  表示行(1-8)
*/
void SendData(uchar d1, uchar d2, uchar d3, uchar d4)
{
uchar i = 0;
SCLK = 0;
RCLK = 0; 	//都初始化为低
for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。
	SER = d1 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
	SCLK = 0;
	SCLK = 1; 	//制造上升沿,为数据移位做准备
	d1 = d1 << 1;			
}

for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。
	SER = d2 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
	SCLK = 0;
	SCLK = 1; 	//制造上升沿,为数据移位做准备
	d2 = d2 << 1;			
}

for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。
	SER = d3 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
	SCLK = 0;
	SCLK = 1; 	//制造上升沿,为数据移位做准备
	d3 = d3 << 1;			
}

for(i=0; i<8; i++)
{
//先传输的是高位 ,就是bit7,送进来之后,为了传输后边的bit,就把bit7放到
//最低位,然后发送出去又进行了左移,就是放到次高位,反复7次,一个字节发送完毕。
//最后一次发送的是最低位。
	SER = d4 >> 7;	//d1右移7位,就是把d1字节中的最高位取出来了。
	SCLK = 0;
	SCLK = 1; 	//制造上升沿,为数据移位做准备
	d4 = d4 << 1;			
}
//至此,32bit数据已经 移位过去了,现在就是要锁存了。
RCLK = 0;
RCLK = 1;	
}

void display(uchar varry[32],uchar hang[32])
{
uchar i = 0;
for(i=0; i<16; i++)
{
	SendData(~varry[2*i],~varry[2*i+1],hang[2*i],hang[2*i+1]);	
}
}

总结:LED 点阵基本完结。也基本没啥问题吧。需要自己注意的几点,可能也是之前不懂的部分。

(1)

	for(i=0; i<8; i++)
		{
			SER = d2 >> 7;	。
			SCLK = 0;
			SCLK = 1; 	
			d2 = d2 << 1;	//***此句话的作用***	
			//发送移位的作用,因为把d2移位到最低位了。
			//最低位有值了,下一个值是需要放到次低位的。
			//这个移位是从最低位移到次高位。	
		}

(2)字模的大小:以16 * 16的点阵来说,16 * 16的点阵有256个点,256个点用256个二进制位表示,那么就有256/8 = 32个字节。所有这种情况下字模的大小就是32个unsigned char型的数据。
(3)时序的解读。
(4)点阵的内部构成与显示原理
(5)函数的封装
(6)多思考!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值