AVR单片机MEGA16驱动 74HC595 驱动共阴极8位数码管 自由连线 显示乱码
我们自己的连线方式是:Q0连dpQ1连aQ2连bQ3连cQ4连dQ5连eQ6连fQ7连g(Q0~Q7为74HC595的管脚dp,a~g为数码管笔段)跪求高手给个代码能让所...
我们自己的连线方式是:Q0连dp Q1连a Q2连b Q3连c Q4连d Q5连e Q6连f Q7连g
(Q0~Q7为74HC595的管脚 dp,a~g为数码管笔段)
跪求高手 给个代码 能让所有数码管(21个)0~9走动
拜谢!
最好是C语言的程序! 展开
(Q0~Q7为74HC595的管脚 dp,a~g为数码管笔段)
跪求高手 给个代码 能让所有数码管(21个)0~9走动
拜谢!
最好是C语言的程序! 展开
2个回答
展开全部
这种连接方式无所谓的,595可以正向走和反向走,所以不管你怎么接,都有办法,就是改一句代码的事。另外,数码管查表数据可以生成,只要你知道各个端在什么位置就行了。595程序如下,给你注释清楚:
//宏定义
#define SCK_L PORTB &=~BIT(3) //595控制
#define SCK_H PORTB |= BIT(3)
#define RCK_L PORTB &=~BIT(4)
#define RCK_H PORTB |= BIT(4)
#define DAT_L PORTB &=~BIT(5)
#define DAT_H PORTB |= BIT(5)
//595数据发送函数
void set595(uchar data)
{
uchar a,b;
a = data;
SCK_L; //时钟低
RCK_L; //锁存低
for(b=0;b<8;b++) //移发数据
{
if(a&0x01) //如果出来后方向是反的,就改为if(a&0x80)
{
DAT_H; //发数据1
}
else
{
DAT_L; //发数据0
}
SCK_H; //时钟上升沿
a >>= 1; //数据移位,如果上面改成80,那么此处改为a<<=1;一定要对应
NOP();
NOP();
SCK_L; //时钟低
RCK_L; //打开锁存,我的习惯是,8位数据发完后再打开锁存,这样可以消隐
}
}
其他的你自己写吧,很简单的。如果还不行,那你就在我空间留言吧。
//宏定义
#define SCK_L PORTB &=~BIT(3) //595控制
#define SCK_H PORTB |= BIT(3)
#define RCK_L PORTB &=~BIT(4)
#define RCK_H PORTB |= BIT(4)
#define DAT_L PORTB &=~BIT(5)
#define DAT_H PORTB |= BIT(5)
//595数据发送函数
void set595(uchar data)
{
uchar a,b;
a = data;
SCK_L; //时钟低
RCK_L; //锁存低
for(b=0;b<8;b++) //移发数据
{
if(a&0x01) //如果出来后方向是反的,就改为if(a&0x80)
{
DAT_H; //发数据1
}
else
{
DAT_L; //发数据0
}
SCK_H; //时钟上升沿
a >>= 1; //数据移位,如果上面改成80,那么此处改为a<<=1;一定要对应
NOP();
NOP();
SCK_L; //时钟低
RCK_L; //打开锁存,我的习惯是,8位数据发完后再打开锁存,这样可以消隐
}
}
其他的你自己写吧,很简单的。如果还不行,那你就在我空间留言吧。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询