
在开发板中,点阵模块和74HC595芯片连在一块,首先74HC595芯片是一个串转并芯片,可以有效减少I/O口使用,下面是它的原理图
通过在P34串行输入,QA到QH并行输出,例如P34输入0x80,则QH输出1,其他为0,再来看看点阵原理图
光看这个不知道怎么个亮法,所以来个更加明了的图
点亮一个LEDP0-P7控制列,其中第一列为P07控制,D0-D7控制行,其中D7控制第一行,所以,点亮第一个LED的话只需让D7为高电平(即为1),P07为0则可点亮,理论可行,开始实践,我一般是不看实验讲解,直接看原理讲解后再做,如果出问题的话再去参考。
前期代码
#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;
}
}
74h595芯片很遗憾,代码无法编译,然后提示说问题在P3^4=0x80上,开始我是写的leed定义,没用才改为直接引脚,仍然没有用,再看了一遍原理图后,发现74HC595芯片需要定义三个引脚,于是再次尝试。学习视频后在进行相应的编程后试试。
以下为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()函数后,输入输出口还保存上次数据,再次循环后,下次会把数据再次送给位选数据,虽然很短暂,但是下一行难免会留下残影,快速亮灭下,只是会比正常点亮的暗那么一点,所以消影必须得加。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)