原创 stm32 74HC595数码管

2011-7-2 16:59 6168 13 13 分类: MCU/ 嵌入式

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

数据在SH_CP的上升沿输入到移位寄存器中,在ST_CP的上升沿输入到存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。移位寄存器有一个串行移位输入(DS),和一个串行输出(Q7’,和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。 

原理图:

连接状态:

C9->P7_4

C7->P7_3

D15->P7_2

D13->P7_1

D11->P8_4

D9->P8_3

B15->P8_2

B13->P8_1

//程序功能是实现两个数码管0-60的计数

#include<stm32f10x_lib.h>

#define SH_CPIO GPIOD

#define SH_CPPIN 15

#define ST_CPIO GPIOB

#define ST_CPPIN 15

#define DSGPIO GPIOC

#define DSPIN 9

#define GNDP7 GPIOD->ODR|=0<<13

#define GNDP8 GPIOB->ODR|=0<<13

#define VCCP8 GPIOD->ODR|=1<<11

const u8 table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

void delay(){

int i=100000;

while(i--);

}

void hc595_Config(){

GNDP7;

GNDP8;

VCCP8;

}

void SH_CP(){

SH_CPIO->ODR&=~(1<<SH_CPPIN);//SH_CP为低电平

delay();

SH_CPIO->ODR|=(1<<SH_CPPIN);//SH_CP为高电平,上升沿

}

void ST_CP(){

ST_CPIO->ODR&=~(1<<ST_CPPIN);//ST_CP为低电平

delay();

ST_CPIO->ODR|=(1<<ST_CPPIN);//ST_CP为高电平,上升沿

}

void hc595(u8 x){

u8 i,temp=table[x];

for(i=0;i<8;i++){//发送8位数据

DSGPIO->ODR&=(0xFFFFFFFF&(0<<DSPIN));//清零输出引脚

DSGPIO->ODR|=((temp&0x80)>>7)<<DSPIN;

temp<<=1;

SH_CP();

}

}

void GPIO_Config(){

RCC->APB2ENR|=1<<(2+1);

RCC->APB2ENR|=1<<(2+2);

RCC->APB2ENR|=1<<(2+3);

GPIOB->CRH&=0x0F0FFFFF;

GPIOB->CRH|=0x30300000;

GPIOC->CRL&=0x0FFFFFFF;

GPIOC->CRL|=0x30000000;

GPIOC->CRH&=0xFFFFFF0F;

GPIOC->CRH|=0x00000030;

GPIOD->CRH&=0x0F0F0F0F;

GPIOD->CRH|=0x30303030;

}

int main(){

int i,j;

GPIO_Config();

hc595_Config();

ST_CP();

while(1){

for(i=0;i<6;i++)

for(j=0;j<10;j++){

hc595(j);

hc595(i);

ST_CP();

}    

}

}

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /2 下一条