功能要求:
(1)按下复位键后,数码管中间的横线(小灯)以一秒的速度呼吸三次,然后熄灭;
(2)小灯熄灭后按下UP键可以增加灯的亮度,按下的次数越多小灯越亮,达到最大亮度后,随着按键按下小灯亮度逐渐变暗;
(3)只能使用一个定时器。
实现代码:
- #include "stm32f10x.h"
- #include "GPIOLIKE51.h"
- #include "stm32f10x_tim.h"
- #include "stm32f10x_rcc.h"
- #include "stm32f10x_exti.h"
- uint16_t i=0;
- uint8_t j;
- //函数声明
- void TIM3_Config();
- void PWM_Config();
- void GPIO_Config();
- void delay(uint32_t n);
- void GPIO_Config_UP();
- void EXTI_Congig_UP();
- int main(void)
- {
- TIM3_Config();
- PWM_Config();
- GPIO_Config();
- GPIO_Config_UP();
- EXTI_Congig_UP();
- while(1){}
- }
- //KEY_UP
- void EXTI_Congig_UP(){
- EXTI_InitTypeDef a;
- NVIC_InitTypeDef b;
-
- a.EXTI_Line=EXTI_Line0;
- a.EXTI_LineCmd=ENABLE;
- a.EXTI_Mode=EXTI_Mode_Interrupt;
- a.EXTI_Trigger=EXTI_Trigger_Rising;
- EXTI_Init(&a);
-
- b.NVIC_IRQChannel=EXTI0_IRQn;
- b.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&b);
- }
- //KEY_LEFT的中断服务函数
- void EXTI0_IRQHandler(){
- if(i<=0){
- j++;
- i=0;
- }
- if(i>=1000){
- j++;
- i=1000;
- }
- if(j%2==1){
- i+=50;
- delay(10000);
- TIM_SetCompare1(TIM3,i);
- }
- else{
- i-=50;
- delay(10000);
- TIM_SetCompare1(TIM3,i);
- }
-
- EXTI_ClearFlag(EXTI_Line0); //清除中断标志位
- EXTI_ClearITPendingBit(EXTI_Line0);//更新中断标志位
- }
- //延时函数
- void delay(uint32_t n){
- for(;n!=0;n--);
- }
- //定时器TIM3配置
- void TIM3_Config(){
- TIM_TimeBaseInitTypeDef a;
- NVIC_InitTypeDef b;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
-
- a.TIM_ClockDivision=TIM_CKD_DIV1;
- a.TIM_CounterMode=TIM_CounterMode_Up;
- //定时1ms
- a.TIM_Period=1000-1;
- a.TIM_Prescaler=72-1;
-
- b.NVIC_IRQChannel=TIM3_IRQn;
- b.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&b);
-
- TIM_TimeBaseInit(TIM3,&a);
- TIM_Cmd(TIM3,ENABLE);//启动定时器
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//配置中断
- }
- //TIM3中断服务函数
- void TIM3_IRQHandler(){
- if(j<7){
- if(i<=0||i>=1000){
- j++;
- }
- if(j%2==0){
- i-=2;
- TIM_SetCompare1(TIM3,i);
- }
- else{
- i+=2;
- TIM_SetCompare1(TIM3,i);
- }
- }
- else{
- TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);//关闭中断
- }
- TIM_ClearFlag(TIM3,TIM3_IRQn);
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
- }
- //PWM波配置
- void PWM_Config(){
- TIM_OCInitTypeDef a;
-
- a.TIM_OCMode=TIM_OCMode_PWM1;
- a.TIM_OutputState=ENABLE;
- TIM_OC1Init(TIM3,&a);
- }
- //GPIO_C6配置
- void GPIO_Config(){
- GPIO_InitTypeDef a;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO,ENABLE);
- //接口需要启用第二功能(输出PWM波),需要配置AFIO
-
- a.GPIO_Mode=GPIO_Mode_AF_PP;
- a.GPIO_Pin=GPIO_Pin_6;
- a.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOC,&a);
- GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//完全重映像
- }
- void GPIO_Config_UP(){
- GPIO_InitTypeDef a;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
- //接口需要启用第二功能(作为外部中断的输入),需要配置AFIO
-
- a.GPIO_Mode=GPIO_Mode_IPD;
- a.GPIO_Pin=GPIO_Pin_0;
- a.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&a);
- }
复制代码
————————————————
版权声明:瑶台月下逢
|