51单片机LED矩阵结合74HC595显示“I ♥ U”图案

主要是熟悉74HC595的使用,用来扩展I/O口;

开发板:STC89C51RC板

目的:循环显示 “I ♥ U”图案,当然有对象可以给对象看;没对象好基友也不错!

实验需要知道的知识:

        LED显示:正向导通时LED亮,反之灭;

        P0端口:当向端口写0时,经过锁存器的非端输出1,此时V2导通,输出低电平,外部电路以灌电流形式流入V2再流向地

                 

        74HC595芯片:内部电路图如下所示;RCLK与端口的锁存器相接,端口锁存器数据来源于移位寄存器的值,在RCLK上升沿,移位寄存器所有数据传入端口锁存器;                移位寄存器的值来源于SER串行输入端口,在SRCLK上升沿数据依次传入移位寄存器,并且前一个寄存器的值又作为后一个寄存器的值,所有从SER输入的数据依次后移;所以要正确读取输入数据应该等SER串行数据输入完成再将SRCLK拉高,一次性读取移位寄存器数据到端口。更详细参考:74HC595使用

                 

        文字图案的取模:网盘链接:  http://链接:https://pan.baidu.com/s/1EyrXcwKhBBNB8sicw59SbQ
提取码:1250

显示图像的思路:行扫描一次列扫描一次,扫描8次即可显示一个图案;然后间隔一定时间扫描下一个图案。

实现代码:

#include<reg52.h>
unsigned short Row[][8]={{0x00,0x81,0x81,0xFF,0xFF,0x81,0x81,0x00},                        
                        {0x1C,0x3E,0x7E,0xFC,0xFC,0x7E,0x3E,0x1C},
						{0x3E,0x7E,0xE0,0xC0,0xC0,0xE0,0x7E,0x3E}};			//I 爱(LED矩阵太小,用爱心替代)  U
sbit SRCL   =P3^6;
sbit RCL    =P3^5;
sbit Data_In=P3^4;
void delay_10us(unsigned short ten_us)
{
	while(ten_us--);	
}

void Input_Dat(unsigned short dat)			//往74HC595写入数据
{
	char i=0;
	RCL=0;
	for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
	{	
		SRCL=0;				
		Data_In=dat&(1<<0);//取末位		
		dat>>=1;//移位到末位
		SRCL=1;		//产生上升沿将数据传入移位寄存器
	}
	RCL=1;			//在数据全部传入移位寄存器后,只需要一个RCL上升沿就可将数据全部传入端口
}
void Prin(char i){						//显示出图案
	char n=0;
	unsigned short Low=0x7f;			//01111111,用于从P0最高位循环右移扫描列
	for(n=0;n<8;n++){
		Input_Dat(Row[i][n]);			//行扫描
		P0=Low;							//列扫描
		Low=(Low<<7)|(Low>>1);		//循环右移1位
		delay_10us(100);//延时一段时间,等待显示稳定
		P0=0xff;		//消影
		}
	}
int main(){
	char i=0;
	unsigned short tep=0;
	while(1){
			Prin(i);
			tep++;
		if(tep==150){		//控制显示多少次后更换图案
			i++;	
			tep=0;
		}
		if(i==3){			//图案循环开始
			i=0;
		}
	}
}

不足之处还请指出,谢谢! 

### 使用89C51单片机实现爱心形状点阵显示 #### 硬件设计 为了使8×8共阴极点阵屏能够正常工作并显示出预期的心形图案,硬件部分需搭建由89C51为核心的最小系统及其外围电路。这其中包括但不限于电源模块、晶振与时钟电路、复位电路等基本组成部分[^1]。 #### 软件编程逻辑 程序开发主要围绕着如何通过I/O端口向LED矩阵发送数据来形成特定图像展开。具体来说: - **初始化设置**:配置好定时器/计数器用于扫描刷新频率;设定P0~P3口中的一部分作为行选信号输出而另一些则负责列电平输入。 - **字模生成**:根据想要呈现的文字或图形(此处为心型),预先计算出对应二进制数值序列,即所谓的“字库”。对于本案例中的心形图样而言,可以采用如下定义方式: ```c unsigned char heart[]={ 0b00111100, 0b01111110, 0b11011011, 0b11111111, 0b11111111, 0b01111110, 0b00111100, 0b00011000}; ``` - **动态扫描算法**:由于静态驱动会消耗过多电流,在实际操作中通常采取逐行点亮的方法——每次只激活一行内的所有发光二极管,并快速循环遍历各行以营造视觉暂留效果。此过程中涉及到行列地址译码以及亮度调节等问题。 #### 完整代码实例 下面给出一段完整的C语言源文件,它实现了上述功能描述的功能: ```c #include<reg52.h> sbit ROW0=P2^0; // ...其余7个行线同理声明... void delay(unsigned int time){ while(time--) { } } void displayHeart(void){ for(int i=0;i<8;i++){ P0=~heart[i]; // 将当前行的数据反相送入列线上 switch(i){case 0:ROW0=0;break; /*...*/ case 7:ROW7=0;} delay(5); // 延时一段时间让该行稳定显示 switch(i){case 0:ROW0=1;break;/*...*/ case 7:ROW7=1;} // 关闭这一行 }} void main(){ EA=0; // 关中断 while (true) {displayHeart();} } ``` 请注意以上代码仅为示意性质,真实环境中还需要考虑更多细节优化如减少闪烁感、提高响应速度等方面的内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值