#include "SN_Tool_LedDisplay.h" /* 文件名:SN_Tool_LedDisplay.c/.h 作者: SN_FAE_黄泽洪 免责声明:无版权,可随意传播和篡改,该代码仅供开发参考,如需使用请自行验证 本人不担负商业使用上带来的风险。 */ /* 演示方式: int main(void) { SN_SYSCLK_set(SYSCLK_48MHZ);//配置系统时钟 std_delay_init();// Systick初始化 std_delayms(3000); //必须延时,例程使用了PA2仿真口,除非引出复位引脚 SN_Tool_LedDisplay_Init(); //初始化数码管引脚设置 SN_TIM1_CALL_set(200 ,TIM1_AGAIN_WORK ,SN_LED_Dis_point,NVIC_PRIO_0); //设置一个定时函数,定时刷新数码管,SN_LED_Dis_point()是数码管打点函数,每次中断打一个亮点 while(1) { SN_DisPlay_Number(123); std_delayms(500); SN_DisPlay_Number(4567); std_delayms(500); SN_DisPlay_Clear(); std_delayms(500); SN_DisPlay_Number(6284); std_delayms(500); } } */ /* 4位数码管,共阴型号 ELF-5461AW 。 ----------------------硬件引脚分配--------------------------- 位选 PB0 - PB3 状态只有推挽置高 推挽置低 4 : PB0 3 : PB1 2 : PB2 1 : PB3 段码 PA0 - PA7 状态只有推挽置高 推挽置高 a : PA0 b : PA1 c : PA2 d : PA3 e : PA4 f : PA5 g : PA6 dp : PA7 注意:该演示代码直接使用寄存器,不适合移植和修改IO引脚,仅供演示!! 段码亮的状态 位选为推挽置低 段码为推挽置高 段码暗的状态 位选为推挽置高 段码为推挽置高 */ //4位数码管,字符编码表(共阴): uint8_t SN_CODE_G_DisPlay[10] = { 0X3F,//"0" 0X06,//"1" 0X5B,//"2" 0X4F,//"3" 0X66,//"4" 0X6D,//"5" 0X7D,//"6" 0X07,//"7" 0X7F,//"8" 0X6F,//"9" }; //打点数据 __IO uint8_t SN_CODE_G_Point[4]={0}; //当前使用的COM位 __IO uint8_t SN_G_COM = 0XFF; /* 函数名:SN_Tool_LedDisplay_Init 功能:初始数码管使用的IO 参数:无 返回值:无 */ void SN_Tool_LedDisplay_Init(void){ /*设置数码管引脚*/ //设置位选 PB0-PB3 std_gpio_init_t gpio_config = {0}; /* 使能位选对应的GPIO时钟 */ std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOB); /* 配置IO */ gpio_config.pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3; gpio_config.mode = GPIO_MODE_OUTPUT; gpio_config.pull = GPIO_PULLUP; gpio_config.output_type = GPIO_OUTPUT_PUSHPULL; /* 初始化GPIOB */ std_gpio_init(GPIOB, &gpio_config); //设置段码 PA0-PA7 /* 使能段码对应的GPIO时钟 */ std_rcc_gpio_clk_enable(RCC_PERIPH_CLK_GPIOA); /* 配置IO */ gpio_config.pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 \ |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; gpio_config.mode = GPIO_MODE_OUTPUT; gpio_config.pull = GPIO_PULLDOWN ; gpio_config.output_type = GPIO_OUTPUT_PUSHPULL; /* 初始化GPIOA */ std_gpio_init(GPIOA, &gpio_config); //禁止输出 std_gpio_set_pin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); std_gpio_reset_pin(GPIOA,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); } /* 函数名:SN_LED_Dis_point 功能:用于点亮单独的LED灯 参数:无 返回值:无 点对应的段码LED,动态扫描的打点函数,定时器中断调用。 每次中断处理一个点,直到32个点完全打完 本文件不实现定时中断,直接调用SN_TIM1_INIT.C的接口 */ void SN_LED_Dis_point(void){ static uint8_t pt = 25; uint32_t temp = 0; //"pt归零" if(pt > 31 ) { pt = 0; return ;} //关闭seg,修改COM前必须要提前关闭seg,否则有残影 GPIOA->ODR = 0X00; //对应bit设置成推挽置1 关闭所有的seg //选择COM口,被选中的COM推挽置低,其他的设置成模拟输入模式 GPIOB->ODR |= 0X0000000F; //全部置成1 temp = 1U << (pt >> 3) ; //选择bit位 GPIOB->ODR &= (~temp); //设置对应比特位 = 0 //设置seg temp = 0; //根据缓冲区的数据,设置推挽置高 if( ( SN_CODE_G_Point[(pt >> 3)] >> (pt % 8)) & 0x01 ){ temp = 1U << (pt % 8) ; //设置置高的seg位 GPIOA->ODR = temp; } //"pt自增" pt++; } /* 函数名:SN_DisPlay_Clear 功能:清除显示内容 参数:无 返回值:无 */ void SN_DisPlay_Clear(void){ //填充编码到打点区,过程禁止中断响应 __disable_irq (); SN_CODE_G_Point[0]= 0; SN_CODE_G_Point[1]= 0; SN_CODE_G_Point[2]= 0; SN_CODE_G_Point[3]= 0; __enable_irq(); } /* 函数名:SN_DisPlay_Number 功能:显示数字内容 参数:0-9999 返回值:无 注意:添加小数点就在对应的com数据后面 SN_CODE_G_Point[x]|= 0X80 由此点亮dp位 */ void SN_DisPlay_Number(uint16_t num){ //拆分个十百千 uint8_t GW = 0; //个位 uint8_t SW = 0; //十位 uint8_t BW = 0; //百位 uint8_t QW = 0; //千位 QW = (uint8_t) (num / 1000); //千位 BW = (uint8_t) ((num / 100) % 10); //百位 SW = (uint8_t) ((num / 10) % 10); //十位 GW = (uint8_t) (num % 10); //个位 //填充编码到打点区,过程禁止中断响应 __disable_irq (); SN_CODE_G_Point[0]= SN_CODE_G_DisPlay[GW] ; //个位 if(num>9) {SN_CODE_G_Point[1]= SN_CODE_G_DisPlay[SW] ;}else{SN_CODE_G_Point[1]= 0;} //十位 if(num>99){SN_CODE_G_Point[2]= SN_CODE_G_DisPlay[BW] ;}else{SN_CODE_G_Point[2]= 0;} //百位 if(num>999 ){SN_CODE_G_Point[3]= SN_CODE_G_DisPlay[QW] ;}else{SN_CODE_G_Point[3]= 0;} //千位 __enable_irq(); }