正点原子stm32mini板实现计时器秒表功能,记录时、分、秒、毫秒,lcd屏显示计时,WK_UP开始计时,KEY1下一次计时,KEY0暂停计时

利用正点原子stm32mini板实现计时器秒表功能,时、分、秒、毫秒,WK_UP开始计时,KEY1下一次计时,KEY0暂停计时

在这里插入图片描述

1、在定时器定义好需要记录的时间,使用定时器3中断完成定时60s

volatile u32  sec=0;

#define MAXN 1000 //设置秒表记录的最大次数

//数字钟的时,分、秒
u8 hour = 0, minute = 0, second = 0, count = 0, t = 0,actCount;
u8 timeRec[3][MAXN];  //记录5个时间的时分秒 timeRec[0][count]表示时,timeRec[1][count]表示分,timeRec[2][count]表示秒
u16   ms=0;
u8 n=1;


void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
    
    //定时器TIM3初始化
    TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值    
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

    //中断优先级NVIC设置
    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寄存器


    TIM_Cmd(TIM3, ENABLE);  //使能TIMx                     
}

2、按键初始化函数,之后在定义开发板上的k1、k2、k3按键的按键处理函数

void KEY_Init(void) //IO初始化
{
	
	GPIO_InitTypeDef GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC时钟

	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_15;//PA15
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PC5
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5
 
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;//PA0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉	  
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.0
	
} 

3、lcd代码可以直接移植过来,这里不做展示
4、主函数自己设计好lcd显示,while循环处理好逻辑思路,开始、暂停、下一次计时等

int main(void)
 {	 
	vu8 key=0;	
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	LCD_Init();
	KEY_Init();
	TIM3_Int_Init(100,7199);//10Khz的计数频率, 计数到100  表示 10ms

  	while(1) 
	{		       
		hour=0, minute=0, second=0, ms=0;
 		key=KEY_Scan(0);	//得到键值
		
	   	if(key)
		{						   
			switch(key)
			{				 
				case WKUP_PRES:	//开始
								hour=timeSFM[0];
							  minute=timeSFM[1];
							  second=timeSFM[2];
								  ms=timeSFM[3];
		
	
				while(1)
				{
				LCD_miaobiao();
				delay_ms(10);//消抖
				t=KEY_Scan(0);
					
					if(t==KEY1_PRES)//下一次重计时
					{
									second = 0;
									minute = 0;
									hour = 0;
									ms=0;
							        n++;
							        y+=40;
									LCD_miaobiao();
									
					}
                    else if(t==KEY0_PRES)//暂停					
					{	
									timeSFM[0]=hour;
									timeSFM[1]=minute;
									timeSFM[2]=second;
									timeSFM[3]=ms;
									  LCD_ShowxNum(70,y,timeSFM[0],2,16,0x80);
									LCD_ShowString(90,y,200,2,16,"-");  
									  LCD_ShowxNum(103,y,timeSFM[1],2,16,0x80);
									LCD_ShowString(123,y,200,2,16,"-");  
									  LCD_ShowxNum(136,y,timeSFM[2],2,16,0x80);
									LCD_ShowString(156,y,200,2,16,"-");  	
									  LCD_ShowxNum(169,y,timeSFM[3],2,16,0x80);
									break;									
					}
						
						//break ;								
					
					
				}
				break; 

							
			}
		}//else delay_ms(10); 
		
		
	
	} 
}

其他可自行拓展
附上源码:https://pan.baidu.com/s/1NUk3LNTfpOFReirQNf7D2w
提取码:wvm0

  • 11
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十三指肠溃疡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值