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);//调用八嘎函数,进行显示
	
}
相关推荐
LDR0065 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
✎ ﹏梦醒͜ღ҉繁华落℘5 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
Luminous.5 天前
C语言--day30
c语言·开发语言
玖玥拾5 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
謓泽5 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
不会C语言的男孩5 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
u152109648495 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd8451015005 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼5 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
2601_951643885 天前
C语言长文整理,关键字和数据类型
c语言·数据类型·关键字·嵌入式开发·格式化输出