在某宝上买了这个四位数码管(3642BS)打算用来做项目,没想到给的例程只有51和arduino的,并没有给出STM32的驱动程序。在阅读了51的程序后大概了解了主要代码思路,花了一点时间把程序移植到了STM32上,写了一个计时的功能。和大家分享下。我手上的单片机是STM32f103C8T6.
我手上的这个四位数码管好像就是单独为时间显示制作的,第一、三、四位都是7段数码管,并非常见的8段数码管。只有第二位是带有时间显示分号的8位数码管。
主程序
//说明:
// ----------------------------------------------------------------
// GND 电源地
// VCC 接5V或3.3v电源
// DIO 接PB12
// RCLK 接PB13
// SCLK 接PB14
// ----------------------------------------------------------------
#include "delay.h"
#include "sys.h"
#include "led4.h"
#include "timer.h"
#include "stm32f10x_tim.h"
int T=0; //记录计时秒数
int main (void);
void led4show(int r,int j,int k,int l);
void ledout(u16 x);
u8 d=40; //分、秒之间分号闪烁0
int main(void)
{
int m,s,m1,m2,s1,s2; //m :分钟,m1:分钟十位,m2:分钟个位。s:秒,s1:秒的 十位,s2:秒的个位。
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED4_Init();
TIM4_Int_Init(9999,7199); //10Khz的计数频率,计数到10000为1s.
while(1)
{
m=T/60;
s=T%60;
m1=m/10;
m2=m-m1*10;
s1=s/10;
s2=s-s1*10;
if(d>0) //分号闪烁
d--;
else d=40;
led4show(m1,m2,s1,s2); //调用数码管显示函数
}
}
unsigned char LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F - //数码管字表
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
void led4show(int r,int j,int k,int l) //位选程序
{
u8 i;
//显示第1位
i=LED_0F[l];
ledout(i);
ledout(0x01);
RCLK=0;
RCLK = 1;
delay_ms(5);
//显示第2位
i=LED_0F[k];
ledout(i);
ledout(0x02);
RCLK = 0;
RCLK = 1;
delay_ms(5);
//显示第3位
i=LED_0F[j];
if(d>20) //分号闪烁
i=i&0x7F;
ledout(i);
ledout(0x04);
RCLK = 0;
RCLK = 1;
delay_ms(5);
//显示第4位
i=LED_0F[r];
ledout(i);
ledout(0x08);
RCLK = 0;
RCLK = 1;
delay_ms(5);
}
void ledout( u16 x) //片选程序
{
u8 i;
for(i=8;i>=1;i--)
{
if (x&0x80) DIO=1; else DIO=0;
x<<=1;
SCLK = 0;
SCLK = 1;
}
}
在某宝上买了这个四位数码管(3642BS)打算用来做项目,没想到给的例程只有51和arduino的,并没有给出STM32的驱动程序。在阅读了51的程序后大概了解了主要代码思路,花了一点时间把程序移植到了STM32上,写了一个计时的功能。和大家分享下。我手上的单片机是STM32f103C8T6.
我手上的这个四位数码管好像就是单独为时间显示制作的,第一、三、四位都是7段数码管,并非常见的8段数码管。只有第二位是带有时间显示分号的8位数码管。
主程序
//说明:
// ----------------------------------------------------------------
// GND 电源地
// VCC 接5V或3.3v电源
// DIO 接PB12
// RCLK 接PB13
// SCLK 接PB14
// ----------------------------------------------------------------
#include "delay.h"
#include "sys.h"
#include "led4.h"
#include "timer.h"
#include "stm32f10x_tim.h"
int T=0; //记录计时秒数
int main (void);
void led4show(int r,int j,int k,int l);
void ledout(u16 x);
u8 d=40; //分、秒之间分号闪烁0
int main(void)
{
int m,s,m1,m2,s1,s2; //m :分钟,m1:分钟十位,m2:分钟个位。s:秒,s1:秒的 十位,s2:秒的个位。
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
LED4_Init();
TIM4_Int_Init(9999,7199); //10Khz的计数频率,计数到10000为1s.
while(1)
{
m=T/60;
s=T%60;
m1=m/10;
m2=m-m1*10;
s1=s/10;
s2=s-s1*10;
if(d>0) //分号闪烁
d--;
else d=40;
led4show(m1,m2,s1,s2); //调用数码管显示函数
}
}
unsigned char LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F - //数码管字表
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
void led4show(int r,int j,int k,int l) //位选程序
{
u8 i;
//显示第1位
i=LED_0F[l];
ledout(i);
ledout(0x01);
RCLK=0;
RCLK = 1;
delay_ms(5);
//显示第2位
i=LED_0F[k];
ledout(i);
ledout(0x02);
RCLK = 0;
RCLK = 1;
delay_ms(5);
//显示第3位
i=LED_0F[j];
if(d>20) //分号闪烁
i=i&0x7F;
ledout(i);
ledout(0x04);
RCLK = 0;
RCLK = 1;
delay_ms(5);
//显示第4位
i=LED_0F[r];
ledout(i);
ledout(0x08);
RCLK = 0;
RCLK = 1;
delay_ms(5);
}
void ledout( u16 x) //片选程序
{
u8 i;
for(i=8;i>=1;i--)
{
if (x&0x80) DIO=1; else DIO=0;
x<<=1;
SCLK = 0;
SCLK = 1;
}
}
举报