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);
}
}