74HC595是三线串转并芯片,同时提供了级联端,可以进行多片级联,因此非常适合进行单片机输出端口扩展。同时74HC595还可以使用SPI接口驱动。
这里采用级联的方式使用74HC595驱动两个数码管显示。按照595时序,使用51单片机来将16位7段码数据送入595驱动数码管显示。程序如下:
主程序:
main.c
#include"Main.h"
uchar code LED_Table_G[20] =
//0 1 2 3 4 5 6 7 8 9
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
//0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
#define T0_1ms (65536 - (OSC_FREQ / OSC_PER_INST)/1000) //当前晶振和指令/时钟周期下的1ms计数值
#define T0_1msH (uchar)(T0_1ms>>8) //1ms计数值高8位
#define T0_1msL (uchar)(T0_1ms&0xFF) //低8位
sbit SHCP = P1^7; //595移位时钟
sbit STCP = P1^6; //595输出使能时钟
sbit DS = P1^5; //595串行输入端
uchar count = 0;
void Driver_595(const uint Div) //74HC595串转并函数,2片级联方式
{
uchar i;
SHCP = 0;
STCP = 0;
do{
if ((Div&(1<<(i-1)))!=0)
DS = 1;
else
DS = 0;
SHCP = 1; //移位
SHCP = 0;
}while(--i);
STCP = 1;
STCP = 0; //并行输出
}
void Init_T0() //定时器初始化函数,使定时器每1ms中断一次
{
TMOD &= 0xF0;
TMOD |= 0x01; //16位定时器模式
TH0 = T0_1msH;
TL0 = T0_1msL;
EA = 1; //开全局中断
ET0 = 1; //允许T0中断
TR0 = 1; //启动定时器
}
void T0_Interrupt() interrupt T0_INTERRUPT
{
static uint i = 0;
TH0 = T0_1msH; //重新载入计数值
TL0 = T0_1msL;
i ++;
TF0 = 0;
if(i == 1000) //1秒更新显示数值
{
if(count++ == 100) //到100清零,只计数到99
count = 0;
i = 0;
Driver_595(((uint)(LED_Table_G[count/10])<<8) | LED_Table_G[count%10]);
}
}
void main(void)
{
Init_T0();
while(1)
{
PCON |= 0x01; //单片机进入低功耗模式
}
}
这里采用级联的方式使用74HC595驱动两个数码管显示。按照595时序,使用51单片机来将16位7段码数据送入595驱动数码管显示。程序如下:
主程序:
main.c
#include"Main.h"
uchar code LED_Table_G[20] =
//0 1 2 3 4 5 6 7 8 9
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
//0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};
#define T0_1ms (65536 - (OSC_FREQ / OSC_PER_INST)/1000) //当前晶振和指令/时钟周期下的1ms计数值
#define T0_1msH (uchar)(T0_1ms>>8) //1ms计数值高8位
#define T0_1msL (uchar)(T0_1ms&0xFF) //低8位
sbit SHCP = P1^7; //595移位时钟
sbit STCP = P1^6; //595输出使能时钟
sbit DS = P1^5; //595串行输入端
uchar count = 0;
void Driver_595(const uint Div) //74HC595串转并函数,2片级联方式
{
uchar i;
SHCP = 0;
STCP = 0;
do{
if ((Div&(1<<(i-1)))!=0)
DS = 1;
else
DS = 0;
SHCP = 1; //移位
SHCP = 0;
}while(--i);
STCP = 1;
STCP = 0; //并行输出
}
void Init_T0() //定时器初始化函数,使定时器每1ms中断一次
{
TMOD &= 0xF0;
TMOD |= 0x01; //16位定时器模式
TH0 = T0_1msH;
TL0 = T0_1msL;
EA = 1; //开全局中断
ET0 = 1; //允许T0中断
TR0 = 1; //启动定时器
}
void T0_Interrupt() interrupt T0_INTERRUPT
{
static uint i = 0;
TH0 = T0_1msH; //重新载入计数值
TL0 = T0_1msL;
i ++;
TF0 = 0;
if(i == 1000) //1秒更新显示数值
{
if(count++ == 100) //到100清零,只计数到99
count = 0;
i = 0;
Driver_595(((uint)(LED_Table_G[count/10])<<8) | LED_Table_G[count%10]);
}
}
void main(void)
{
Init_T0();
while(1)
{
PCON |= 0x01; //单片机进入低功耗模式
}
}