STM32
直播中

张丽

7年用户 1449经验值
私信 关注
[问答]

怎么实现c595四位数码管在STM32上计时显示?

怎么实现c595四位数码管在STM32上计时显示?

回帖(1)

张西子

2021-12-15 11:24:01
在某宝上买了这个四位数码管(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;
                }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分