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);//调用八嘎函数,进行显示
	
}
相关推荐
嵌入式lover8 分钟前
STM32项目之环境空气质量检测系统软件设计
stm32·单片机·嵌入式硬件
小猿_0010 分钟前
C语言实现顺序表详解
c语言·开发语言
kenwblack1 小时前
STM32 SPI读取SD卡
stm32·单片机
Dola_Pan1 小时前
C语言:随机读写文件、实现文件复制功能
c语言·开发语言
佳心饼干-1 小时前
C语言-08复合类型-结构体
c语言·开发语言
兰_博1 小时前
51单片机驱动1602液晶显示
单片机·嵌入式硬件·51单片机
深圳市青牛科技实业有限公司 小芋圆1 小时前
开关电源特点、分类、工作方式
前端·科技·单片机·物联网·分类·数据挖掘·新能源
我qq不是451516522 小时前
单片机优先级
单片机·嵌入式硬件
F-2H2 小时前
C语言:指针3(函数指针与指针函数)
linux·c语言·开发语言·c++
相醉为友3 小时前
在开发嵌入式系统时,尤其是处理大数时,会遇到取值范围的问题。51单片机通常没有内建大整数支持,因此我们需要采用不同的方法来解决这一问题
单片机·嵌入式硬件·51单片机