seo做网站,郑州巩义网站建设,北京官网优化公司,百姓网招聘信息1. 显示原理 LED点阵屏与数码管类似#xff0c;只是将数码管每一列的像素以8字型排列 与数码管一样#xff0c;有共阴和共阳两种接法#xff0c;不同接法对应电路结构不同 LED点阵需要逐行或逐列扫描#xff0c;才能使所有LED同时显示 2. 74HC595电路图原理 看OE#x…1. 显示原理 LED点阵屏与数码管类似只是将数码管每一列的像素以8字型排列 与数码管一样有共阴和共阳两种接法不同接法对应电路结构不同 LED点阵需要逐行或逐列扫描才能使所有LED同时显示 2. 74HC595电路图原理 看OE是低电平有效所以要弄一下J24这个接线帽 RCLKRegister Clock SRCLRSerial 串行清零端 SRCLK串行时钟 SER串行数据
74HC595是串行输入并行输出的移位寄存器用3根线输入串行数据8根线输出并行数据多片级联可以输出16、24、32位等常用于IO口扩展 数据通过SER一位一位地进来上升沿移位SERCLK脉冲来一次就SER写一次数据最后经上升沿锁存RCLK将数据从左侧挪到右侧。
弹匣装弹霰弹枪出来的原理
扩展多位的原理如下 第一片板子SER里面的数据满了就经过线送到下一片板子里SERCLK和RCLK接在同一个位置。这样可以形成多片级联形成更多位的输出。
3. 单片机
单片机输出端口是弱上拉的给1的时候电流小给0的时候VCC流回负极电流更大如果想要将点阵直接接在单片机的端口上是不可行的需要加一个三极管三极管作为放大电路使用。
4. 74HC595的使用
江科大使用的单片机上74HC595模块是有接LED灯以观察输出情况的我买的普中板子上没有所以只是按照看视频的理解写了相应的函数。
#include REGX52.H// 重新命名会更清晰一些要不然容易不清楚每个口的具体含义
// P3^X这不是异或的意思这样的形式表示选中P3的第5位
sbit RClK P3^5; // 上升沿锁存置1时将SER的内容全部写入输出口
sbit SRCLK P3^6; // 上升沿移位置1时写入SER的内容
sbit SER P3^4;void _74HC595_WriteByte(unsigned char byteData)
{unsigned char i 0;for (i 0; i 8; i){SER byteData (0x80 i); // 通过这种方式取出第i位// byteData 0x80相当于选出最高位的数据结果要么是1000 0000要么是0000 0000// 因为SER的类型是sbit所以要么为1要么为0// 如果结果1000 0000SER就会被置为1// 如果结果0000 0000SER就会被置为0// SRCLK原本为0置1给一个电平写入然后置0SRCLK 1; SRCLK 0;}// RClK原本为0置1给一个电平统一转移数字然后置0RClK 1;RClK 0;
}void main()
{SRCLK 0; // 初始置0后面才更容易给电平RClK 0; // 初始置0后面才更容易给电平while(1){}
}5. 点阵屏的显示
在4中函数的基础上选中列后再对行进行选中就可以实现点阵屏显示
#include REGX52.H
#include Delay.h// 重新命名会更清晰一些要不然容易不清楚每个口的具体含义
// P3^X这不是异或的意思这样的形式表示选中P3的第5位
sbit RClK P3^5; // 上升沿锁存置1时将SER的内容全部写入输出口
sbit SRCLK P3^6; // 上升沿移位置1时写入SER的内容
sbit SER P3^4;void _74HC595_WriteByte(unsigned char byteData)
{unsigned char i 0;for (i 0; i 8; i){SER byteData (0x80 i); // 通过这种方式取出第i位// byteData 0x80相当于选出最高位的数据结果要么是1000 0000要么是0000 0000// 因为SER的类型是sbit所以要么为1要么为0// 如果结果1000 0000SER就会被置为1// 如果结果0000 0000SER就会被置为0// SRCLK原本为0置1给一个电平写入然后置0SRCLK 1; SRCLK 0;}// RClK原本为0置1给一个电平统一转移数字然后置0RClK 1;RClK 0;
}void MatrixLED_ShowColumn(unsigned char column, byteData)
{_74HC595_WriteByte(byteData); // 选中列P0 ~(0x80) column; // 选中指定行给低电平点灯column表示点亮第几行做一个右移// 避免显示下一个的时候出现残影Delay后置灭Delay(1);P0 0xFF;
}void main()
{SRCLK 0; // 初始置0后面才更容易给电平RClK 0; // 初始置0后面才更容易给电平MatrixLED_ShowColumn(7,0xAA);while(1){ }
}对于为什么要Delay和置灭是因为这通常是一个
段选→位选→段选→位选→…的过程
这会导致一个问题在执行第三个段选的时候上一次的位选还没改变从而导致上一次的位选和下一次的段选结合呈现错误的结果/残影所以正确的是
段选→位选→延时→位清零→段选→位选→…的过程
6. 矩阵LED屏显示自定义图案
有了上面的基础显示笑脸就很简单了用EXCEL画出需要亮灯的部分 第一列0011 1100 → 3C
第二列0100 0010 → 42
第三列1010 1001 → A9
第四列1000 0101 → 85
第五列1000 0101 → 85
第六列1010 1001 → A9
第七列0100 0010 → 42
第八列0011 1100 → 3C
主函数修改为
void main()
{SRCLK 0; // 初始置0后面才更容易给电平RClK 0; // 初始置0后面才更容易给电平while(1){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);}
}效果如下长曝光 类似的如果是一个爱心 第一列0001 1000 → 18
第二列0010 0100 → 24
第三列0100 0010 → 42
第四列0010 0001 → 21
第五列0010 0001 → 21
第六列0100 0010 → 42
第七列0010 0100 → 24
第八列0001 1000 → 18
主函数修改为
void main()
{SRCLK 0; // 初始置0后面才更容易给电平RClK 0; // 初始置0后面才更容易给电平while(1){MatrixLED_ShowColumn(0, 0x18);MatrixLED_ShowColumn(1, 0x24);MatrixLED_ShowColumn(2, 0x42);MatrixLED_ShowColumn(3, 0x21);MatrixLED_ShowColumn(4, 0x21);MatrixLED_ShowColumn(5, 0x42);MatrixLED_ShowColumn(6, 0x24);MatrixLED_ShowColumn(7, 0x18);}
}效果如下长曝光 7. 矩阵LED屏显示动画
我们的LED一共是8列显示动画的原理实际上是将每列要显示内容组成一个数组然后每次显示其中8列例如第一次显示数组的0-7第二次显示数组的1-8以此类推。
具体显示的字符动画可以利用字模提取软件获得对应的结果使用步骤如下
第一步新建图像高度为8开发板上的高度宽度选择对应字符长度 第二步模拟动画里放大格点 第三步绘制格点 第四步生成点阵 接下来就可以写代码实际上就是用循环来遍历上面的这些内容
#include REGX52.H
#include MatrixLED.h
#include Delay.hunsigned char Animation[] {0x00,0x00,0x00,0x00,0x00,0xFF,0x81,0x42,0x3C,0x00,0x0C,0x12,0x12,0x0E,0x01,0x00,0xFF,0x81,0x42,0x3C,0x00,0x0C,0x12,0x12,0x0E,0x01,0x00,0xFD,0x00,0x00,0x00,0x00,
}; // 字符提取软件生成void main()
{unsigned int i 0, offset 0, count 0; Init_Matrix_LED();while(1){for (i 0; i 8; i) // for循环8位循环显示{MatrixLED_ShowColumn(i, Animation[ioffset]); // offset表示数组中的便宜}// count这里实际上起到一个控制速度的作用大于号后面的数字越大则动的越慢count;if (count 10){count 0;offset; // 增加偏移量if (offset 24) offset 0; // 偏移量到临界时需要重置避免乱码}}
}这里控制速度不能用Delay用Delay的话点阵屏上的结果会消失这应该是我们的点亮函数会置0导致的。
效果如下 附上MatrixLED的内容
MatrixLED.c
#include REGX52.H
#include Delay.h// 重新命名会更清晰一些要不然容易不清楚每个口的具体含义
// P3^X这不是异或的意思这样的形式表示选中P3的第5位
sbit RClK P3^5; // 上升沿锁存置1时将SER的内容全部写入输出口
sbit SRCLK P3^6; // 上升沿移位置1时写入SER的内容
sbit SER P3^4;#define MATRIX_LED_PORT P0/*** brief 矩阵LED初始化* param 无* retval 无*/
void Init_Matrix_LED()
{SRCLK 0; // 初始置0后面才更容易给电平RClK 0; // 初始置0后面才更容易给电平
}/*** brief 74HC595 写入一个字节* param 要写入的字节* retval 无*/
void _74HC595_WriteByte(unsigned char byteData)
{unsigned char i 0;for (i 0; i 8; i){SER byteData (0x80 i); // 通过这种方式取出第i位// byteData 0x80相当于选出最高位的数据结果要么是1000 0000要么是0000 0000// 因为SER的类型是sbit所以要么为1要么为0// 如果结果1000 0000SER就会被置为1// 如果结果0000 0000SER就会被置为0// SRCLK原本为0置1给一个电平写入然后置0SRCLK 1; SRCLK 0;}// RClK原本为0置1给一个电平统一转移数字然后置0RClK 1;RClK 0;
}/*** brief LED点阵屏显示一列数据* param * retval*/
void MatrixLED_ShowColumn(unsigned char column, byteData)
{_74HC595_WriteByte(byteData); // 选中列MATRIX_LED_PORT ~(0x80) column; // 选中指定行给低电平点灯column表示点亮第几行做一个右移// 避免显示下一个的时候出现残影Delay后置灭Delay(1);MATRIX_LED_PORT 0xFF;
}MatrixLED.h
#ifndef __MATRIXLED_H__
#define __MATRIXLED_H__void Init_Matrix_LED();
void _74HC595_WriteByte(unsigned char byteData);
void MatrixLED_ShowColumn(unsigned char column, byteData);#endifDelay.c
#include INTRINS.Hvoid Delay(unsigned int ms) //11.0592MHz
{unsigned char i, j;while (ms){_nop_();i 2;j 199;do{while (--j);} while (--i);ms--;}
}Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int ms);#endif