MOV P1,NUM0
CLR P31
SETB P30
CLR P30
CALL DELAY2MS
SETB P31
;-------
MOV P1,NUM1
CLR P32
SETB P30
CLR P30
CALL DELAY2MS
SETB P32
RET
573的输入口全部接在同一个I/O口,每个573都有条片选线,这两根片选线接单片机的两个管脚,数码管的接法就是,573的输出口接数码管的A-G 另一个573就接数码管的公共端。最为位选
#include <mega16h>
#include <delayh>
//数据信号 发送的数据 高电平high 1 低电平low pc0接74HC595的数据输入圈
#define HC595_DATA_HIGH PORTC |=(1<<0)
#define HC595_DATA_LOW PORTC &=~(1<<0)
//输出锁存信号线
#define HC595_LCLK_HIGH PORTC |=(1<<1)
#define HC595_LCLK_LOW PORTC &=~(1<<1)
//输入时钟线 把数据写入74HC595 pc0只决定电平大小 给上升沿才能输入
#define HC595_SCLK(串行时钟)_HIGH PORTC |=(1<<2)
#define HC595_SCLK_LOW PORTC &=~(1<<2)
//共阴数码表
unsigned char segnum[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x7c};
void Send74HC595(unsigned char data)
{
unsigned char i=0;
for(i=0;i<8;i++)
{
if(data & 0x80)//先发高位
HC595_DATA_HIGH;
else
HC595_DATA_LOW;
HC595_SCLK_HIGH;//给一个上升沿
delay_us(2);
HC595_SCLK_LOW;//给一个下降沿
data<<=1; //数据位移
}
}
void HC595Display(unsigned char num,unsigned char data)
{
HC595_LCLK_LOW;
HC595_SCLK_LOW;
Send74HC595(~(0x01<<num)); //发送位选
Send74HC595(segnum[data]);//发送段选
HC595_LCLK_HIGH;//上升输出锁存
delay_us(2);
}
void main (void)
{
MCUCSR=0x80;
MCUCSR=0x80;
DDRC|=(1<<0)|(1<<1)|(1<<2); // DDRC 不能=某值 它使pc0 pc1 pc2打开
while (1)
{
HC595Display(0,1);
HC595Display(1,2);
HC595Display(2,10);
HC595Display(3,0);
HC595Display(4,3);
HC595Display(5,10);
HC595Display(6,1);
HC595Display(7,0);
}
}
既然要用到74hc595,那么就要写一个595的驱动程序,以便后面的 *** 作简单化。
sbit hc595_si =P2^5; //数据引脚sbit hc595_sck =P2^4; //移位寄存器
sbit hc595_rck =P2^7; //输出寄存器
/595驱动/
void HC595(unsigned char ch)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
hc595_si = (ch & 0x80); //取写入数据的最高位送入595的数据引脚
ch <<= 1; //相当于ch = ch << 1; 数据左移1位,低位往高位移
hc595_sck=0; //送到移位寄存器
hc595_sck=1;
}
hc595_rck=0;
hc595_rck=1;//输出数据
}
做完这些,接下来只需要往595里写数据就可以了,例如:HC595(0xfe); 则595芯片的Q0(最低位)输出端为“0”。可用仿真软件尝试一遍便知效果。
以上就是关于51单片机用74hc377控制两个数码管计时程序全部的内容,包括:51单片机用74hc377控制两个数码管计时程序、用74HC573驱动数码管是不是比三极管驱动要节省几个口、怎样用74HC595写数码管程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)