<?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条评论)
登录后参与讨论