LED点阵屏幕和驱动代码
我们先搞清楚74HC595的原理
sfr 特殊功能寄存器声明
sbit 特殊位声明
就举个例子,我们在之前的各种测试中对LED进行控制会直接输入P2=什么什么,那我想问你怎么知道P2口控制的就是LED呢,其实这些就是已经在内部声明完成了,我们可以直接拿来使用
内部已经声明完成了
sfr P0=0x80;
声明P0口寄存器,物理地址为0x80
sbit P0_1=0x81;
声明P0寄存器的第一位
因为内部已经偷偷将其进行了地址编码了现在我们还与其他的方法实现
可位寻址和不可位寻址
因为位有8位,我们在进行设计的时候不可能完全照顾到每一位的方方面面,所以在设计的时候就已经弱化了位数的概念,在每8个寄存器中,只有一个可位寻址的。
就像我们以前的TCON是可位寻址的
而TMOD是不可位
我们先写一个
void _74HC595_WriteByte(unsigned char Byte)
{
//首先把数值赋给SER 而且有种入栈高位在前
//怎么取出第八位就是用
//因为他不是说的那种地可寻
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
这个目的就是我们写入的数据都会通过SER进入这几个引脚上
然后我们再写一个
void MatrixLED_Showcolumn(unsigned char column , Data)
{
_74HC595_WriteByte(Data);
P0=~(0x80>>column);
}
SER输入的第一个数字是D7 然后依次类推
我懂了这两个组合才可以生成一系列的数字
第一个相当于是对行进行操作
就是你输入的后入先出 第一个是最大的,依次
下面这个代码的作用是控制列 用来确定列的一些信息
MatrixLED_Showcolumn(0,0xAA);
所以我在输入这句话之后,得出的结论是 先锁定第0行再确定灯是10101010 因为是16进制 ,
我觉得我发现一个问题就是 我并不是特别需要考虑后入先出的问题 因为我的灯是D7 D6-----D0如此排列的 maybe 我们只要按照自己的常规思路去搭建就行了
and 为什么你说是0就是第0列 原因在这里
因为我用的是P0=~(0x80>>column);
而例如我们选择了P7 那相当于把P7置于0 其他位上都是1 就是0111 1111
相对来说岂不是 1000 0000 的翻版
我选择第1列 1011 1111相当于0100 0000 的翻版 很合理
所以是如此选择
我们每次进行亮灯之后 我们都需要即时把灯的信息更新归位?不然会影响下一次的操作
就像之前的那个一样 一闪一闪不方便
我们就像之前做数字灯管,进行 段选 位选 段选 位选 段选 位选 中间有一个小小的隔开的操作 以便快闪的发生
整个流程就是 段选 位选 延时 位清零 , 段选 位选 延时 位清零 , 段选 位选 延时 位清零
//此处添加代码 完成 了上述各项操作
//此处添加代码 完成 了上述各项操作
#include <REGX52.H>
#include"Delay.h"
sbit RCK=P3^5;//是P3的第五位 RCLK
sbit SCK=P3^6; // SRCLK
sbit SER=P3^4; // SER
//编译的时候可能会出错因为我们在系统内部已经有了一个RCLK的存在了
//所以我们稍微修改一下名字
void _74HC595_WriteByte(unsigned char Byte)
{
//首先把数值赋给SER 而且有种入栈高位在前
//怎么取出第八位就是用
//因为他不是说的那种地可寻
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
void MatrixLED_Showcolumn(unsigned char column , Data)
{
_74HC595_WriteByte(Data);
P0=~(0x80>>column);
Delay(1);
P0=0xFF;//段选 位选 位清零
}
void main()
{
//为了方便串口的实现将串口名字进行统一的修改
SCK=0;
RCK=0;
//操纵点阵屏需要用到数码管类似的代码
while(1)
{
MatrixLED_Showcolumn(0,0x80);
MatrixLED_Showcolumn(1,0x40);
MatrixLED_Showcolumn(2,0x20);
MatrixLED_Showcolumn(3,0x10);
}
}
//显示效果是点阵对角线
maybe 我们可以用excel先划定大概的范围确定 图形的样子 例如我们可以画出一整个爱心什么的
MatrixLED_Showcolumn(0,0x3c);
MatrixLED_Showcolumn(1,0x42);
MatrixLED_Showcolumn(2,0xA9);
MatrixLED_Showcolumn(3,0x85);
MatrixLED_Showcolumn(4,0x85);
MatrixLED_Showcolumn(5,0xA9);
MatrixLED_Showcolumn(6,0x42);
MatrixLED_Showcolumn(7,0x3C);
/爱心代码
对于整个数字的偏移的话,我们可以就是画完整个图然后一帧一帧的偏移移动
取字是不是太麻烦了 ,我们选择用文字取模软件 嘻嘻
0xFF,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,0x15,0x15,0x09,0x00,0xFF,0x00,
0xFF,0x00,0x00,0x0F,0x09,0x09,0x0F,0x00,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x00,
存东西要存的很大我们可以放在flash 里面
unsigned char code Animation[]
但是存在flash里面 只能读取不能修改
//以下是流动显示HELLO ! 的代码
main.c
#include <REGX52.H>
#include"Delay.h"
#include"MatrixLED.h"
unsigned char Animation[]={
0xFF,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x0E,0x15,0x15,0x15,0x09,0x00,0xFF,0x00,
0xFF,0x00,0x00,0x0F,0x09,0x09,0x0F,0x00,0x00,0x00,0x00,0xFD,0x00,0x00,0x00,0x00};
void main()
{
unsigned char i , offset=1,count=3;
//为了方便串口的实现将串口名字进行统一的修改
MatrixLED_Init();
//操纵点阵屏需要用到数码管类似的代码
while(1)
{
for(i=0;i<8;i++)
{
MatrixLED_Showcolumn(i,Animation[i+offset]);
}
count++;
if(count>10)
{
count=0;
offset++;
if(offset>24)
{
offset=0;
}
}
}
}
Delay.c
void Delay(unsigned int xms)
//
//
//
{
unsigned char i, j;
while(xms--)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
}
}
Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned int xms);
#endif
MartixLED.c文章来源:https://www.toymoban.com/news/detail-510222.html
#include <REGX52.H>
#include"Delay.h"
#include"MatrixLED.h"
sbit RCK=P3^5;//是P3的第五位 RCLK
sbit SCK=P3^6; // SRCLK
sbit SER=P3^4; // SER
//编译的时候可能会出错因为我们在系统内部已经有了一个RCLK的存在了
//所以我们稍微修改一下名字
#define MATRIX_LED_PORT P0
//74HC595 写入一个字节
//要写入的字节
//第一个是控制整行
//然后下一个是确定单列的数据
//
//
//
void _74HC595_WriteByte(unsigned char Byte)
{
//首先把数值赋给SER 而且有种入栈高位在前
//怎么取出第八位就是用
//因为他不是说的那种地可寻
unsigned char i;
for(i=0;i<8;i++)
{
SER=Byte&(0x80>>i);
SCK=1;
SCK=0;
}
RCK=1;
RCK=0;
}
void MatrixLED_Init()
{
SCK=0;
RCK=0;
}
matrixLED.h文章来源地址https://www.toymoban.com/news/detail-510222.html
#ifndef __MATRIX_LED_H_
#define __MATRIX_LED_H_
void MatrixLED_Init();
void MatrixLED_Showcolumn(unsigned char column , Data);
#endif
到了这里,关于【【51单片机实现LED点阵屏幕和动画显示】】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!