在 VS Code 中新建项目到烧录的过程:
新建项目
- 空项目
- 8位MCU项目
- 保存文件夹。SDCC
;更改烧录配置:stcgal
。src/main.c
,右键 项目资源
- 添加源文件夹
- 普通文件夹
,选择 src
。src
目录下开发,最后点击右上角 构建
、烧录
,单片机上电,完成烧录。8x8 LED 点阵屏和之前用的数码管很相似,通过交叉选择的方式来减少控制引脚,从 8 ⋅ 8 = 64 8\cdot 8=64 8⋅8=64,降到了 8 + 8 = 16 8+8=16 8+8=16 个引脚,比如控制第1行、第1列对应的引脚 A1、K1 分别为 高、低 电平,那么左上角的LED就会亮起。
单片机通过 IO 引脚来和外界交互,但是这些引脚比较有限,需要对引脚进行扩展,或者说把占用引脚数较多的设备通过一些方式减少引脚数量。
0000 0001
, 0000 0010
, 0000 0100
, 0000 1000
, 0001 0000
, 0010 0000
, 0100 0000
, 1000 0000
。这样就只需要 3 个二进制位,就足以表达 3 个状态( 2 3 = 8 2^3=8 23=8),这就是38译码器,比如在控制数码管的时候,其实并不需要让它们同时亮起,只需要反复扫描刷新,超过了人眼的刷新率,就可以让它看起来是同时亮起了。74HC595 是一个串转并模块,将接收到的串行信号,以并行的形式输出。不过它同样要占用单片机的 3 个引脚来实现这个效果。
找一个文字取模软件,设置长宽,然后在上面点出想要显示的内容即可。
把按列生成的16进制数组复制下来,粘贴到代码里面。
#include <8051.h>
#define RLCK P3_5
#define SRCLK P3_6
#define SER P3_4
unsigned char animate[] = {0x00,0x62,0x91,0x89,0x46,0x00,0x00,0x7E,0x01,0x02,0x00,0x2F,0x00,0x00,0x32,0x49,
0x51,0x3E,0x00,0x7F,0x08,0x10,0x1F,0x00,0x10,0x7F,0x11,0x00,0x00,0x1E,0x01,0x0E,
0x01,0x1E,0x00,0x00,0x2F,0x00,0x1F,0x08,0x10,0x0F,0x00,0x06,0x09,0x09,0x7E,0x01,
0x00,0x00,};
void Delay() //@11.0592MHz
{
unsigned char i;
i = 200;
while (--i);
}
void _74HC595(unsigned char data) {
for (int i = 0; i < 8; i++) {
SER = data & (0x80 >> i);
SRCLK = 0; // 产生上升沿,移位寄存器向下移位
SRCLK = 1;
}
RLCK = 0; // 产生上升沿,将寄存器的数据推到输出端
RLCK = 1;
}
void MatrixLED(unsigned char data, unsigned char column) {
_74HC595(data);
P0 = 0xFF ^ (1 << (7 - column));
Delay();
P0 = 0xFF;
}
void main() {
unsigned int cnt = 0, cnt2 = 0, offset = 5;
while (1) {
for (unsigned char i = 0; i < 8; i++)
MatrixLED(animate[(i + offset) % 50], i);
cnt++;
if (cnt > 20){
cnt = 0;
offset = (offset + 1) % 50;
}
}
}