两片74HC595级联驱动8个数码管
//###########################################################include<reg51.h>#include...
//##########################################################
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#############管脚定义#######################
sbit sclk=P3^2; //595 移位时钟信号输入端
sbit st=P3^1; //595 锁存信号输入端
sbit da=P3^0; //595 数据信号输入端
//#############################################
//共阴极数码管显示代码:7 6 5 4 3 2 1 0
// a b c d e f
uchar code LED_7SEG[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0, //4,5,6,7,
0xfe,0xe6,0xee,0x3e, //8,9,A,b,
0x9c,0x7a,0x9e,0x8E};//C,d,E,F
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选
//#####################################################
//名称:wr595()向 595 发送一个字节的数据
//功能:向 595 发送一个字节的数据(先发低位)
//#####################################################
void wr595(uchar wrdat)
{
uchar i;
sclk=0;
st=0;
for(i=8;i>0;i--)//循环八次,写一个字节
{
da=wrdat&0x01; //发送 BIT0 位
wrdat>>=1; //要发送的数据右移,准备发送下一位
sclk=0; //移位时钟上升沿
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
sclk=0;
}
st=0; //上升沿将数据送到输出锁存器
_nop_();
_nop_();
st=1;
_nop_();
_nop_();
st=0;
}
//##########################################################
// 延时函数
//##########################################################
void delay(uint del)
{
while(del--)
{
;
}
}
//##########################################################
//名称:wr7leds()8 个 led 显示数字函数
//功能:向 595 发送一个字节的数据,然后发送位选信号
//##########################################################
void wr7leds(void)
{
uchar i;
wr595(Wei[0]); //送位选信号 ; //位选信号初始化
for(i=0;i<8;i++) //循环 8 次写 8 个数据
{
wr595(LED_7SEG[i]); //传送显示数据
wr595(Wei[i]); //送位选信号
delay(50); //延时,(决定亮度,和闪烁)
}
}
//##########################################################
//主函数
//##########################################################
main(void)
{
while(1)
{
wr7leds(); //向 74HC595 发送数据并显示
}
} 展开
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//#############管脚定义#######################
sbit sclk=P3^2; //595 移位时钟信号输入端
sbit st=P3^1; //595 锁存信号输入端
sbit da=P3^0; //595 数据信号输入端
//#############################################
//共阴极数码管显示代码:7 6 5 4 3 2 1 0
// a b c d e f
uchar code LED_7SEG[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0, //4,5,6,7,
0xfe,0xe6,0xee,0x3e, //8,9,A,b,
0x9c,0x7a,0x9e,0x8E};//C,d,E,F
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选
//#####################################################
//名称:wr595()向 595 发送一个字节的数据
//功能:向 595 发送一个字节的数据(先发低位)
//#####################################################
void wr595(uchar wrdat)
{
uchar i;
sclk=0;
st=0;
for(i=8;i>0;i--)//循环八次,写一个字节
{
da=wrdat&0x01; //发送 BIT0 位
wrdat>>=1; //要发送的数据右移,准备发送下一位
sclk=0; //移位时钟上升沿
_nop_();
_nop_();
sclk=1;
_nop_();
_nop_();
sclk=0;
}
st=0; //上升沿将数据送到输出锁存器
_nop_();
_nop_();
st=1;
_nop_();
_nop_();
st=0;
}
//##########################################################
// 延时函数
//##########################################################
void delay(uint del)
{
while(del--)
{
;
}
}
//##########################################################
//名称:wr7leds()8 个 led 显示数字函数
//功能:向 595 发送一个字节的数据,然后发送位选信号
//##########################################################
void wr7leds(void)
{
uchar i;
wr595(Wei[0]); //送位选信号 ; //位选信号初始化
for(i=0;i<8;i++) //循环 8 次写 8 个数据
{
wr595(LED_7SEG[i]); //传送显示数据
wr595(Wei[i]); //送位选信号
delay(50); //延时,(决定亮度,和闪烁)
}
}
//##########################################################
//主函数
//##########################################################
main(void)
{
while(1)
{
wr7leds(); //向 74HC595 发送数据并显示
}
} 展开
1个回答
展开全部
//共阴极数码管显示代码:7 6 5 4 3 2 1 0
// a b c d e f
uchar code LED_7SEG[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0, //4,5,6,7,
0xfe,0xe6,0xee,0x3e, //8,9,A,b,
0x9c,0x7a,0x9e,0x8E};//C,d,E,F
这些段码不对
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选
这位选码也不对,是0有效,你这是1有效,正相反,就不会亮的。
你这是仿真,还是实物板,现象是什么?
// a b c d e f
uchar code LED_7SEG[16]={0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0, //4,5,6,7,
0xfe,0xe6,0xee,0x3e, //8,9,A,b,
0x9c,0x7a,0x9e,0x8E};//C,d,E,F
这些段码不对
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选
这位选码也不对,是0有效,你这是1有效,正相反,就不会亮的。
你这是仿真,还是实物板,现象是什么?
更多追问追答
追问
电路是实物板,
能我改一下么
追答
程序问题比较多,难怪不亮啊。
//字数限制,前面一段都删掉了
//共阴极数码管显示代码:7 6 5 4 3 2 1 0 a b c d e f
uchar code LED_7SEG[]={0x3f,0x06,0x5b,0x4f,//0,1,2,3,
0x66,0x6d,0x7d,0x27, //4,5,6,7,
0x7f,0x6f,0x77,0x7c, //8,9,A,b,
0x39,0x5e,0x79,0x71};//C,d,E,F,原段码是错误的
unsigned char code Wei[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 位选为0有效,原数据也是错误的
//名称:wr595()向 595 发送一个字节的数据
//功能:向 595 发送一个字节的数据(先发高位)原来是错误的
void wr595(uchar wrdat)
{
uchar i;
for(i=8;i>0;i--)//循环八次,写一个字节
{
sclk=0; //放在循环内
da=wrdat&0x80; //发送 BIT7 位,先高后低,原来是错误的
wrdat<<=1; //要发送的数据改为左移,准备发送下一位
sclk=1; //移位时钟上升沿,中间不用_nop_()
}
}
// 延时函数
void delay(uint del)
{
while(del--);
}
//名称:wr7leds()8 个 led 显示数字函数
//功能:向 595 发送一个字节的数据,然后发送位选信号
void wr7leds(void)
{
uchar i;
for(i=0;i<8;i++) //循环 8 次写 8 个数据
{
wr595(LED_7SEG[i]); //传送显示数据
wr595(Wei[i]); //送位选信号
st=0; //发送两个字节后才能锁存一次,中间不用_nop_()
st=1; //上升沿将数据送到输出锁存器
delay(50); //延时,(决定亮度,和闪烁)
}
}
//主函数
main(void)
{
while(1)
{
wr7leds(); //向 74HC595 发送数据并显示
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询