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);//调用八嘎函数,进行显示
	
}
相关推荐
DevinLGT28 分钟前
6Pin Type-C Pin脚定义:【图文讲解】
人工智能·单片机·嵌入式硬件
lb363636363632 分钟前
整数储存形式(c基础)
c语言·开发语言
浪里个浪的102443 分钟前
【C语言】从3x5矩阵计算前三行平均值并扩展到4x5矩阵
c语言·开发语言·矩阵
<但凡.1 小时前
编程之路,从0开始:知识补充篇
c语言·数据结构·算法
小A1591 小时前
STM32完全学习——系统时钟设置
stm32·嵌入式硬件·学习
f狐0狸x1 小时前
【数据结构副本篇】顺序表 链表OJ
c语言·数据结构·算法·链表
CoderBob2 小时前
【EmbeddedGUI】脏矩阵设计说明
c语言·单片机
浪里个浪的10242 小时前
【C语言】计算3x3矩阵每行的最大值并存入第四列
c语言·开发语言·矩阵
敲敲敲-敲代码2 小时前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏
simple_ssn3 小时前
【C语言刷力扣】1502.判断能否形成等差数列
c语言·算法·leetcode