用74HC595和74LS247驱动四位数码管
1 74HC595芯片
74HC595是一个8位串行输入、并行输出的移位寄存器
管脚如下:
2 74LS247芯片
74ls247是4线——七段译码器/驱动器
管脚如下:
其中, A,B,C,D为译码地址输入端;
a~g为段输出(低电平有效)
3 四位数码管
针脚定义:
1-4:位选
a-h:段选
3 原理图
注:该原理图只说明各针脚连接关系,未画出其它器件。
由图可见,对于共阳数码管,位选编码如下表:
位 |
1 |
2 |
3 |
4 |
编码 |
0xe0H |
0xd0H |
0xb0H |
0x70H |
注:表中编码将段选信号假设为0.
由于控制信号是由单片机等微处理器串行输入到74HC595,所以根据74LS247译码器编码对段选信号也编码如下:
数字 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
编码 |
0x00H |
0x01H |
0x02H |
0x03H |
0x04H |
0x05H |
0x06H |
0x07H |
0x08H |
0x09H |
注:表中编码将位选信号假设为0.
4 程序代码
unsigned char LED_0F[] = //共阳
{// 0 1 2 3 4 5 6 7 8 9
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 };
unsigned char LED[4]; //用于LED的4位显示缓存
int SCLK = 2;
int RCLK = 3;
int DIO = 4; //这里定义了那三个脚
void setup ()
{
pinMode(SCLK,OUTPUT);
pinMode(RCLK,OUTPUT);
pinMode(DIO,OUTPUT); //让三个脚都是输出状态
}
void loop()
{
LED[0]=1;
LED[1]=2;
LED[2]=3;
LED[3]=4;
while(1)
{
LED4_Display ();
}
}
void LED4_Display (void)
{
unsigned char *led_table; // 查表指针
unsigned char i;
unsigned char j;
//显示第1位
led_table = LED_0F + LED[0];
i = *led_table;
j=i|0xe0;
LED_OUT(j);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(1000);
//显示第2位
led_table = LED_0F + LED[1];
i = *led_table;
j=i|0xd0;
LED_OUT(j);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(1000);
//显示第3位
led_table = LED_0F + LED[2];
i = *led_table;
j=i|0xb0;
LED_OUT(j);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(1000);
//显示第4位
led_table = LED_0F + LED[3];
i = *led_table;
j=i|0x70;
LED_OUT(j);
digitalWrite(RCLK,LOW);
digitalWrite(RCLK,HIGH);
delay(1000);
}
void LED_OUT(unsigned char X)
{
unsigned char i;
for(i=8;i>=1;i--)
{
if (X&0x80)
{
digitalWrite(DIO,HIGH);
}
else
{
digitalWrite(DIO,LOW);
}
X<<=1;
digitalWrite(SCLK,LOW);
digitalWrite(SCLK,HIGH);
}
}