10:LED点阵显示汉字

LED点阵显示汉字

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次,才能把整个点阵全部点亮完毕。

c 复制代码
#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);												 
												
}

代码的改进①:

c 复制代码
#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);
	}
}

代码改进②:

显示汉字"宝"

c 复制代码
#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);//调用八嘎函数,进行显示
	
}
相关推荐
Bona Sun4 分钟前
单片机手搓掌上游戏机(十二)—esp8266运行gameboy模拟器之编译上传
c语言·c++·单片机·游戏机
恒锐丰小吕2 小时前
晶准 RB302B 内置MOSFET锂电池保护芯片技术解析
嵌入式硬件·硬件工程
星期天22 小时前
3.2联合体和枚举enum,还有动态内存malloc,free,calloc,realloc
c语言·开发语言·算法·联合体·动态内存·初学者入门·枚举enum
TangDuoduo00052 小时前
【电感基础与特性】
stm32·单片机·嵌入式硬件
许商2 小时前
【stm32】【SD】SDIO fatfs
stm32·单片机·嵌入式硬件
自信150413057592 小时前
初学者小白复盘23之——联合与枚举
c语言·1024程序员节
就是蠢啊2 小时前
51单片机——独立按钮、矩阵按键
单片机·嵌入式硬件·51单片机
云山工作室3 小时前
多传感器融合的办公室智能门禁系统(论文+源码)
stm32·单片机·嵌入式硬件·物联网·毕业设计·课程设计
秃秃秃秃哇3 小时前
C语言实现循环链表demo
linux·c语言·链表
天天爱吃肉82184 小时前
智能网联汽车信息安全深度解析:从UN-R155与GB44495标准到OBD/UDS技术实践
网络·嵌入式硬件·汽车