74ls164单片机编程汇总(跑马灯/驱动数码管)

控制/MCU

1813人已加入

描述

74ls164单片机编程(一):采用74LS164驱动LED数码管

用单片机驱动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);

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分