#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个输出接相应扒高州的数码管段,段位是否加限流电阻视数码管型号而定。共阳脚直接接电源或者每个数码管接个三极管驱念拍动控制。共阳脚直接接电源数据更新的时候会看到数码管跳动。每个数码管共阳脚接三极管驱动控制,在数据移春蔽进时关闭三极管,这样看不到数字跳动,但会暂短黑一下。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)