赞
踩
1.数码管情况介绍
数码管接线引脚:
段码与上图情况,位选为:1-PB0,2-PB12,3-PB13,4-PB14。
本项目使用5461BS-1共四位数码管,为共阳型。
2.程序部分
Timer定时器:
- #include "stm32f10x.h" // Device header
-
- void Timer_Init(void){
- //1.开启时钟RCC
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//TIM2
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- //2.选择时基单元时钟
- TIM_InternalClockConfig(TIM2);//内部时钟
- //3.配置时基单元
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
- TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//选择时钟分频
- TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上/向下/3种中央对齐模式)
- TIM_TimeBaseInitStruct.TIM_Period=10000-1;//ARR自动重装器的值(0-65535)
- TIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//PSC预分频器的值(0-65535);定时频率=72M/(PSC+1)/(ARR+1);72000
- TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;//重复计数器的值(高级计数器才有)
- TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);
- TIM_ClearFlag(TIM2,TIM_FLAG_Update);//将更新中断标志位清除,避免初始化完就进中断
- //4.使能更新中断
- TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
- //5.配置NVIC
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- NVIC_InitTypeDef NVIC_InitStruct;
- NVIC_InitStruct.NVIC_IRQChannel=TIM2_IRQn;//选择通道
- NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//指定中断通道是使能/失能
- NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;//设置先占(抢占)优先级
- NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//设置从占(响应)优先级
- NVIC_Init(&NVIC_InitStruct);
- //6.启动定时器
- TIM_Cmd(TIM2,ENABLE);
-
- }
SMG数码管
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
-
- //5461BS-1为共阳型
- u16 seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
- //u16 seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴
-
- extern u16 tim4Cnt;
-
- void SMG_Init(void){
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启GPIOA的外设时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
-
- //配置端口模式
- GPIO_InitTypeDef GPIO_InitStructureA;//定义结构体变量
- GPIO_InitStructureA.GPIO_Pin=GPIO_Pin_All; //选择你要设置的IO口
- GPIO_InitStructureA.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
- GPIO_InitStructureA.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率为50MHZ
- GPIO_Init(GPIOA,&GPIO_InitStructureA); /* 初始化GPIO */
-
- //配置端口模式
- GPIO_InitTypeDef GPIO_InitStructureB;//定义结构体变量
- GPIO_InitStructureB.GPIO_Pin=GPIO_Pin_All; //选择你要设置的IO口
- GPIO_InitStructureB.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
- GPIO_InitStructureB.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率为50MHZ
- GPIO_Init(GPIOB,&GPIO_InitStructureB); /* 初始化GPIO */
-
- GPIO_SetBits(GPIOA,GPIO_Pin_All);
- }
-
- void SMG_clean(){
- GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
- Delay_ms(2);
- }
-
- //选择第w位,显示数字num
- void SMG_Light(uint16_t w,uint16_t num){
- SMG_clean();
- //位选
- switch(w){
- case 0:
- GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
- break;
- case 1:
- GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
- break;
- case 2:
- GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_SET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_RESET);
- break;
- case 3:
- GPIO_WriteBit(GPIOB,GPIO_Pin_14,Bit_SET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_13,Bit_RESET);
- GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
- break;
- }
- //段码
- GPIO_Write(GPIOA,seg[num]);
- Delay_ms(2);
- }
main主函数
- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "Key.h"
- #include "SMG.h"
- #include "Timer.h"
-
- uint16_t i,Tim2Num,miao,shi,fen;
-
- int main(void){
- Key_Init();
- SMG_Init();
- Timer_Init();
- while(1){
- //时钟
- miao=Tim2Num%60;
- SMG_Light(0,miao%10);//ge
- SMG_Light(1,miao/10);//shi
- fen=Tim2Num%3600/60;
- SMG_Light(2,fen%10);//ge
- SMG_Light(3,fen/10);//shi
- shi=Tim2Num%(24*3600)/3600;
- }
- }
-
- //每秒计时
- void TIM2_IRQHandler(void){
- if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET){//更新中断
- Tim2Num++;
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除标志位
- }
- }
-
资料参考:
(75条消息) STM32F103C8T6 I/O口驱动4位共阳数码管_io口控制数码管_seaup2011的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。