【51单片机系列】文字取模软件使用
软件链接:https://pan.baidu.com/s/1k-ND9vJReW_KHMWx8uwpcQ?pwd=gz8w
提取码:gz8w
1. 软件介绍
双击打开软件,选择【基本操作】->【新建图像】,设置图像的宽度和高度为8。点击确定后将在显示窗口出现一个8x8的白色格子,类似于8x8LED点阵。
在这个8x8白色格子里点击,点击后会在对应位置出现一个黑点,表示在LED点阵对应位置显示,未点击表示LED点阵对应位置不显示,如果点错了,再次点击即可。图像如果太小可以点击【模拟动画】->【放大格点】就可以放大
比如,如果要在8x8LED点阵上显示数字0,可以在白色框内通过点击对应位置描述出一个0的外形。
设置取模数据的取模方式,如下。需要注意这里的取模方式是纵向取模还是横向取模,软件中对此解释如下。
1。当您输入完文字后,可以按Ctrl+Enter表示您想结束文字的输入,但由于要对每个文字单
独取模,在把文字转化为图像的处理方法上有所不同,具体说来是如果您要横向取模的话则
把输入的文字纵向排列成图像而纵向取模的话则把输入的文字横向排列成图像;
2。新建图像和调入图像时,如果横向或纵向尺寸不是8的倍数,则相应的根据您选的横向取
模或纵向取模来扩展,具体的说,纵向取模时则对图像的高度扩展,横向取模时则对图像的
宽度扩展。
点击【修改图像】->【图像左右调换】,在显示区,数字0的显示就变成左右调换后的结果。
点击【取模方式】,选择【C51格式】,在点阵生成区自动会生成数字字符对应的数据。
然后可以复制所生成的数据到程序内定义的数组中,如下所示:
u8 ledduan[] = {0x00,0x7E,0x81,0x81,0x81,0x81,0x7E,0x00}; // 类似于数码管的段选
2. 使用示例
为方便,这里直接使用51单片机的I/O口来驱动,proteus中设计如下,
- 创建四个8x8LED点阵,2个红色点阵,2个绿色点阵。
- 红色点阵接口控制是上列下行,绿色点阵接口控制是上行下列,电流通过方向均为列->行,接口从左到右控制第一行到最后一行或第一列到最后一列;
- P0口和P1口分别控制红色点阵的列和行,P2口和P3口分别控制绿色点阵的列和行;
- 左侧两个点阵接口从左到右的字节顺序为bit7->bit0,右侧两个点阵接口从左到右的字节顺序为bit0->bit7。
软件设计1,按列扫描,根据行的数据判断哪些灯亮。使用文字取模软件对数字0取模得到的数据如下,上图左侧两个点阵设计与得到的数据是不匹配的一点是上图按照列1行0灯亮的方式,所以需要对得到的数据取反。
代码如下:
/*
实现功能:文字取模软件使用示例
[2023-12-16] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "typedef.h"
#define MATRIX_R_COL P0
#define MATRIX_R_ROW P1
#define MATRIX_G_COL P2
#define MATRIX_G_ROW P3
// 延时函数,i=1时延时10us
void Delay(u16 i)
{
while(i--);
}
// 依次扫描列,根据行的数据确定点亮哪些LED,从第一列开始扫描
void LEDMatrix()
{
u8 i;
u8 col = 0x80;
u8 code row[] = {0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00};
for(i=0;i<8;i++)
{
MATRIX_R_COL = col;
MATRIX_R_ROW = ~row[i];
MATRIX_G_COL = col;
MATRIX_G_ROW = ~row[i];
Delay(100);
col = _cror_(col, 1);
}
}
void main()
{
MATRIX_R_COL = 0x00;
MATRIX_R_ROW = 0xff;
MATRIX_G_COL = 0x00;
MATRIX_G_ROW = 0xff;
while(1)
{
LEDMatrix();
}
}
仿真结果如下:
软件设计2,按照行扫描,根据列的数据判断哪些灯亮,使用文字取模软件对数字0取模得到的数据如下。不选择字节倒序时,设计图中的左侧两个点阵符合如下设计要求;选择字节倒序时,设计图中的右侧两个点阵符合如下设计要求。
代码如下:
/*
实现功能:文字取模软件使用示例
[2023-12-16] zoya
*/
#include "reg52.h"
#include "intrins.h"
#include "typedef.h"
#define MATRIX_R_COL P0
#define MATRIX_R_ROW P1
#define MATRIX_G_COL P2
#define MATRIX_G_ROW P3
// 延时函数,i=1时延时10us
void Delay(u16 i)
{
while(i--);
}
// 依次扫描行,根据列的数据确定点亮哪些LED,从第一行开始扫描
void LEDMatrix1()
{
u8 i;
u8 row = 0x7f;
u8 code col[] = {0x1C,0x22,0x22,0x22,0x22,0x22,0x1C,0x00};
for(i=0;i<8;i++)
{
MATRIX_R_COL = col[i];
MATRIX_R_ROW = row;
MATRIX_G_COL = col[i];
MATRIX_G_ROW = row;
Delay(100);
row = _cror_(row, 1);
}
}
void main()
{
MATRIX_R_COL = 0x00;
MATRIX_R_ROW = 0xff;
MATRIX_G_COL = 0x00;
MATRIX_G_ROW = 0xff;
while(1)
{
LEDMatrix1();
}
}
仿真结果如下:
3. 使用总结
- 取模方式中,如果选择横向取模,表示逐行扫描,根据列的数据判断哪些灯亮;如果选择纵向取模,表示逐列扫描,根据行的数据判断哪些灯亮。即 选择横向取模得到的数据是列控制的数据,选择纵向取模得到的数据是行控制的数据。
- 取模方式中,如果选择横向取模,表示电流通过方向为列->行;如果选择总线取模,表示电流通过方向为行->列。即 选择横向取模电流方向为列1行0,选择纵向取模电流方向为行1列0。
- 正常字节顺序从左到右为bit7-bit0,如果选择了字节倒序,表示从左到右字节顺序为bit0-bit7。