历史上的今天
今天是:2025年03月13日(星期四)
2020年03月13日 | 51单片机【五】LED点阵屏
2020-03-13 来源:eefocus
关于显示器的分辨率,像素,清晰度这些概念不再赘述
讲一下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指令 }
下一篇:单片机之LED点阵
史海拾趣
|
用热电偶测温,经单片机pid调节,触发固态继电器实现线性升温 但当电网电压变化时,升温曲线不稳定,很不线性 原因到底出在哪里呢,高次谐波?继电器?pid参数?还是其它因素,希望大家各抒己见,十分希望能得到各位的帮助,谢谢!… 查看全部问答> |
|
FPGA验证一个UART控制器,加载之后,不能全部发送数据,什么原因引起的?如何解决? 设计了一个UART控制器,Modelsim前仿真后仿真都正确,但是加载到板子上的FPGA之后,通过PC上的串口调试程序进行数据的发送和接受,串口调试程序发送过来的数据,FPGA都能全部正确接受,但是FPGA却不能把全部数据发送回PC上的串口调试程序,一共发送 ...… 查看全部问答> |
|
急...三星6410 nboot 失敗.. 連debug prot 都無回應! 如題:三星6410 nboot 失敗.. 連debug prot 都無回應! 測量flash 信號都有動作 僅在第一次.. 而後 整個板子 都無回應了.. >< 現在真的不知要怎麼辦了.. 上頭要求在十二月份要出來送樣了!! 請求 有人幫忙嗎?… 查看全部问答> |
|
WinCE 系统下WinCE 自导recorder.exe 文件录音功能无法实现 WinCE 系统下WinCE 自导recorder.exe 文件录音功能无法实现。 问题描述如下 WinCE系统能够启动,我在NK里面添加了一个MP3文件,(把mp3文件编译到内核)能播放,说明音频驱动加载成功,耳机的输出口硬件也没有问题,可是打开那个recorder文件的时 ...… 查看全部问答> |
|
#include <msp430x54x.h> #define SDA_1 P3OUT |= BIT7 //SDA = 1#define SDA_0 ...… 查看全部问答> |
|
如题,本人菜鸟,专业不是测控或者传感器,今年考上了农业机械化的研究生,导师给我一个任务就是寻找可以测量种子的具体位置的技术或者装置。 我有过的一些想法: 1、类似蝙蝠或者海 ...… 查看全部问答> |




