1、采用2片595驱动数码管,需要单片机3路IO口根据数码管动态扫描原理进行显示。
2、数码管型号:0.36 4位共阳。
原理图
点亮一个数码管
定义IO口
sbit DIO = P1^0; //串行数据口
sbit S_CLK = P1^2;//移位寄存器时钟
sbit R_CLK = P1^1;//输出锁存器时钟
发送数据
void main()
{
//第二个数码管显示0
unsigned char i, dat;//i循环次数 dat需要发送的数据
dat = 0xc0;//发送列值
for(i=0; i<8; i++)//循环8次
{
S_CLK = 0;//拉低移位寄存器时钟
R_CLK = 0;//拉低输出锁存器时钟
//先发送高位
if(dat & 0x80)//发送1
DIO = 1;
else //发送0
DIO = 0;
S_CLK = 1;//拉高移位寄存器时钟,数据移位
dat <<= 1;//数据左移
}
dat = 0x02;//发送行值
for(i=0; i<8; i++)//循环8次
{
S_CLK = 0;//拉低移位寄存器时钟
R_CLK = 0;//拉低输出锁存器时钟
if(dat & 0x80)//发送1
DIO = 1;
else //发送0
DIO = 0;
S_CLK = 1;//拉高移位寄存器时钟,数据移位
dat <<= 1;//数据左移
}
R_CLK = 1;//拉高输出锁存器时钟,并行输出数据
while(1);
}
点亮8位数码管
#define uchar unsigned char
void main (void); // 主函数
void LED4_Display (void); // LED显示
void LED_OUT(uchar X); // LED单字节串行移位函数
unsigned char code LED_0F[]; // LED字模表
sbit DIO = P1^0; //串行数据输入
sbit R_CLK = P1^1; //输出锁存器时钟——上升沿有效
sbit S_CLK = P1^2; //移位寄存器时钟————上升沿有效
//-----------------------------------------------------------------------------
// 全局变量
uchar LED[8]; //用于LED的8位显示缓存
//*****************************************************************************
// 主程序
//
void main (void)
{
LED[0]=1;
LED[1]=2;
LED[2]=3;
LED[3]=4;
LED[4]=5;
LED[5]=6;
LED[6]=7;
LED[7]=8;
while(1)
{
LED4_Display ();
}
}
void LED4_Display (void)
{
unsigned char code *led_table; // 查表指针
uchar i;
//显示第1位
led_table = LED_0F + LED[0];
i = *led_table;
LED_OUT(i);
LED_OUT(0x01);
R_CLK = 0;
R_CLK = 1;
//显示第2位
led_table = LED_0F + LED[1];
i = *led_table;
LED_OUT(i);
LED_OUT(0x02);
R_CLK = 0;
R_CLK = 1;
//显示第3位
led_table = LED_0F + LED[2];
i = *led_table;
LED_OUT(i);
LED_OUT(0x04);
R_CLK = 0;
R_CLK = 1;
//显示第4位
led_table = LED_0F + LED[3];
i = *led_table;
LED_OUT(i);
LED_OUT(0x08);
R_CLK = 0;
R_CLK = 1;
//显示第5位
led_table = LED_0F + LED[4];
i = *led_table;
LED_OUT(i);
LED_OUT(0x10);
R_CLK = 0;
R_CLK = 1;
//显示第6位
led_table = LED_0F + LED[5];
i = *led_table;
LED_OUT(i);
LED_OUT(0x20);
R_CLK = 0;
R_CLK = 1;
//显示第7位
led_table = LED_0F + LED[6];
i = *led_table;
LED_OUT(i);
LED_OUT(0x40);
R_CLK = 0;
R_CLK = 1;
//显示第8位
led_table = LED_0F + LED[7];
i = *led_table;
LED_OUT(i);
LED_OUT(0x80);
R_CLK = 0;
R_CLK = 1;
}
void LED_OUT(uchar X)
{
uchar i;
for(i=8;i>=1;i--)
{
if (X&0x80) DIO=1; else DIO=0;
X<<=1;
S_CLK = 0;
S_CLK = 1;
}
}
unsigned char code LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};