8.点阵(点亮第一个和点亮0字符)

8.点阵(点亮第一个和点亮0字符),第1张

8.点阵点亮第一个和点亮0字符) 点阵原理

在开发板中,点阵模块和74HC595芯片连在一块,首先74HC595芯片是一个串转并芯片,可以有效减少I/O口使用,下面是它的原理图

通过在P34串行输入,QA到QH并行输出,例如P34输入0x80,则QH输出1,其他为0,再来看看点阵原理图

光看这个不知道怎么个亮法,所以来个更加明了的图

P0-P7控制列,其中第一列为P07控制,D0-D7控制行,其中D7控制第一行,所以,点亮第一个LED的话只需让D7为高电平(即为1),P07为0则可点亮,理论可行,开始实践,我一般是不看实验讲解,直接看原理讲解后再做,如果出问题的话再去参考。

点亮一个LED

前期代码

#include"reg52.h"

#define led P0
//#define leed P3^4

//typedef unsigned char u8;
//typedef unsigned int u16;

sbit Leed=P3^4;

main()
{
while(1)
{
	P3^4=0x80;
	led=0x00;
}
}

很遗憾,代码无法编译,然后提示说问题在P3^4=0x80上,开始我是写的leed定义,没用才改为直接引脚,仍然没有用,再看了一遍原理图后,发现74HC595芯片需要定义三个引脚,于是再次尝试。学习视频后在进行相应的编程后试试。

74h595芯片

以下为74h595芯片引脚图

当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在STCP 上升沿输出到并行端口(以上为这个芯片的使用说明)
1 .MR为主复位引脚,即为10引脚(SRCLR),如图所示,SRCLR上面有条杠表示电平有效,为了不复位所以接高电平,不然一直复位。 2
.OE为低电平,因为OE是使能端,必须有效芯片才能有用,所以置为低电平 3
.SHCP为11引脚,即为SRCLK,只有产生上升沿才会把数据传入移位寄存器中,且对8位数据,是一位一位的传,所以需加入循环 4
.STCP为12引脚,即为RCLK,只有上升沿有效,才会把移位寄存器内数据输出到并行输出口,前面两者都需要短暂延时。

代码部分
#include"reg51.h" //包含.h里的文件
#include"intrins.h"//调用_nop_()、循环左移、右移_crol_() _cror_() 需要用到此头文件

#define led P0

typedef unsigned char u8;
typedef unsigned int u16;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;//reg52.h头文件已对RCLK进行定义,所以上面头文件改为reg51.h
sbit SER=P3^4;

void delay(u16 i)
{
 	while(i--);
}

void Hc595sendbyte(u8 dat)	//形参,主函数传参到子函数可用
{
	u8 a;
	SRCLK=0;
    RCLK=0;
	for(a=0;a<8;a++)//传递8位,所以循环8次,依次传输,首先是最高位传输
	{
	 SER=dat>>7;//右移7位后最高位给SER口,例如10001000,右移七位后为1,把1赋予SER
	 dat<<=1; //左移一位,改变data参数的值后赋予data,把次高位提到最高位,末位加0,
	 SRCLK=1;//前面移位寄存器为0(即SRCLK为0,变为1后产生一个上升沿)
	 _nop_();//大约1us,
	 _nop_();
	 SRCLK=0;//再次拉低,下次循环才能够产生上升沿
	}
	RCLK=1;//输出到并行口
	_nop_();
	_nop_();
	RCLK=0;
}
main()
{
  while(1)
  {
  	Hc595sendbyte(0x80);//1000 0000
  	led=0x7f;//0111 1111
  }
  //return 0;  
}
点阵显示字符(0)

点阵显示字符的话,其实是采用动态扫描的方法,简而言之就是在人眼无法反应过来的时间内,让点阵内的灯进行亮灭,频率快的话就看到静态的亮灯,我是这么理解的。点阵显示字符即在原有一个基础上加上数组和循环,代码如下

#include"reg51.h" //包含.h里的文件
#include"intrins.h"//调用_nop_()、循环左移、右移_crol_() _cror_() 需要用到此头文件

#define led P0

typedef unsigned char u8;
typedef unsigned int u16;

u8 code table[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xf7};//列0-7
u8 code table1[]={0x00,0x00,0x3E,0x41,0x41,0x41,0x3E,0x00}; //行 0000 0000/0111 1110/0100 0010/0100 0010/0100 0010/0100 0010/0111 1110/0000 0000

sbit SRCLK=P3^6;
sbit RCLK=P3^5;//reg52.h头文件已对RCLK进行定义,所以上面头文件改为reg51.h
sbit SER=P3^4;

void delay(u16 i)
{
 	while(i--);
}

void Hc595sendbyte(u8 dat)	//形参,主函数传参到子函数可用
{
	u8 a;
	SRCLK=0;
    RCLK=0;
	for(a=0;a<8;a++)//传递8位,所以循环8次,依次传输,首先是最高位传输
	{
	 SER=dat>>7;//右移7位后最高位给SER口,例如10001000,右移七位后为1,把1赋予SER
	 dat<<=1; //左移一位,改变data参数的值后赋予data,把次高位提到最高位,末位加0,
	 SRCLK=1;//前面移位寄存器为0(即SRCLK为0,变为1后产生一个上升沿)
	 _nop_();//大约1us,
	 _nop_();
	 SRCLK=0;//再次拉低,下次循环才能够产生上升沿
	}
	RCLK=1;
	_nop_();
	_nop_();
	RCLK=0;
}

main()
{
  while(1)
  {
  u8 a;
  for(a=0;a<8;a++)
  {
   	led=table[a];
	Hc595sendbyte(table1[a]);
	delay(100);
	Hc595sendbyte(0x00);//消影很重要在这里,不消影就会很模糊,而且其他的也有点亮
  }
  }
  //return 0;  
}

然后说说消影作用,未消影前点阵屏上未点亮部分也模糊的亮,只是没点亮的那么亮,但是消影后,点阵就会格外清晰,原理是不进行消影的话,如代码所示,执行完Hc595sendbyte()函数后,输入输出口还保存上次数据,再次循环后,下次会把数据再次送给位选数据,虽然很短暂,但是下一行难免会留下残影,快速亮灭下,只是会比正常点亮的暗那么一点,所以消影必须得加。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5595182.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-15
下一篇2022-12-15

发表评论

登录后才能评论

评论列表(0条)

    保存