89c52开发板, 如何利用74HC595驱动一个数码管,0到9循环?

必须有发送函数吗?给个思路也行。。。
2025-01-03 07:52:33
推荐回答(2个)
回答1:

#include
#include
#define uint unsigned int
#define uchar unsigned char
#define nop() _nop_();_nop_();
/*************************************************************/
sbit SCLR = P2^3; //移位寄存器清零端,对应 595 的 10脚
sbit SCK = P2^2; //移位寄存器时钟输入,对应595 的 11脚 SCK
sbit RCK = P2^1; //存储寄存器时钟输入,对应595 的12 脚 RCK
sbit SI = P2^0; //串行数据输入,对应 595的 14 脚 SI
/*************************************************************/
uchar code table[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e
}; //共阳极数码管编码表

void delayms(uint xms)
{ uchar i;
while(xms--)
for(i=0;i<114;i++);
}
/***********************************************************
74HC595数据输入
************************************************************/
void WR_74HC595(uchar Data)
{
uchar i;
//////////////移入串行数据
for(i = 0; i < 8; i++) //循环 8次,刚好移完8位
{
SCK= 0; //先将移位寄存器控制引脚置为低
SI = (bit)(Data & 0x80); //取数据的最高位
Data <<= 1; //将数据的次高位移到最高位
SCK = 1; //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位
}
//////////////锁存
RCK = 0; //先将存储寄存器引脚置为低
_nop_(); //延时
RCK = 1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
_nop_(); //延时
RCK = 0; //先将存储寄存器引脚置为低
}

/**************************************************************
主函数
*****************************************************************/
void main(void)
{
uchar i;
SCLR=1;
P2= 0X0f; //四位数码管同时选中 P4 ~ P7输出 0

while(1)
{
for(i=0; i<10; i++) //显示 0-9
{
WR_74HC595(table[i]); //传段码
delayms(500); //延迟时间 2ms以内
}
}
}

回答2:

如何