51单片机点阵和取字模软件的使用方法(显示心形图案)

在这里插入图片描述
点阵

首先来介绍一下8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置 1 电平,某一列置 0 电平,则相应的二极管就亮;
如要将第一个点点亮,则 1 脚接高电平 a 脚接低电平,则第一个点就亮了;如果
要将第一行点亮,则第 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些
引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第 a 脚接低电平,
而(1、2、3、4、5、6、7、8)接高电平,那么第一列就会点亮。由此可见,LED
点阵的使用也是非常简单的。如下图:
在这里插入图片描述
在这里插入图片描述
从上图中可以看出,该电路是集成的,电路中的 RE57~RE64 是 LED 点阵的第
1-8 列,通过 P0 IO 口控制。RE8~RE64 是 LED 点阵的第 1-8 行,通过 74HC595
进行控制。DPa-DPh 是 LED 点阵的 8 行控制管脚,通过动态数码管模块中的
74HC245 进行驱动,这些行的引出端子都是 LED 的阴极。

根据前面介绍我们知道,88LED 点阵共有 64 个 LED,如果仅使用单片机 IO
口来驱动可能效果不是很好,为了能够有效驱动 8
8LED 点阵且最大减少 IO 口的
占用,我们使用前面介绍的 74HC595 模块。74HC595 模块电路在前面已做介绍,
通过较少的 IO 口即可控制较为复杂的电路。

由于 74HC595 模块电路是集成的,所以使用单片机 P34~P36 管脚即可,
8X8LED 点阵模块电路也是集成的,所以列控制使用单片机 P0 管脚控制即可

如何显示自己心仪的图形

在这里我们要借助于取字模软件,借助这个软件我们可以轻松的得到控制显示图案的段码。点阵就是由64个led灯组成的,所以他的发光原理其实和数码管差不多。接下来就是取字模软件的使用。
1.下载取字模软件
在这里插入图片描述
2.打开软件后,首先选择“基本操作->新建图像”,设置图像的宽度和高度为 8,点击确定后将在显示窗口出现一个 8* 8 的白色格子,这个就类似于我们的 8*8LED 点阵了,具体操作如下:

在这里插入图片描述
3. 然后可以在这个 8*8 白色格子里面点击,点击后即会在对应位置出现一个黑点,表示在 LED 点阵对应位置显示,未点击位置(白色)表示 LED 点阵对应位置不显示。
在这里插入图片描述
参数设置》其他选项,具体操作如下
在这里插入图片描述
取模方式C51在这里插入图片描述
将生成的代码放入下面数组中

u8 ledduan[]={0x78,0xFC,0x7E,0x3F,0x3F,0x7E,0xFC,0x78};

/**************************************************************************************
*		              8*8LED点阵———显示数字实验												  *
实现现象:下载程序后点阵上显示数字0
			
注意事项:一定要将J24短接片短接到GND端。																				  
***************************************************************************************/

#include "reg51.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

u8 ledduan[]={0x78,0xFC,0x7E,0x3F,0x3F,0x7E,0xFC,0x78};
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}

/*******************************************************************************
* 函数名         : Hc595SendByte(u8 dat)
* 函数功能		   : 向74HC595发送一个字节的数据
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
	u8 a;
	SRCLK=0;
	RCLK=0;
	for(a=0;a<8;a++)
	{
		SER=dat>>7;
		dat<<=1;

		SRCLK=1;
		_nop_();
		_nop_();
		SRCLK=0;	
	}

	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{			
	u8 i;
	while(1)
	{
		P0=0x7f;
		for(i=0;i<8;i++)
		{
			P0=ledwei[i];		  //位选
			Hc595SendByte(ledduan[i]);	//发送段选数据
			delay(100);		   //延时
			Hc595SendByte(0x00);  //消隐
		}	
	}		
}

这里也需要了解译码器的知识,可以参考38译码器

热爱知识,传播学习!

  • 12
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
当然可以。以下是一个简单的C51单片机通过字模软件的LCD显示代码示例: ```c #include <reg52.h> // 引入STC89C52RC的头文件 #include <intrins.h> // 引入延时函数头文件 // 定义LCD引脚 sbit RS = P2^0; // RS引脚 sbit RW = P2^1; // RW引脚 sbit EN = P2^2; // EN引脚 sbit CS1 = P2^3; // 字模芯片1的CS引脚 sbit CS2 = P2^4; // 字模芯片2的CS引脚 // 定义字模芯片1的地址 #define Chip1_Addr 0xb8 // 定义字模芯片2的地址 #define Chip2_Addr 0xba // 定义延时函数,单位为微秒 void DelayUs(unsigned int n) { while(n--) { _nop_(); _nop_(); } } // 初始化LCD void InitLcd() { // 设置LCD为8位数据总线、2行16列、5x8点阵 LcdWriteCmd(0x38); // 关闭光标显示 LcdWriteCmd(0x0c); // 清屏 LcdWriteCmd(0x01); // 设置光标移动方向为向右 LcdWriteCmd(0x06); } // 写命令到LCD void LcdWriteCmd(unsigned char cmd) { RS = 0; // RS为0表示写入命令 RW = 0; // RW为0表示写入模式 P0 = cmd; // 将数据写入P0口 EN = 1; // 使能信号为1 DelayUs(5); // 延时5us EN = 0; // 使能信号为0 } // 写数据到LCD void LcdWriteData(unsigned char dat) { RS = 1; // RS为1表示写入数据 RW = 0; // RW为0表示写入模式 P0 = dat; // 将数据写入P0口 EN = 1; // 使能信号为1 DelayUs(5); // 延时5us EN = 0; // 使能信号为0 } // 在LCD上显示一个字符 void LcdShowChar(unsigned char x, unsigned char y, unsigned char c) { unsigned char addr; if(y == 0) // 第1行 { addr = 0x80 + x; // 计算地址 } else // 第2行 { addr = 0xc0 + x; // 计算地址 } LcdWriteCmd(addr); // 写入地址 LcdWriteData(c); // 写入字符 } // 在LCD上显示一个字符串 void LcdShowString(unsigned char x, unsigned char y, unsigned char *str) { while(*str) // 遍历字符串 { LcdShowChar(x, y, *str++); // 在LCD上显示字符 x++; // x坐标加1 } } // 在LCD上显示一个汉字 void LcdShowChinese(unsigned char x, unsigned char y, unsigned char *p) { unsigned char i; LcdWriteCmd(0x40); // 设置CGRAM地址 for(i = 0; i < 16; i++) // 写入汉字的16个字节 { LcdWriteData(p[i]); } LcdWriteCmd(0x80 + x); // 设置显示地址 LcdWriteData(0); // 写入汉字的第1个字节 LcdWriteData(0); // 写入汉字的第2个字节 for(i = 0; i < 16; i++) // 写入汉字的16个字节 { LcdWriteData(i + 1); } } // 在LCD上显示一幅图像 void LcdShowPicture(unsigned char x, unsigned char y, unsigned char *p, unsigned char chip) { unsigned char i, j, k; unsigned char addr, data; if(chip == 1) // 字模芯片1 { CS1 = 0; // 使能字模芯片1 CS2 = 1; // 禁用字模芯片2 addr = Chip1_Addr; // 设置字模芯片1的地址 } else // 字模芯片2 { CS1 = 1; // 禁用字模芯片1 CS2 = 0; // 使能字模芯片2 addr = Chip2_Addr; // 设置字模芯片2的地址 } for(i = 0; i < 8; i++) // 遍历8行 { LcdWriteCmd(0x80 + x); // 设置横坐标 LcdWriteCmd(0x40 + y + i); // 设置纵坐标 for(j = 0; j < 16; j++) // 遍历16列 { data = p[i * 16 + j]; // 出一个字节 for(k = 0; k < 8; k++) // 遍历8个像素 { if(data & 0x80) // 当前像素为1 { LcdWriteData(addr); // 写入字模芯片的地址 LcdWriteData(0xff); // 写入1 } else // 当前像素为0 { LcdWriteData(addr); // 写入字模芯片的地址 LcdWriteData(0x00); // 写入0 } data <<= 1; // 下一个像素 } } } } // 主函数 void main() { InitLcd(); // 初始化LCD LcdShowString(0, 0, "Hello, world!"); // 在LCD上显示字符串 DelayUs(5000); // 延时5ms LcdShowPicture(16, 1, "字模数据", 1); // 在LCD上显示图像 while(1) { // 此处添加你的程序代码 } } ``` 在上面的代码中,我们定义了一个`LcdWriteCmd()`函数和一个`LcdWriteData()`函数,分别用于向LCD写入命令和数据。我们还定义了`LcdShowChar()`函数、`LcdShowString()`函数、`LcdShowChinese()`函数和`LcdShowPicture()`函数,分别用于在LCD上显示一个字符、一个字符串、一个汉字和一幅图像。最后,在`main()`函数中调用这些函数,即可实现在LCD上显示内容的功能。 需要注意的是,以上代码中的`"字模数据"`是一个字符串,实际上应该是一个字模数组。字模数组是一个二维数组,每个元素代表一个像素点,通常使用字模软件生成。由于字模数据比较大,不方便直接定义在程序中,我们可以将它保存在外部文件中,然后使用SDCC编译器的--code-loc和--iram-size选项将字模数组指定到程序的合适地址。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值