普中科技的单片机开发实验仪—数码管 代码

2025-10-29 08:52:06

1、主函数

#include "stm32f10x.h"

#include "delay.h"

#include "gpio.h"

#include "timer.h"

void shuma_display(u32 value);

void TIM3_IRQHandler(void);

u32 SegData[8];

u32 wei_table[]={0x00E00000,0x00C00020,

                          0x00A00040,0x00800060,

                          0x00600080,0x004000A0,

                          0x002000C0,0x000000E0,

                         };     //PB5-7,数码管位码,8位数码管,138译码器控制选择,写入BSRR寄存器,用其他IO口该码需改变

u32 duan_table[]={0x00C0003F,0x00F90006,

                            0x00A4005B,0x00B0004F,

                            0x00990066,0x0092006D,

                            0x0082007D,0x00F80007,

                            0x0080007F,0x0090006F, 

                           };   //PA0-7,数码管段码0-9,共阴,写入BSRR寄存器

int main ()

{

    delay_init();

    GPIO_Configuration(); //通用IO端口配置

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2

    TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  

while (1)

   {

      shuma_display(76543210);

   }

}

   

2、gpio.c

#include "gpio.h"

void GPIO_Configuration(void)

{

      GPIO_InitTypeDef GPIO_InitStructure;

//启动GPIO模块时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB1Periph_TIM2 | RCC_APB2Periph_AFIO, ENABLE);

      /* GPIOA Configuration: */

      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //所有GPIO为同一类型端口

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出的最大频率为50HZ

GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOA端口

GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIOB端口

}

3、timer.c

#include "timer.h"

void TIM3_Int_Init(u16 arr,u16 psc)

{

TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 

TIM_ITConfig(  //使能或者失能指定的TIM中断

TIM3, //TIM2

TIM_IT_Update ,

ENABLE  //使能

);

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能

NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设 

}

4、void TIM3_IRQHandler(void)   //TIM3中断

{

static u8 cnt=8; 

if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)        //产生溢出中断 

{

if( -- cnt ==0 | SegData[cnt-1]==0x00C0003F) cnt=8; //控制循环并判断第几位为0高位就不再显示0 

GPIOA->BSRR|=SegData[cnt-1];    //段数据 

GPIOB->BSRR|=wei_table[cnt-1];     //位数据 

TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除中断标志 

}

}

放在timer.c中,或者主函数中。

5、void shuma_display(u32 value)    //显示8位数据,分离8次,即千万

{

u8 i=0; 

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

  {       

   SegData[7-i] = duan_table[value%10]; //将值分离 

   value/=10;

  }  

}

放在主函数中,或者新建c和h文件。

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢