关于显示器的分辨率,像素,清晰度这些概念不再赘述
讲一下pitch这个比较陌生的概念:指的是两个像素点的圆心之间的距离,通常默认单位是毫米 例如:p10指的是间距10毫米的led点阵
LED的P00-P07是直接接在处理器上但是因为处理器针脚有限所以需要下面的74HC595(处理器使用3个引脚经过这个芯片产生8个并行的信号等效于使用了8个引脚)
J13如果跳线OE和GND HC595将无法工作也为没有电压 而跳线OE和VCC才可以工作
74HC595是一个移位寄存器74HC595是将串行信号转为并行信号 其中P34是处理器输入串行信号 P36是串行时钟 P35是工作时钟 然后经过这个芯片处理生成8个并行的信号 接在LED点阵的D0-D7上
这里这个芯片还可以控制一排LED是通过将图中的J14跳线帽连接后 LED一端为高电压另一端为HC595输出的8个串行的高低电压将LED点亮
void Hc595SendByte(u8 dat)
{
u8 i = 0, j = 0;
SCK = 0; // 将SCK置为初始状态
RCK = 0; // 将RCK置为初始状态
for (i=0; i<8; i++) //使用for循环将数字信号分8次发送出去也就是一个串行信号
{
SER = dat >> 7;
dat <<= 1;
SCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
SCK = 0;
}
RCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
}
LED点阵显示图像原理与数码管动态显示类似
首先选择出每个要点亮的LED像素点 然后反复循环刷新即可
链接:https://pan.baidu.com/s/1-RGR0v9WUH7LWmOaUTpSbQ
提取码:pmw2
这是字模提取软件 也就是帮你选择那些LED管需要去点亮
注意的是:要管理员身份运行
字模由光盘中:工具软件/88字模提取软件/LEDDOT V0.2.exe生成
注意取模软件菜单栏设置中,设置为:
字模显示方式:单行
字模提取方式:逐列
字模提取格式:C51格式
void main(void)
{
MatrixDisplay(gZhu);
}
void MatrixDisplay(u8 *zimo)
{
u8 i = 0;
while (1)
{
for(i=0;i<8;i++)
{
MATRIX_PORT = gLineCode[i]; // 位选
Hc595SendByte(zimo[i]); // 发送段选数据
Hc595SendByte(0x00); // 消隐
}
}
}
void Hc595SendByte(u8 dat)
{
u8 i = 0, j = 0;
SCK = 0; // 将SCK置为初始状态
RCK = 0; // 将RCK置为初始状态
for (i=0; i<8; i++)
{
SER = dat & (0x01);
dat >>= 1;
SCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
SCK = 0;
}
RCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
}
/*
// 由于取模软件只能选择横向纵向,但是不能选择纵向从上向下还是从下向上
// 实际测试取模软件的模式,适合先发LSB而不是MSB
void Hc595SendByte(u8 dat)
{
u8 i = 0, j = 0;
SCK = 0; // 将SCK置为初始状态
RCK = 0; // 将RCK置为初始状态
for (i=0; i<8; i++)
{
SER = dat >> 7;
dat <<= 1;
SCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
SCK = 0;
}
这里和前面发送串行码的顺序不同 这个需要实际测试 因为这个顺序可能导致LED现实的字是反的
**********************************************************************
* 头文件包含
**********************************************************************
*/
#include
#include
/*
**********************************************************************
* 本地宏定义
**********************************************************************
*/
typedef unsigned char u8; // 重命名类型u8简化代码编写
typedef unsigned int u16;
#define MATRIX_PORT P0 // 点阵LED负极端口
/*
**********************************************************************
* 本地全局变量
**********************************************************************
*/
sbit SCK = P3^6; // SCK上升沿移位
sbit RCK = P3^5; // RCK上升沿串行输出寄存器锁存
sbit SER = P3^4; // SER引脚送字节数据进去
// 点阵列选值,数组每个元素的值选中其中一列
u8 gLineCode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/* 字模
* 字模由光盘中:工具软件/88字模提取软件/LEDDOT V0.2.exe生成
* 注意取模软件菜单栏设置中,设置为:
* 字模显示方式:单行
* 字模提取方式:逐列
* 字模提取格式:C51格式
*/
u8 gZhu[] = {0x73,0xD6,0x58,0xFF,0x58,0x54,0x52,0x12}; // 汉字 朱
u8 gSi[] = {0x0,0x4,0x1C,0x24,0x7E,0x4,0x0,0x0}; // 数字 4
u8 gK[] = {0x0,0x0,0x7E,0x38,0x66,0x0,0x0,0x0}; // 字模 K
/*
**********************************************************************
* 函数原型声明
**********************************************************************
*/
void Hc595SendByte(u8 dat);
void MatrixDisplay(u8 *zimo);
/*********************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 参数列表 : 无
* 函数输出 : 无
*********************************************************************/
void main(void)
{
MatrixDisplay(gZhu);
}
/*********************************************************************
* 函 数 名 : MatrixDisplay
* 函数功能 : 循环刷新显示字模到点阵上
* 参数列表 : zimo - 待显示的字模数组
* 函数输出 : 无
*********************************************************************/
void MatrixDisplay(u8 *zimo)
{
u8 i = 0;
while (1)
{
for(i=0;i<8;i++)
{
MATRIX_PORT = gLineCode[i]; // 位选
Hc595SendByte(zimo[i]); // 发送段选数据
Hc595SendByte(0x00); // 消隐
}
}
}
/*********************************************************************
* 函 数 名 : Hc595SendByte
* 函数功能 : 通过74HC595串行移位发送一个字节出去
* 参数列表 : dat - 待发送的字节数据
* 函数输出 : 无
*********************************************************************/
void Hc595SendByte(u8 dat)
{
u8 i = 0, j = 0;
SCK = 0; // 将SCK置为初始状态
RCK = 0; // 将RCK置为初始状态
for (i=0; i<8; i++)
{
SER = dat & (0x01);
dat >>= 1;
SCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
SCK = 0;
}
RCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
}
/*
// 由于取模软件只能选择横向纵向,但是不能选择纵向从上向下还是从下向上
// 实际测试取模软件的模式,适合先发LSB而不是MSB
void Hc595SendByte(u8 dat)
{
u8 i = 0, j = 0;
SCK = 0; // 将SCK置为初始状态
RCK = 0; // 将RCK置为初始状态
for (i=0; i<8; i++)
{
SER = dat >> 7;
dat <<= 1;
SCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
SCK = 0;
}
RCK = 1;
j++; // 延时代码,等同于nop指令
j++; // 延时代码,等同于nop指令
}
*/