一、何为字模
(1)如何记录组成字的LED点阵亮灭信息(16*16点阵一共有256点,显示一个特定的字需要其中有些点亮而另一些不亮,如何记录哪些点亮哪些点不亮?用字模)
字模如何工作?256个点用256个二进制位表示,1表示这个点亮,0表示不亮。256个点就是256个二进制位,也就是256/8=32个字节。所以一个大小为16*16的字的字模是32个字节大小。所以字模的表现形式就是32个unsigned char型数据。
(2)字模如何获取。一般都是用专门的字模提取软件去提取的。这种软件的作用就是给一个字就能自动得到这个字对应的32个字节的字模编码。
(3)字模的结果不是唯一的,和你提取字模的方式有关的。(横向纵向、从上到下之类区分)提取字模时是没有标准的,怎么做都是对的或者都是错的,关键是你提取字模的方式和你用来在点阵上显示这个字模的函数必须对应。
字模软件如下图:
可以看到c代码里面有个数组,数组编码是从D0-D7,横向取模的结果
一、横向取模函数
#include
#define uchar unsigned char //宏定义
sbit SER = P3^4;
sbit RCLK = P3^5;
sbit SCLK = P3^6;
//函数原型声明
void SendData (uchar d1,uchar d2, uchar d3, uchar d4);
void Display(uchar zimo[32],uchar hang[32]);
unsigned char peng[32] ={16,16,16,16,254,8,16,4,124,18,0,16,124,8,68,4,68,34,124,32,0,16,68,8,232,4,30,2,0,0,0,0};
unsigned char hang[32] =
{
0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08,
0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,
0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00,
0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00,
};
void main(void)
{ // d1 d2 对应负极(列), d3,d4对应正极(行)
// d1 d3 对应9-16, d2 d4对应的是1-8
// d1的bit7对应最右边一列,bit0对应第九列;
//d2的bit7对应第八列,bit0对应左边第一列;
//d3的bit7对应最下面一行,bit0对应第九行;
//d4的bit7对应第八行,bit0对应最上面一行;
Display(peng, hang);
}
//字模显示函数
void Display(uchar zimo[32],uchar hang[32])
{
uchar i = 0;
for(i = 0; i < 16 ; i++)
{
SendData(~zimo[2*i+1], ~zimo[2*i], hang[2*i], hang[2*i+1]);
/*取反的意义在于字模亮一颗表示1,而d1,d2表示
负极,0led小灯才会亮,故而1取反
*/
}
}
void SendData(uchar d1, uchar d2, uchar d3, uchar d4)
{
unsigned char i = 0; // unsigned char还可以用,和uchar是一样的
SCLK = 0;
RCLK = 0;
for (i=0; i<8; i++)
{
SER = d1 >> 7; // 将d1的最高bit取出来给SER
SCLK = 0;
SCLK = 1; // 2步制造了一个SCLK的上升沿
d1 = d1 << 1;
}
for (i=0; i<8; i++)
{
SER = d2 >> 7; // 将d2的最高bit取出来给SER
SCLK = 0;
SCLK = 1; // 2步制造了一个SCLK的上升沿
d2 = d2 << 1;
}
for (i=0; i<8; i++)
{
SER = d3 >> 7; // 将d3的最高bit取出来给SER
SCLK = 0;
SCLK = 1; // 2步制造了一个SCLK的上升沿
d3 = d3 << 1;
}
for (i=0; i<8; i++)
{
SER = d4 >> 7; // 将d4的最高bit取出来给SER
SCLK = 0;
SCLK = 1; // 2步制造了一个SCLK的上升沿
d4 = d4 << 1;
}
RCLK = 0;
RCLK = 1;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』