从零开始带你玩转单片机----------【第八期】51单片机点阵屏使用

发布于:2022-11-01 ⋅ 阅读:(506) ⋅ 点赞:(0)

❤️第一话——点阵屏介绍

😃 1.1 点阵屏分类

1.按颜色分:单色、双色、全色
2.按像素分:8x8、16x16等

😂 1.2 显示原理

在这里插入图片描述

本质还是驱动二极管亮灭来实现目标功能,选中行列位置来点灯,分为共阴极和共阳极

❤️第二话——普中开发板点阵屏电路

🌿2.1 74HC595模块

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

74HC595是串行输入并行输出的移位寄存器,可用3路IO口,控制8路输出,还可以多片联级,如图2所示,一个10000001 11111111的数据是这样传输的,RCLK和SRCLK通过高低电平转化,其中高电平有效,让SER的数据往QA~QH中传,SER的数据是单片机IO口给的,将RCLK与SRCLK比作枪的扳机,SER需要传的数据比作弹夹里的子弹,QA-QH比作射出的子弹,就很容易理解

注意:OE为低电平有效,要将OE跳线帽接地

❤️第三话——代码实操

🌸3.1 点阵屏显示原理

#include <regx52.h>

sbit SER=P3^4;     //位声明,定义P3.4位SER
sbit RCK=P3^5;    //位声明,定义P3.5为RCLK(根据电路图)
sbit SCK=P3^6;    //位声明,定义P3.6为SRCLK


/**************74HC595写内容函数**************/
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;    //定义一个累加器
	for(i=0;i<8;i++)    //一个数据有8位,需要传递这8个数据
	{
	SER=Byte&(0x80>>i);   //Byte的数据,最高位&上1000 0000,将最高位取出赋值给SER寄存器,每次右移i次,8位数据都取到
    SCK=1;           //给一个高电平信号,数据移动一位
    SCK=0;          //移完一个数据后,恢复为低电平,为下一次数据移动做准备
	}
	RCK=1;         //和SCK同理
	RCK=0;	
}

/****************延时函数******************/
void Delay(unsigned char xms)
{ 
	while(xms)
	{
	  unsigned char i=2;
	  unsigned char j=239;
	  do
	  {
	   while(--j);
	  }while(--i);
	  xms--;
    }
	
}

/***************点阵屏显示函数******************/
void MatrixLED_show(unsigned char Column,unsigned char Data)     //操作行与列就能实现点阵屏显示
{
    _74HC595_WriteByte(Data);   //确定点阵屏行位置
	P0=~(0X80>>Column);        //列操作选中,从最高位右移,第几列就右移几行选中,但是要取反,低电平选中	
    Delay(1);          //延时消影
	P0=0xFF;           //列清零
}

void main()
{
	SCK=0;   //上电初始化默认低电平
	RCK=0;   //上电初始化默认低电平
	MatrixLED_show(0,0xAA);
	while(1)
	{
	}
	
}

🏆3.2 单片机点阵屏显示心形

#include <regx52.h>

sbit SER=P3^4;     //位声明,定义P3.4位SER
sbit RCK=P3^5;    //位声明,定义P3.5为RCLK(根据电路图)
sbit SCK=P3^6;    //位声明,定义P3.6为SRCLK


/**************74HC595写内容函数**************/
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;    //定义一个累加器
	for(i=0;i<8;i++)    //一个数据有8位,需要传递这8个数据
	{
	SER=Byte&(0x80>>i);   //Byte的数据,最高位&上1000 0000,将最高位取出赋值给SER寄存器,每次右移i次,8位数据都取到
    SCK=1;           //给一个高电平信号,数据移动一位
    SCK=0;          //移完一个数据后,恢复为低电平,为下一次数据移动做准备
	}
	RCK=1;         //和SCK同理
	RCK=0;	
}

/****************延时函数******************/
void Delay(unsigned char xms)
{ 
	while(xms)
	{
	  unsigned char i=2;
	  unsigned char j=239;
	  do
	  {
	   while(--j);
	  }while(--i);
	 xms--; 
    }
	
}

/***************点阵屏显示函数******************/
void MatrixLED_show(unsigned char Column,unsigned char Data)     //操作行与列就能实现点阵屏显示
{
    _74HC595_WriteByte(Data);   //确定点阵屏行位置
	P0=~(0X80>>Column);        //列操作选中,从最高位右移,第几列就右移几行选中,但是要取反,低电平选中	
    Delay(1);          //延时消影
	P0=0xFF;           //列清零
}

void main()
{
	SCK=0;   //上电初始化默认低电平
	RCK=0;   //上电初始化默认低电平
	while(1)
	{
		MatrixLED_show(0,0x18);
		MatrixLED_show(1,0x24);
		MatrixLED_show(2,0x12);
		MatrixLED_show(3,0x09);
		
		MatrixLED_show(4,0x09);
		MatrixLED_show(5,0x12);
		MatrixLED_show(6,0x24);
		MatrixLED_show(7,0x18);
    }
	
}

🦋3.3 单片机点阵屏显示动画

#include <regx52.h>

sbit SER=P3^4;     //位声明,定义P3.4位SER
sbit RCK=P3^5;    //位声明,定义P3.5为RCLK(根据电路图)
sbit SCK=P3^6;    //位声明,定义P3.6为SRCLK

unsigned char Cartoon[]=
{
	0xFF,0x10,0x10,0x10,0x10,0xFF,0x00,0x00,0xFF,0x91,0x91,0x91,0x00,0x00,0x00,0x00,
    0x00,0x80,0x40,0x3F,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};                //定义了一个显示动画的数组,排列与取字模设置有关



/**************74HC595写内容函数**************/
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;    //定义一个累加器
	for(i=0;i<8;i++)    //一个数据有8位,需要传递这8个数据
	{
	SER=Byte&(0x80>>i);   //Byte的数据,最高位&上1000 0000,将最高位取出赋值给SER寄存器,每次右移i次,8位数据都取到
    SCK=1;           //给一个高电平信号,数据移动一位
    SCK=0;          //移完一个数据后,恢复为低电平,为下一次数据移动做准备
	}
	RCK=1;         //和SCK同理
	RCK=0;	
}

/****************延时函数******************/
void Delay(unsigned char xms)
{ 
	while(xms)
	{
	  unsigned char i=2;
	  unsigned char j=239;
	  do
	  {
	   while(--j);
	  }while(--i);
	  xms--;
    }
}

/***************点阵屏显示函数******************/
void MatrixLED_show(unsigned char Column,unsigned char Data)     //操作行与列就能实现点阵屏显示
{
    _74HC595_WriteByte(Data);   //确定点阵屏行位置
	P0=~(0X80>>Column);        //列操作选中,从最高位右移,第几列就右移几行选中,但是要取反,低电平选中	
    Delay(1);          //延时消影
	P0=0xFF;           //列清零
}

void main()
{
	unsigned char i,move=3,count=0;   //定义遍历行列显示变量,移动值,计数器
	SCK=0;   //上电初始化默认低电平
	RCK=0;   //上电初始化默认低电平
	
	while(1)
	{
		for(i=0;i<8;i++)
		{
		MatrixLED_show(i,Cartoon[i+move]);    
		}
		count++;              //显示一次count加1
		if(count>10)
		{
			count=0;          //count清零
			move++;           //move移动一位
		if(move>24)       //两行数组总共32个,溢出时零界值32-8(越界判断)
		{
            move=0;
		}			
		}
	}
	
}

网站公告

今日签到

点亮在社区的每一天
去签到