#include "B_led.h"
#include "delay.h"
#define RCLK PBout(10) //STR //sbit HC595Rclk =P1^6;
#define SCLK PBout(11) //CLK //sbit HC595Clk =P1^7;
#define DIO PAout(9) //sbit HC595In =P1^5; //DATA
uint8_t LED_NU[10] = { 0xFA,0x30,0xD9,0x79,0x33,0x6B,0xEB,0x38,0xFB,0x7B};//字模数组
// { 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};//字模数组 7寸以上的方形的驱动板
// 0 1 2 3 4 5 6 7 8 9
//数码管 G F DP A B C D E
//74HC595 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
// fd
// E D C B A DP F G
// Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0
void LED4_Display (void); // LED显示
void LED_OUT(u8 X); // LED单字节串行移位函数
uint8_t LED[8]; //用于LED的8位显示缓存
//sbit DIO = P1^0; //串行数据输入
//sbit RCLK = P1^1; //时钟脉冲信号——上升沿有效
//sbit SCLK = P1^2; //打入信号————上升沿有效
//-----------------------------------------------------------------------------
void B_led_Init(void) //IO初始化 PA0
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB ,ENABLE);//使能PORTA,PORTE时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void LED_Display (uint8_t DE)
{
uint8_t i;
i=LED_NU[DE];
LED_OUT(0x8b);
LED_OUT(i); //0xfb
RCLK = 1;
delay_us(2);
RCLK = 0;
//delay_us(2);
}
void LED_OUT(uint8_t X)
{
u8 i;
for(i=0;i<=7;i++)
{
if (X&0x80)
{
DIO=1;//delay_us(1);//DIO=1;
}
else
{
DIO=0;//delay_us(1);//DIO=0;
}
X<<=1;
SCLK = 1;
delay_us(2);
SCLK = 0;
}
}
上面是.c文件
#ifndef __B_LED_H
#define __B_LED_H
#include "sys.h"
#include "stdlib.h"
#include "stm32f10x.h"
#include "delay.h"
void LED_Display (uint8_t DE);
void LED_OUT(uint8_t X);
void B_led_Init(void);
void LedPlay(void);
#endif
上面是.h文件
下面是51的程序
/*3位显示模块测试程序,测试显示模块从0-9循环显示*/
#include
#define uint unsigned int
uint n;
//三个管脚定义
sbit HC595Clk =P1^7; //CLK
sbit HC595Rclk =P1^6; //STR
sbit HC595In =P1^5; //DATA
unsigned char LED_NU[10] = { 0xFA,0x30,0xD9,0x79,0x33,0x6B,0xEB,0x38,0xFB,0x7B};//字模数组
// { 0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};//字模数组 7寸以上的方形的驱动板
// 0 1 2 3 4 5 6 7 8 9
//数码管 G F DP A B C D E
//74HC595 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
unsigned char LEDR[3] ;
unsigned char LED[3] ;
//unsigned char LEDR[8] ;
//unsigned char LED[8] ;
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void LedPlay ( void ) //显示函数
{
unsigned char i ;
unsigned char j ;
LEDR[0] = LED[0] ;
LEDR[1] = LED[1] ;
LEDR[2] = LED[2] ;
//for( j = 8 ; j > 0 ; j-- )
for( j = 3 ; j > 0 ; j-- )
{
for( i = 0 ; i < 8 ; i++ )
{
HC595In = LEDR[j-1]&0X80 ;
HC595Clk = 1 ;
delay(1);
HC595Clk = 0;
delay(1);
LEDR[j-1] = LEDR[j-1] << 1 ;
}
}
delay(1);
HC595Rclk = 1 ;
delay(1);
HC595Rclk = 0 ;
delay(1);
}
main() //主程序
{
unsigned char i;
HC595Clk = 1 ; //数码显示屏初始化
HC595Rclk =1 ;
HC595In = 1 ;
while(1)
{
//for (i=0; i<8; i++)
for (i=0; i<3; i++)
{
LED[i] = LED_NU[n]; //提取显示数字的字模
}
n++;
if (n==10)
n=0;
LedPlay () ; //显示函数
delay(4000);
}
}
上面是电路图 注意两个电源的电压 一个为4寸数码管供电一个为595供电 还有一个2803
一起组成这个驱动电路
效果还是不错的 需要看图的私信.