74ls164 动态驱动多位数码管.docx

上传人:b****7 文档编号:9624097 上传时间:2023-02-05 格式:DOCX 页数:16 大小:288.35KB
下载 相关 举报
74ls164 动态驱动多位数码管.docx_第1页
第1页 / 共16页
74ls164 动态驱动多位数码管.docx_第2页
第2页 / 共16页
74ls164 动态驱动多位数码管.docx_第3页
第3页 / 共16页
74ls164 动态驱动多位数码管.docx_第4页
第4页 / 共16页
74ls164 动态驱动多位数码管.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

74ls164 动态驱动多位数码管.docx

《74ls164 动态驱动多位数码管.docx》由会员分享,可在线阅读,更多相关《74ls164 动态驱动多位数码管.docx(16页珍藏版)》请在冰豆网上搜索。

74ls164 动态驱动多位数码管.docx

74ls164动态驱动多位数码管

74ls164能否动态驱动多位数码管

voiddisplay()//数码显示

{

SCON=0;//初始化串行口方式

SBUF=dispcode[ge];

while(!

TI);

TI=0;

led4=0;

delay

(2);

led4=1;

SBUF=dispcode[shi];

while(!

TI);

TI=0;

led3=0;

delay

(2);

led3=1;

SBUF=dispcode[bai];

while(!

TI);

TI=0;

led2=0;

delay

(2);

led2=1;

SBUF=dispcode[qian];

while(!

TI);

TI=0;

led1=0;

delay

(2);

led1=1;

SBUF=dispcode[wan];

while(!

TI);

TI=0;

led0=0;

delay

(2);

led0=1;

}

74ls164数码管驱动(第二个程序)

#defineclockPORTD.1

#definedatePORTD.0

#defineclock_enDDRD.1

#definedate_enDDRD.0

unsignedcharlab[2][10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,

0x02,0x9E,0x24,0x0C,0x98,0x48,0x40,0x1E,0x00,0x08};

voidsend(unsignedcharw)

{

unsignedchari;

for(i=0;i<8;i++)

{

clock=0;

date=w&1;

clock=1;

w=w>>1;

}

return;

}

voidxianshi(longw,unsignedcharweishu)

{

unsignedchari,j;

bitflag=0;

clock_en=1;

date_en=1;

if(w<0){flag=1;w=-w;}

for(i=0;i<8;i++)//8次循环

{

if(w!

=0)

{

if(i!

=weishu){j=lab[0][w%10];}

else{j=lab[1][w%10];}

}

if(w==0)

{if(i==0)j=0x03;//当数值直接是0

if(i<=weishu)

{

if(i

if(i==weishu)j=0x02;

}

else

{

if(flag)j=0xdf;//show负号

else{if(i!

=0)j=0xff;}//oxff就不显示

flag=0;

}

}

send(j);

w=w/10;//每显示一位,除10

}

return;

}

 

51单片机接74ls164驱动数码管的C程序

#include

sbitsclk=P2^0;

sbitsda=P2^1;

sbitslck=P2^2;

inttab[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

voiddelay()

{

inti,j;

for(i=0;i<255;i++)

for(j=0;j<80;j++);

}

voidbit_dat(biti)

{sclk=0;

sda=i;

sclk=1;

}

voiddat(chari)

{

slck=0;

bit_dat((bit)(tab[i]&0x80));

bit_dat((bit)(tab[i]&0x40));

bit_dat((bit)(tab[i]&0x20));

bit_dat((bit)(tab[i]&0x10));

bit_dat((bit)(tab[i]&0x08));

bit_dat((bit)(tab[i]&0x04));

bit_dat((bit)(tab[i]&0x02));

bit_dat((bit)(tab[i]&0x01));

slck=1;

}

main()

{inti;

while

(1)

{

for(i=0;i<10;i++)

{dat(i);

delay();

}

i=0;

}

}

程序如下:

/**************************************/

/*74LS164数码管动态显示*/

/**************************************/

//-------------------------------------库函数声明,管脚定义------------

#include

#defineucharunsignedchar

sbitsimuseri_CLK=P1^1;//用P1^1模拟串口时钟

sbitsimuseri_DATA=P1^0;//用P1^0模拟串口数据

sbita0=ACC^0;

unsignedcharcodedis_code[11]={0x28,0x7E,0xa2,0x62,//查表显示0,1、、9

0x74,0x61,0x21,0x7A,0x20,0x60,0x01};

ucharnumer,temp;

ucharge,shi;

//----------------------------------------------------------------------------

//函数名称:

out_simuseri

//输入参数:

data_buf

//输出参数:

//功能说明:

8位同步移位寄存器,将data_buf的数据逐位输出到simuseri_DATA

//----------------------------------------------------------------------------

voidout_simuseri(uchardata_buf)

{

uchari;

i=8;

ACC=data_buf;

do

{

simuseri_CLK=0;

simuseri_DATA=a0;

simuseri_CLK=1;

ACC=ACC>>1;

}

while(--i!

=0);

}

/************************************/

voiddelay(ucharms)//延时程序

{

uchari;

while(ms--)

{

for(i=0;i<125;i++);

}}

/***********************************/

voidmain()

{

ucharm;

while

(1)

{

for(temp=0;temp<99;temp++)

{

ge=temp/10;

shi=temp%10;

for(m=0;m<20;m++)//显示频率200ms加1次

{

P2_0=0;//位段码

numer=dis_code[ge];

out_simuseri(numer);//个位移位显示

delay(5);

P2_0=1;

P2_1=0;

numer=dis_code[shi];//十位移位

out_simuseri(numer);

delay(5);

P2_1=1;

}

m=0;

}

}

}

/****************************************/

*******************************************************************************

第二个程序

74HC164是个移位寄存器,以下程序是我用过的,绝对没问题:

其中ShowData为164数据脚,ShowClck为164时钟脚;

 

voidShow_164(unsignedchar_ShowValue)

{

unsignedcharCount0;

for(Count0=0;Count0<=7;Count0++)

{

if((_ShowValue&0x80)==0x80)

ShowData=1;

else

ShowData=0;

_ShowValue<<=1;

ShowClck=0;

_nop_();

_nop_();

ShowClck=1;

}

}

 

基于51单片机的简易数字频率计

要求使用定时/计数器1作定时用,定时1s;定时/计数器0作计数器用,被计数的外部脉冲从P3.4(T0)接入。

单片机将在1s内对脉冲计数并送四位数码管显示,最大计数显示值为0FFFFH。

求程序。

悬赏分:

30-解决时间:

2010-6-2722:

26

;===============================================

最佳答案:

这是个简易频率计,程序如下:

;---------------------------------

   ORG0000H

   JMPSTART

   ORG000BH

   JMPT0_INT

;---------------------------------

START:

   MOVTMOD,#51H      ;/*01010001T1计数,T0定时*/

   MOVTH0,#HIGH(65536-50000);50ms@12MHz

   MOVTL0,#LOW(65536-50000)

   MOVTH1,#0

   MOVTL1,#0

   SETBTR0

   SETBTR1

   SETBET0

   SETBEA

   MOVR7,#20

   SJMP$

;---------------------------------

T0_INT:

         ;50ms执行一次

   MOVTL0,#LOW(65536-50000);重新写入初始值

   MOVTH0,#HIGH(65536-50000);50ms@12MHz

   DJNZR7,T0_END

   MOVR7,#20

   MOVP1,TL1

   MOVP2,TH1

   MOVTL1,#0

   MOVTH1,#0

T0_END:

   RETI

;---------------------------------

END

 

外接74系列驱动电路就行,比如74LS164或74LS138。

动态扫描就是给各个数码管依次显示,任意时间只有一个数码管亮,但闪烁的太快了,人眼分辨不出,给人的感觉就是每个数码管都在亮。

一般过程就是赋值,开显示,延时,关显示,这是我以前写过的程序

#include

main()

{unsignedinti;

while

(1)

{P0=0x3f;//个位赋值

P1_0=0;//开显示

for(i=0;i<2;i++);//延时

P1_0=1;//关显示

P0=0x6;//十位

P1_1=0;

for(i=0;i<2;i++);

P1_1=1;

P0=0x5b;//百位

P1_2=0;

for(i=0;i<2;i++);

P1_2=1;

P0=0x4f;//千位

P1_3=0;

for(i=0;i<2;i++);

P1_3=1;}

}

这个是4位数码管,P0口接赋值端,P1口低四位接4个数码管的选通端,你要八个的话就把P1口的高四位再接到另外四个数码管的片选端,程序仿照就可以了

以下是共阳数码管简单程序;

p0口接abcdefg,P2口接s0,s1,s2......s7;

软件靠自己啦

如:

main:

movr1,#8;

movr0,#00h;

movr2,#0feh;

loop:

movp0,r0;送显示数据

incr0;

movp2,r2;选通要显示的数码管

lcalldelay;

mova,r2;

rla;

movr2,a;

djnzr1,loop;

ajmpmain;

delay:

movr7,#245;延时大约1ms

djnzr7,$;

ret

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1