用单片机驱动LED数码管有很多方法,按显示方式分,有静态显示和动态(扫描)显示,按译码方式可分硬件译码和软件译码之分。本实例用两片74LS164采用动态扫描的方法驱动两个7段数码管显示,如下图所示。因为74LS164没有数据锁存端,所以数据在传送过程中,数码管上有闪动现象,驱动的位数越多,闪动现象越明显。为了消除这种现象,可以在电路中增加一个PNP型的三极管来控制数码管的接地端,这样在数据传送过程中,关闭三极管使数码管断电而不显示,数据传送完后立刻使三极管导通。这种办法可驱动十几个74LS164显示而没有闪动现象。
本实例采用动态刷新方式在两个7段数码管上显示数字,P3.4用来控制741s164的清零端,用两个PNP三极管来控制数码管的通电,从而消除在传输数据的过程中数码管的显示抖动问题。
程序代码:
74ls164单片机编程(二)
单片机控制74LS164驱动数码管
利用74LS164驱动数码管,我们首先来弄清74LS164的工作方式,然后学习如何在自己板子上连接线路。
使用数码管时,要注意区分这两种不同的接法:共阴极和共阳极。共阴极时,为1则亮;共阳极时,为0则亮。
为了显示数字或字符,必须对数字或字符进行编码。七段数码管加上一个小数点,共计8段。这些段分别由字母a,b,c,d,e,f,g,dp来表示。当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。
比如共阴极的方式接数码管,显示“1”,则编码为0x3f,即00111111(dp g f e d c b a )。
静态显示程序如下:
/*-----------------------------------
功能:数码管 静态显示0-F
单片机:AT89S52
------------------------------------*/
#include “reg52.h”
#define uint unsigned int
#define uchar unsigned char
sbit DAT=P0^3;
sbit CLK=P0^2;
void sendbyte(uchar byte);
void delay(uint z);
uchar code tab[]={
0xed,0x09,0xbc,0x9d,0x59,0xd5,
0xf5,0x0d,0xfd,0xdd,0x7d,0xf1,
0xe4,0xb9,0xf4,0x74,0x00} ; //0-F, 全灭
/*========================
主函数
=========================*/
void main()
{
unsigned char h;
while(1)
{
for(h=0;h《17;h++)
{
delay(500); //延时大约是0.5s
sendbyte(h);
delay(500);
}
h=0;
}
}
/*====================================
用74LS164来输出一个8位的数据,
点亮数码管相应的管脚,以显示数字
=====================================*/
void sendbyte(uchar byte)
{
uchar num,c;
num=tab[byte];
for(c++=0;c《8;c++)
{
CLK=0;
DAT=num&0x01; //每一位的输出
CLK=1; //每一次上升沿,输出一位数据
num》》=1; //右移位赋值 ,以供下一位的输出
}
}
/*==============================
延时子程序
===============================*/
void delay(uint z)
{
uint x,y;
for(x=z;x》0;x--)
for(y=110;y》0;y--);
}
74ls164单片机编程(三)51单片机驱动74ls164跑马灯,好处是只用了2个端口即可实现,电路如下图所示:
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit dat=P2^6;
sbit clk=P2^7;
uchar ii;
uchar code seg7code[]=
{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0xff};//0-9,-,全灭
void sendbyte(uchar seg)
{
uchar num,c;
num=seg7code[seg];
for(c=0;c《8;c++)
{
dat=num&0x80;
num=_crol_(num,1);
clk=0;
clk=1;
}
}
void delayms(int ms)
{
uchar mi,mj;
for(;ms》0;ms--)
for(mi=6;mi》0;mi--)
for(mj=82;mj》0;mj--);
}
void main()
{
for(ii=0;ii《10;ii++)
{
sendbyte(ii);
delayms(200);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)