🏆文章目录
❤️第一话——点阵屏介绍
😃 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;
}
}
}
}