LED点阵显示汉字
- 1、字模
- 2、横向取模
1、字模
(1)如何记录组成字的LED点阵亮灭信息(16x16点阵一共有256点,显示一个特定的字需要其中有些点亮而另一些不亮,如何记录哪些点亮哪些点不亮?用字模)字模如何工作?256个点用256个二进制位表示,1表示这个点亮,0表示不亮。256个点就256个二进制位,也就是256/8=32个字节。所以一个大小为16*16的字的字模是32个字节大小。所以字模的表现形式就是32个unsigned char型数据。
(2)字模如何获取.一般都是用专门的字模提取软件去提取的:这种软件的作用就是给一1字就能自动得到这个字对应的32个字节的字模编码。
2、横向取模
显示“朱”。
(1)规律1:d1和d2用字模来填充,填充时要取反(因为是负极)
(2)规律2:d3和d4来选择哪一行被点亮,而d1和d2选择这行中哪个点被点亮
(3)规律3:shixu一次送16个LED的亮灭信息(2字节),所以必须调用shixu函数16次,才能把整个点阵全部点亮完毕。
#include <REGX51.H>
#define uchar unsigned char //宏定义,用uchar来代替unsigned char
sbit SER = P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟
void shixu (uchar d1,uchar d2,uchar d3,uchar d4)
{
unsigned char i;
SCLK = 0;
RCLK = 0;
for(i=0 ;i<=7 ;i++)
{
SER = d1 >> 7; //将d1的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d1 = d1 << 1; //将d1的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d2 >> 7; //将d2的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d2 = d2 << 1; //将d2的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d3 >> 7; //将d3的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d3 = d3 << 1; //将d3的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d4 >> 7; //将d4的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d4 = d4 << 1; //将d4的次高位移到最高位
}
RCLK = 0;
RCLK = 1;//进行锁存,全部并行同一时间输出
}
void main (void)
{
unsigned char zhu [32] = {128,0,136,0,136,0,248,31,
132,0,130,0,128,0,255,127,
192,1,160,2,144,4,136,8,
132,16,131,96,128,0,128,0};
//汉字朱的取模
shixu(~0,~128,0x00,0x01);//d3=0x00,d4=0x01表示显示第1行
shixu(~0,~136,0x00,0x02);//d3=0x00,d4=0x02表示显示第2行
shixu(~0,~136,0x00,0x04);
shixu(~31,~248,0x00,0x08);
shixu(~0,~132,0x00,0x10);
shixu(~0,~130,0x00,0x20);
shixu(~0,~128,0x00,0x40);
shixu(~127,~255,0x00,0x80);
shixu(~1,~192,0x01,0x00);
shixu(~2,~160,0x02,0x00);
shixu(~4,~144,0x04,0x00);
shixu(~8,~136,0x08,0x00);
shixu(~16,~132,0x10,0x00);
shixu(~96,~131,0x20,0x00);
shixu(~0,~128,0x40,0x00);
shixu(~0,~128,0x80,0x00);
}
代码的改进①:
#include <REGX51.H>
#define uchar unsigned char
sbit SER = P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟
void shixu (uchar d1,uchar d2,uchar d3,uchar d4)
{
unsigned char i;
SCLK = 0;
RCLK = 0;
for(i=0 ;i<=7 ;i++)
{
SER = d1 >> 7; //将d1的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d1 = d1 << 1; //将d1的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d2 >> 7; //将d2的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d2 = d2 << 1; //将d2的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d3 >> 7; //将d3的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d3 = d3 << 1; //将d3的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d4 >> 7; //将d4的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d4 = d4 << 1; //将d4的次高位移到最高位
}
RCLK = 0;
RCLK = 1;//进行锁存,全部并行同一时间输出
}
void main (void)
{
unsigned char zhu [32] = {128,0,136,0,136,0,248,31,
132,0,130,0,128,0,255,127,
192,1,160,2,144,4,136,8,
132,16,131,96,128,0,128,0};
unsigned char hang [8] = {0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80};
unsigned char j;
for(j=0 ;j<=15 ;++j)
{
if(j<8)
shixu(~zhu[j*2+1],~zhu[j*2],0x00,hang[j]);
else
shixu(~zhu[j*2+1],~zhu[j*2],hang[j-8],0x00);
}
}
代码改进②:
显示汉字“宝”
#include <REGX51.H>
#define uchar unsigned char
sbit SER = P3^4; //定义输入端
sbit RCLK = P3^5; //锁存时钟
sbit SCLK = P3^6; //移位时钟
void baga (uchar zimo[32],uchar hang[8]);
void shixu (uchar d1,uchar d2,uchar d3,uchar d4)
{
unsigned char i;
SCLK = 0;
RCLK = 0;
for(i=0 ;i<=7 ;i++)
{
SER = d1 >> 7; //将d1的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d1 = d1 << 1; //将d1的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d2 >> 7; //将d2的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d2 = d2 << 1; //将d2的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d3 >> 7; //将d3的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d3 = d3 << 1; //将d3的次高位移到最高位
}
for(i=0 ;i<=7 ;i++)
{
SER = d4 >> 7; //将d4的最高位赋值给SER
SCLK = 0;
SCLK = 1; //对SER引脚进行一次采样
d4 = d4 << 1; //将d4的次高位移到最高位
}
RCLK = 0;
RCLK = 1;//进行锁存,全部并行同一时间输出
}
void baga (uchar zimo[32],uchar hang[8])
{
unsigned char j;
for(j=0 ;j<=15 ;++j)
{
if(j<8)
shixu(~zimo[j*2+1],~zimo[j*2],0x00,hang[j]);
else
shixu(~zimo[j*2+1],~zimo[j*2],hang[j-8],0x00);
}
}
//定义八嘎函数
void main (void)
{
/*unsigned char zhu [32] = {128,0,136,0,136,0,248,31,
132,0,130,0,128,0,255,127,
192,1,160,2,144,4,136,8,
132,16,131,96,128,0,128,0};//朱字的字模
*/
uchar bao [32] = {64,0,128,0,254,127,2,64,
1,32,0,0,254,63,128,0,
128,0,128,0,252,31,128,0,
128,4,128,8,255,127,0,0};//宝字的字模
unsigned char hang [8] = {0x01,0x02,0x04,0x08,
0x10,0x20,0x40,0x80};
//baga(zhu,hang);
baga(bao,hang);//调用八嘎函数,进行显示
}