74hc573驱动共阴数码管例程谁给发几个,我是初学51单片机 5
下面是个164+573的,164是为了减少占用I/O口,573就段选后送位选,没什么程序可言。
#include"reg52.h"
#include"intrins.h"
sbit DSA=P2^7;//P1^1;
sbit CP= P2^4;//P1^0;
sbit dw=P1^7;
unsigned char code table[]={0Xc0,0Xf9,0Xa4,0Xb0,0X99,0X92,0X82,0Xf8,0X80,0X90,0X88,0X83,0Xc6,0Xa1,0X86,0X8e};
/*unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
*/
void delay_ms(unsigned int );
void Show_164(unsigned char ) ;
unsigned char i,j;
void main()
{
while(1)
{
i++;
if(i==10)
{
i=0;
j++;
if(j==16)
j=0;
}
dw=1;
Show_164(0x01);
dw=1;
delay_ms(11);
dw=0;
Show_164(table[j]);
dw=0;
delay_ms(11);
//---------------
dw=1;
Show_164(0x02);
dw=1;
delay_ms(11);
dw=0;
Show_164(table[j]);
dw=0;
delay_ms(11);
//---------------
dw=1;
Show_164(0x04);
dw=1;
delay_ms(11);
dw=0;
Show_164(table[j]);
dw=0;
delay_ms(11);
//---------------
dw=1;
Show_164(0x08);
dw=1;
delay_ms(11);
dw=0;
Show_164(table[j]);
dw=0;
delay_ms(11);
}
}
void Show_164(unsigned char _ShowValue)
{
unsigned char Count0;
for(Count0=0;Count0<=7;Count0++)
{
if((_ShowValue&0x80)==0x80)
DSA=1;
else
DSA=0;
_ShowValue<<=1;
CP=0;
_nop_();
_nop_();
CP=1;
}
}
void delay_ms(unsigned int t)
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=100;y>0;y--);
}
/********************/
unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管 0-9 表
/********************/
sbit LHJ_A = P1^0; //管脚定义 74HC138(3-8)译码器输入控制信号线
sbit LHJ_B = P1^1;
sbit LHJ_C = P1^2;
/********************/ //宏定义 ,定义数码管显示第几位
#define SMG_1 LHJ_C=0;LHJ_B=0;LHJ_A=0//译码器的输入脚,全 0选择第一位数码管。
#define SMG_2 LHJ_C=0;LHJ_B=0;LHJ_A=1//译码器的输入脚,001选择第二位数码管。
#define SMG_3 LHJ_C=0;LHJ_B=1;LHJ_A=0 //同上类推
#define SMG_4 LHJ_C=0;LHJ_B=1;LHJ_A=1
#define SMG_5 LHJ_C=1;LHJ_B=0;LHJ_A=0
#define SMG_6 LHJ_C=1;LHJ_B=0;LHJ_A=1
#define SMG_7 LHJ_C=1;LHJ_B=1;LHJ_A=0
#define SMG_8 LHJ_C=1;LHJ_B=1;LHJ_A=1
/******************************/
void delay(unsigned int d_time); //延时子函时,
/***************/
void main(void)
{
unsigned char i; //定义循环变量
while(1)
{
SMG_8; //选择第八位数码管,这是静态显示,P2口输出同一个数显示,不需要刷新,可选择
其它位,比如第一位,则为 SMG_1
for(i=0;i<10;i++) //循环显示0-9
{
P2=table[i]; //P2,查表输出定义好的数码管段时,显示相应的 0-9
delay(500); //延时
}
}
}
/*******************************/
//延时子函数,参数范围 0-65536
void delay(unsigned int tmp)
{
unsigned char i,j;
i=tmp;
while(i--){
j=255;
while(j--);
}
}