74HC595有一个引脚可以串行输出,这样可以控制多个数码管。给第一个芯片16位二进制数,也就是2个数码管的段码,参考数据结构“栈”的原理,最先输入的段码显示在第二个数码管,最后输入的段码,显示在第一个数码管,编程的时候需要注意。这样做的优点就是节约单片机IO口,比使用74LS138要节约;使用38译码器,控制8个数码管要占用11个IO口。使用74HC595控制八个数码管只需要3个IO口。效果如下:
/*程序未经过深思熟虑,仅仅实现功能,有些繁琐,仅供参考*/
#include <reg52.h>
sbit Output_Clock1 = P2^2; //输出时序,上升沿输出。16位数据都输入完成后操作。
sbit Input_Clock = P2^0; //输入时序,上升沿输入来自输入端的数据。
sbit Input_Data = P2^1; //输入引脚,用于输入数据。
/*程序未经过深思熟虑,仅仅实现功能,有些繁琐,仅供参考*/
/*程序未经过深思熟虑,仅仅实现功能,有些繁琐,仅供参考*/
void delay(int i,int j)
{
int a,b;
for(a = 0;a <= i; a ++)
{
for(b = 0;b <= j;b ++)
{}
}
}
void main(void)
{
int i,j,k,m;
/*下面使用二维数组保存数码管的段码数值,一行是一个数,从0~9;这样做为了方便串行输入,当然也有别的方法*/
char Number[10][8] = {
{1,1,0,0,0,0,0,0},{1,1,1,1,1,0,0,1},
{1,0,1,0,0,1,0,0},{1,0,1,1,0,0,0,0},{1,0,0,1,1,0,0,1},{1,0,0,1,0,0,1,0},
{1,0,0,0,0,0,1,0},{1,1,1,1,1,0,0,0},{1,0,0,0,0,0,0,0},{1,0,0,1,0,0,0,0}};
OE1 = 0;
OE2 = 0;
m = 0;
while(1)
{
for(k = 0;k <= 99;k ++) //计数器执行0~99的计数操作。
{
if((k>=0)&&(k <= 9))
{
i = 0;
}
if((k>=10)&&(k <= 19))
{
i = 1;
}
if((k>=20)&&(k <= 29))
{
i = 2;
}
if((k>=30)&&(k <= 39))
{
i = 3;
}
if((k>=40)&&(k <= 49))
{
i = 4;
}
if((k>=50)&&(k <= 59))
{
i = 5;
}
if((k>=60)&&(k <= 69))
{
i = 6;
}
if((k>=70)&&(k <= 79))
{
i = 7;
}
if((k>=80)&&(k <= 89))
{
i = 8;
}
if((k>=90)&&(k <= 99))
{
i = 9;
}
if(k == 100)
{
k = 0;
}
for(j = 0;j <= 7;j ++)
{
Input_Clock = 0;
Input_Data = Number[i][j];
Input_Clock = 1;
}
for(j = 0;j <= 7;j ++)
{
Input_Clock = 0;
Input_Data = Number[m][j];
Input_Clock = 1;
}
m ++;
if(m == 10)
{
m = 0;
}
Output_Clock1= 1;
Output_Clock1= 0;
Output_Clock2= 1;
Output_Clock2= 0;
delay(100,300);
}
}
}
文章评论