#include <stm32f10x.h>
uint8_t seg8[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xa7, 0xa1, 0x86, 0x8e};
void ser_in(uint8_t data) { uint8_t i; for (i = 0; i < 8; i++) { GPIO_ResetBits(GPIOB, GPIO_Pin_9); // SCLK=>PB9 if (data & 0x80) GPIO_SetBits(GPIOB, GPIO_Pin_7); // DIO=>PB7 else GPIO_ResetBits(GPIOB, GPIO_Pin_7); data <<= 1; GPIO_SetBits(GPIOB, GPIO_Pin_9); } }
void par_out(void) { GPIO_ResetBits(GPIOB, GPIO_Pin_8); // RCLK=>PB8 GPIO_SetBits(GPIOB, GPIO_Pin_8); }
int main(void) { GPIO_InitTypeDef gpio; TIM_TimeBaseInitTypeDef tim; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP | RCC_APB1Periph_TIM6, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); PWR_BackupAccessCmd(ENABLE); // 允许写入Backup寄存器 RCC_BackupResetCmd(ENABLE); // 复位Backup Domain RCC_BackupResetCmd(DISABLE); // 必须清除复位标志, 否则下面的RCC_RTCCLKConfig函数会执行失败 //RCC_ITConfig(RCC_IT_LSIRDY, ENABLE); // 开LSI就绪中断 //NVIC_EnableIRQ(RCC_IRQn); RCC_LSICmd(ENABLE); // 开LSI晶振 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); // RTC选LSI时钟 RCC_RTCCLKCmd(ENABLE); // 开RTC时钟 RTC_SetCounter(0x12345678); // 设置新时钟值 RTC_WaitForLastTask(); // 等待设置完毕 // 数码管扫描管脚配置 gpio.GPIO_Mode = GPIO_Mode_Out_PP; gpio.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); // 数码管扫描中断 TIM_TimeBaseStructInit(&tim); tim.TIM_Period = 24; tim.TIM_Prescaler = 7199; TIM_TimeBaseInit(TIM6, &tim); TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); TIM_Cmd(TIM6, ENABLE); NVIC_EnableIRQ(TIM6_IRQn); while (1); }
void TIM6_IRQHandler(void) { static uint8_t i = 0; static uint32_t n; if (i == 0) n = RTC_GetCounter(); if (TIM_GetFlagStatus(TIM6, TIM_FLAG_Update) == SET) { TIM_ClearFlag(TIM6, TIM_FLAG_Update); ser_in(seg8[n & 0x0f]); ser_in(1 << i); par_out(); n >>= 4; i = (i + 1) % 8; } }
/* void RCC_IRQHandler(void) { if (RCC_GetITStatus(RCC_IT_LSIRDY) == SET) { RCC_ClearITPendingBit(RCC_IT_LSIRDY); // 清中断标志位 } } */
|