您的位置 首页 汽车

两片74HC595级联动态驱动8位数码管 51单片机

功能:用2片74HC595驱动8位数码管,级联的最低1片595控制位选,那么第一片控制段选时间:2013-3-2821:11:59作者:Stone版本:

功用 : 用2片74HC595驱动8位数码管, 级联的最低1片595操控位选,那么榜首片操控段选

时刻 : 2013-3-28 21:11:59
作者 : Stone
版别 : REV1
渠道 : STC89C52 11.0592MHz
现象 : 8位数码管从榜首位开端从0计数,满10进位
版别阐明 : 第0版别没有运用定时器中止,一起界说了一个 unsigned long int 变量计数
再把这个数的每位分离出来显现,所以导致有点闪屏,此版别运用定时器中止,
并且没有用 unsigned long int 之类的变量,而是用数组 Val[8] 来计数,
主函数只担任显现,其它的在中止函数里边处理,这样显现一点都不闪屏,
补白 : 能够用 ULN2003A 接在数码管的 com 口来进步驱动才能,ULN2003A里边有7个NPN三极管,
能够大大进步驱动才能

#include

sbit SCK = P1^1; // 数据输入时钟线,脉冲
sbit SI = P1^0; // 数据线
sbit RCK = P1^2; // 锁存

unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 段码
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选
unsigned char Val[8] = {0}; // 要显现的数据

************************ 函数声明 ************************
void interrupt_init(void);
void timer_init(void);

操控74HC595输出数据
void Output(void)
{
RCK = 0;
RCK = 1;
}

向74HC595中写入一字节数据
void Write_Byte(unsigned char dat)
{
unsigned char i = 0;

for(i=0; i<8; i++)
{
SCK = 0;
SI = dat & 0x80;
SCK = 1;

dat <<= 1;
}
}

显现函数

void Display(unsigned char * p)
{
unsigned char * pt = Wei;

Write_Byte(*(pt+0));
Write_Byte(SMG[*(p+7)]);
Output();

Write_Byte(*(pt+1));
Write_Byte(SMG[*(p+6)]);
Output();

Write_Byte(*(pt+2));
Write_Byte(SMG[*(p+5)]);
Output();

Write_Byte(*(pt+3));
Write_Byte(SMG[*(p+4)]);
Output();

Write_Byte(*(pt+4));
Write_Byte(SMG[*(p+3)]);
Output();

Write_Byte(*(pt+5));
Write_Byte(SMG[*(p+2)]);
Output();

Write_Byte(*(pt+6));
Write_Byte(SMG[*(p+1)]);
Output();

Write_Byte(*(pt+7));
Write_Byte(SMG[*(p+0)]);
Output();

}

int main(void)
{
timer_init();
interrupt_init();

while(1)
{
Display(Val);
}

return 0;
}

void interrupt_init(void)
{
EA = 1;//开总中止
ET0 = 1;//开定时器0中止
ET1 = 1;//开定时器1中止
}

void timer_init(void)
{
TMOD = TMOD | 0x01;//定时器0工作方式1
TMOD = TMOD & 0xFD;

TH0 = 0x4B;//装初值,50ms计数
TL0 = 0xFF;

TR0 = 1;//敞开定时器0
}

void timer0() interrupt 1
{
static unsigned char counter0 = 0;
counter0++;
TH0 = 0x4B;//从头装入初值,定时器0从头开端计数,计数50ms
TL0 = 0xFF;

if(2 == counter0)//2*50 ms = 100ms = 0.1s
{
counter0 = 0;//counter0置零,定时器0从头开端计数

Val[0]++;
if(10==Val[0])
{
Val[0] = 0;
Val[1]++;

if(10==Val[1])
{
Val[1] = 0;
Val[2]++;

if(10==Val[2])
{
Val[2] = 0;
Val[3]++;

if(10==Val[3])
{
Val[3] = 0;
Val[4]++;

if(10==Val[4])
{
Val[4] = 0;
Val[5]++;

if(10==Val[5])
{
Val[5] = 0;
Val[6]++;

if(10==Val[6])
{
Val[6] = 0;
Val[7]++;

if(10==Val[7])
{
Val[7] = 0;
}
}
}
}
}
}
}
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/259252.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部