timer.c
/********************************************************************
* 文件 :timer.c
* 说明 :通过配置定时器相关寄存器的配置,实现定时器2每1S中断一次通过数码管将时间实时的显示出来
********************************************************************/
#include“stm32f10x_lib.h”
/******************************************************
* 函数名称 :void TIM_Configuration(void)
* 函数功能 :定时器的相关配置
* 入口参数 : 无
* 出口参数 :无
* 返回值 :无
******************************************************/
void TIM_Configuration(void)
{
/*-----------定义结构体变量----------------*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器时钟
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
/*-----------Configures TIM2 -------------*/
TIM_TimeBaseStructure.TIM_Period = 2000; //下个更新事件发生时自动装载的周期值
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //时钟的分频值为35999,则时钟分频36000
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //输出比较时间模式
// TIM_OCInitStructure.TIM_Pulse = 0x0; //脉冲值 设置待转入捕获寄存器的脉冲值(定时器模式配置为输出比较模式)
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_Cmd(TIM2,ENABLE);//使能TIM2
TIM_PrescalerConfig(TIM2,35999,TIM_PSCReloadMode_Immediate);//让定时器预分频值立即装入
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能定时器中断
}
SMG_Display.c
#include“stm32f10x_lib.h”
/*---数码管从左至右为SMG1,SMG2,SMG3,SMG4,分别对应的GPIO引脚为PC8,PB15,PC9,PE8 --*/
/*-----------------数码管显示的数据(0~9)的段码-------------------*/
u8 const Display_TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*-----------------外部函数的声明----------------------*/
extern void SPI_74HC595_Init(void);
extern void SPI_74HC595_SendData(u8 data);
/*******************************************************************************
* Function Name : void SMG_Init(void))
* Description : 对数码管的初始化
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SMG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
SPI_74HC595_Init(); //初始化595
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : void SMG_Bit(u8 data)
* Description : 选择数码管的位选
* Input : u8 data --------0x01:选择左边第一个数码管
0x02:第二个数码管
0x04:第三个数码管
0x08:第四个数码管
* Output : None
* Return : None
*******************************************************************************/
void SMG_Bit(u8 data)
{
if((data & 0x01)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_8);
else GPIO_SetBits(GPIOC,GPIO_Pin_8);
if((data & 0x02)!= 0) GPIO_ResetBits(GPIOB,GPIO_Pin_15);
else GPIO_SetBits(GPIOB,GPIO_Pin_15);
if((data & 0x04)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_9);
else GPIO_SetBits(GPIOC,GPIO_Pin_9);
if((data & 0x08)!= 0) GPIO_ResetBits(GPIOE,GPIO_Pin_8);
else GPIO_ResetBits(GPIOE,GPIO_Pin_8);
}
/*******************************************************************************
* Function Name : void SMG_Display(u32 data,u8 dot)
* Description :
* Input : data:
要显示的数据
dot:
显示小数点的位置
* Output : None
* Return : None
*******************************************************************************/
void SMG_Display(u32 data,u8 dot)
{
u32 one,ten,hundred,thousand; //个,十,百,千
u32 j,n;
thousand = data / 1000;
hundred = (data % 1000) / 100;
ten = (data % 100) / 10;
one = data % 10;
//----------------显示数据-------------------------
for(n=0;n《20;n++)
{
if(4==dot) SPI_74HC595_SendData(Display_TAB[thousand]&0x7f);
else SPI_74HC595_SendData(Display_TAB[thousand]);
SMG_Bit(0x01);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
if(3==dot) SPI_74HC595_SendData(Display_TAB[hundred]&0x7f);
else SPI_74HC595_SendData(Display_TAB[hundred]);
SMG_Bit(0x02);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
if(2==dot) SPI_74HC595_SendData(Display_TAB[ten]&0x7f);
else SPI_74HC595_SendData(Display_TAB[ten]);
SMG_Bit(0x04);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
SPI_74HC595_SendData(Display_TAB[one]);
SMG_Bit(0x08);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
}
}
/**************************************************************************
* 名称:NumbTube_Bit(uint8 data)
* 功能:选择数码管的位选。
* 入口参数: data 选择码
* 出口参数: 无
**************************************************************************/
void NumbTube_Bit(u8 data)
{
if((data & 0x01) != 0) GPIO_ResetBits(GPIOC, GPIO_Pin_8);
else GPIO_SetBits(GPIOC, GPIO_Pin_8);
if((data & 0x02) != 0) GPIO_ResetBits(GPIOB, GPIO_Pin_15);
else GPIO_SetBits(GPIOB, GPIO_Pin_15);
if((data & 0x04) != 0) GPIO_ResetBits(GPIOC, GPIO_Pin_9);
else GPIO_SetBits(GPIOC, GPIO_Pin_9);
if((data & 0x08) != 0) GPIO_ResetBits(GPIOE, GPIO_Pin_8);
else GPIO_SetBits(GPIOE, GPIO_Pin_8);
}
/****************************************************************************
* 名称:NumbTube_Display(uint32 data,uint8 radix_point)
* 功能:控制数码管显示数据。
* 入口参数: data 需要显示的数据
* radix_point 小数点的位置
* 出口参数: 无
****************************************************************************/
void NumbTube_Display(u32 data,u8 radix_point)
{ u32 one,ten,hundred,thousand; //个,十,百,千,的变量声明
u32 j,n; //时间,的变量声明
thousand = data / 1000; //计算千位
if(thousand != 0) data -= thousand*1000;//计算百位
hundred = data / 100;
if(hundred != 0) data -= hundred*100; //计算十位
ten = data / 10;
if(ten != 0) data -= ten*10; //计算个位
one = data % 10;
//-------------------显示数据----------------
for(n=0;n《20;n++)
{
if(radix_point==4) SPI_74HC595_SendData(Display_TAB[thousand] & 0x7f);
else SPI_74HC595_SendData(Display_TAB[thousand]);
NumbTube_Bit(0x01);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
if(radix_point==3) SPI_74HC595_SendData(Display_TAB[hundred] & 0x7f);
else SPI_74HC595_SendData(Display_TAB[hundred]);
NumbTube_Bit(0x02);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
if(radix_point==2) SPI_74HC595_SendData(Display_TAB[ten] & 0x7f);
else SPI_74HC595_SendData(Display_TAB[ten]);
NumbTube_Bit(0x04);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
SPI_74HC595_SendData(Display_TAB[one]);
NumbTube_Bit(0x08);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
}
}
timer.c
/********************************************************************
* 文件 :timer.c
* 说明 :通过配置定时器相关寄存器的配置,实现定时器2每1S中断一次通过数码管将时间实时的显示出来
********************************************************************/
#include“stm32f10x_lib.h”
/******************************************************
* 函数名称 :void TIM_Configuration(void)
* 函数功能 :定时器的相关配置
* 入口参数 : 无
* 出口参数 :无
* 返回值 :无
******************************************************/
void TIM_Configuration(void)
{
/*-----------定义结构体变量----------------*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器时钟
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
/*-----------Configures TIM2 -------------*/
TIM_TimeBaseStructure.TIM_Period = 2000; //下个更新事件发生时自动装载的周期值
TIM_TimeBaseStructure.TIM_Prescaler = 35999; //时钟的分频值为35999,则时钟分频36000
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //输出比较时间模式
// TIM_OCInitStructure.TIM_Pulse = 0x0; //脉冲值 设置待转入捕获寄存器的脉冲值(定时器模式配置为输出比较模式)
TIM_OC1Init(TIM2,&TIM_OCInitStructure);
TIM_Cmd(TIM2,ENABLE);//使能TIM2
TIM_PrescalerConfig(TIM2,35999,TIM_PSCReloadMode_Immediate);//让定时器预分频值立即装入
TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除中断标志
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能定时器中断
}
SMG_Display.c
#include“stm32f10x_lib.h”
/*---数码管从左至右为SMG1,SMG2,SMG3,SMG4,分别对应的GPIO引脚为PC8,PB15,PC9,PE8 --*/
/*-----------------数码管显示的数据(0~9)的段码-------------------*/
u8 const Display_TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/*-----------------外部函数的声明----------------------*/
extern void SPI_74HC595_Init(void);
extern void SPI_74HC595_SendData(u8 data);
/*******************************************************************************
* Function Name : void SMG_Init(void))
* Description : 对数码管的初始化
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SMG_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量
SPI_74HC595_Init(); //初始化595
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/*******************************************************************************
* Function Name : void SMG_Bit(u8 data)
* Description : 选择数码管的位选
* Input : u8 data --------0x01:选择左边第一个数码管
0x02:第二个数码管
0x04:第三个数码管
0x08:第四个数码管
* Output : None
* Return : None
*******************************************************************************/
void SMG_Bit(u8 data)
{
if((data & 0x01)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_8);
else GPIO_SetBits(GPIOC,GPIO_Pin_8);
if((data & 0x02)!= 0) GPIO_ResetBits(GPIOB,GPIO_Pin_15);
else GPIO_SetBits(GPIOB,GPIO_Pin_15);
if((data & 0x04)!= 0) GPIO_ResetBits(GPIOC,GPIO_Pin_9);
else GPIO_SetBits(GPIOC,GPIO_Pin_9);
if((data & 0x08)!= 0) GPIO_ResetBits(GPIOE,GPIO_Pin_8);
else GPIO_ResetBits(GPIOE,GPIO_Pin_8);
}
/*******************************************************************************
* Function Name : void SMG_Display(u32 data,u8 dot)
* Description :
* Input : data:
要显示的数据
dot:
显示小数点的位置
* Output : None
* Return : None
*******************************************************************************/
void SMG_Display(u32 data,u8 dot)
{
u32 one,ten,hundred,thousand; //个,十,百,千
u32 j,n;
thousand = data / 1000;
hundred = (data % 1000) / 100;
ten = (data % 100) / 10;
one = data % 10;
//----------------显示数据-------------------------
for(n=0;n《20;n++)
{
if(4==dot) SPI_74HC595_SendData(Display_TAB[thousand]&0x7f);
else SPI_74HC595_SendData(Display_TAB[thousand]);
SMG_Bit(0x01);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
if(3==dot) SPI_74HC595_SendData(Display_TAB[hundred]&0x7f);
else SPI_74HC595_SendData(Display_TAB[hundred]);
SMG_Bit(0x02);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
if(2==dot) SPI_74HC595_SendData(Display_TAB[ten]&0x7f);
else SPI_74HC595_SendData(Display_TAB[ten]);
SMG_Bit(0x04);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
SPI_74HC595_SendData(Display_TAB[one]);
SMG_Bit(0x08);
for(j=0;j《1500;j++);
SMG_Bit(0x00);
}
}
/**************************************************************************
* 名称:NumbTube_Bit(uint8 data)
* 功能:选择数码管的位选。
* 入口参数: data 选择码
* 出口参数: 无
**************************************************************************/
void NumbTube_Bit(u8 data)
{
if((data & 0x01) != 0) GPIO_ResetBits(GPIOC, GPIO_Pin_8);
else GPIO_SetBits(GPIOC, GPIO_Pin_8);
if((data & 0x02) != 0) GPIO_ResetBits(GPIOB, GPIO_Pin_15);
else GPIO_SetBits(GPIOB, GPIO_Pin_15);
if((data & 0x04) != 0) GPIO_ResetBits(GPIOC, GPIO_Pin_9);
else GPIO_SetBits(GPIOC, GPIO_Pin_9);
if((data & 0x08) != 0) GPIO_ResetBits(GPIOE, GPIO_Pin_8);
else GPIO_SetBits(GPIOE, GPIO_Pin_8);
}
/****************************************************************************
* 名称:NumbTube_Display(uint32 data,uint8 radix_point)
* 功能:控制数码管显示数据。
* 入口参数: data 需要显示的数据
* radix_point 小数点的位置
* 出口参数: 无
****************************************************************************/
void NumbTube_Display(u32 data,u8 radix_point)
{ u32 one,ten,hundred,thousand; //个,十,百,千,的变量声明
u32 j,n; //时间,的变量声明
thousand = data / 1000; //计算千位
if(thousand != 0) data -= thousand*1000;//计算百位
hundred = data / 100;
if(hundred != 0) data -= hundred*100; //计算十位
ten = data / 10;
if(ten != 0) data -= ten*10; //计算个位
one = data % 10;
//-------------------显示数据----------------
for(n=0;n《20;n++)
{
if(radix_point==4) SPI_74HC595_SendData(Display_TAB[thousand] & 0x7f);
else SPI_74HC595_SendData(Display_TAB[thousand]);
NumbTube_Bit(0x01);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
if(radix_point==3) SPI_74HC595_SendData(Display_TAB[hundred] & 0x7f);
else SPI_74HC595_SendData(Display_TAB[hundred]);
NumbTube_Bit(0x02);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
if(radix_point==2) SPI_74HC595_SendData(Display_TAB[ten] & 0x7f);
else SPI_74HC595_SendData(Display_TAB[ten]);
NumbTube_Bit(0x04);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
SPI_74HC595_SendData(Display_TAB[one]);
NumbTube_Bit(0x08);
for(j=0;j《1500;j++);
NumbTube_Bit(0x00);
}
}
举报