当前位置:文档之家› 51单片机驱动两片74HC595级联动态驱动8位数码管

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

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

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

功能: 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选

平台: STC89C52

现象: 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 =

{

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;

}

}

}

}

}

}

}

}

}

}

相关主题
文本预览
相关文档 最新文档