求单片机驱动74hc164,四位7段数码管显示的C语言程序!

求单片机驱动74hc164,四位7段数码管显示的C语言程序!,第1张

这个是一个四位数字串行显示的定时器,按键可设定,在实际电路上调试羡颂过

#include <REG51.H>

#define uchar unsigned char

#define uint unsigned int

uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,

0xb6,0xbe,0xe0,0xfe,0xf6,0x0}//段码根据实际情况自编

sbit k1=P2^0//定义加加

sbit k2=P2^1//定义减减

sbit CLK=P3^6//164模拟时钟端

sbit DAT=P3^7//164模拟数据

uint z

void delay(uint t)//延时函数

{

uint x,y

for(x=tx>0x--)

for(y=120y>0y--)

}

void sendbyte(uint b)//传送显丛仿示字节函数

{

uchar num,c

num=table[b%10]//个位

for(c=0c<8c++)//依渗派纤次传送8位

{

CLK=0

DAT=num&0x01

CLK=1

num>>=1

}

num=table[b%100/10]//十位

for(c=0c<8c++)//依次传送8位

{

CLK=0

DAT=num&0x01

CLK=1

num>>=1

}

num=table[b%1000/100]//百位

for(c=0c<8c++)//依次传送8位

{

CLK=0

DAT=num&0x01

CLK=1

num>>=1

}

num=table[b/1000]//千位

for(c=0c<8c++)//依次传送8位

{

CLK=0

DAT=num&0x01

CLK=1

num>>=1

}

}

void key()

{

if(k1==0)

{

delay(3)

if(k1==0)

{

TR0=0

z++

if(z==10000)

z=0

sendbyte(z)

}

while(!k1)

}

if(k2==0)

{

delay(3)

if(k2==0)

{

TR0=1

sendbyte(z)

}

while(!k2)

}

}

void main()

{

TMOD=0X01//定时器0定时方式1

TH0=0XD8//晶振12MHZ,定时10ms

TL0=0XF0

EA=1

ET0=1

TR0=1

sendbyte(0)

while(1)

key()

}

void time()interrupt 1//定时器中断

{

uint count

TH0=0XD8

TL0=0XF0

count++

if(count==100)//10毫秒X100=1秒

{

count=0

z++

if(z==10000)

{

z=0

}

sendbyte(z)//刷新显示

}

}

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

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

void Show_164(unsigned char _ShowValue)

{

unsigned char Count0

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

{

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

ShowData=1

else

ShowData=0

_ShowValue<<=1

ShowClck=0

_nop_()

_nop_()

ShowClck=1

}

}

所有A,B连在一起作为一个数据输入,每个HC164时钟单独接出,每片HC164的8个输出接相应扒高州的数码管段,段位是否加限流电阻视数码管型号而定。共阳脚直接接电源或者每个数码管接个三极管驱念拍动控制。

共阳脚直接接电源数据更新的时候会看到数码管跳动。每个数码管共阳脚接三极管驱动控制,在数据移春蔽进时关闭三极管,这样看不到数字跳动,但会暂短黑一下。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12552122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存