#include"main.h" const uint32_t SEG_SegPins[]= { GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_2,GPIO_PIN_3,GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_7, }; const uint32_t SEG_DigPins[]= { GPIO_PIN_8,GPIO_PIN_9,GPIO_PIN_10,GPIO_PIN_11, }; void Seg_Init(void); void Seg_DisplaySingleDigit(uint8_t n); void Seg_DynamicScan(uint8_t n1,uint8_t n2,uint8_t n3,uint8_t n4); int main(void) { uint32_t tsStart; uint32_t counter=0; uint8_t n1,n2,n3,n4; HAL_Init(); Seg_Init(); while(1) { tsStart=HAL_GetTick(); n1=(counter/1000)%10; n2=(counter/100)%10; n3=(counter/10)%10; n4=counter%10; while(HAL_GetTick()-tsStart >=1000) { Seg_DynamicScan(n1,n2,n3,n4); } counter++; } } void Seg_Init(void) { GPIO_InitTypeDef gpioinit; uint32_t i; //1.初始化数码管的段选引脚 gpioinit.Mode=GPIO_MODE_OUTPUT_PP; gpioinit.Speed=GPIO_SPEED_FREQ_LOW; __HAL_RCC_GPIOA_CLK_ENABLE(); for(i=0;i<8;i++) { gpioinit.Pin=SEG_SegPins[i]; HAL_GPIO_WritePin(GPIOA,SEG_SegPins[i],GPIO_PIN_RESET); HAL_GPIO_Init(GPIOA,&gpioinit); } //2.初始化数码管的位选引脚 gpioinit.Mode=GPIO_MODE_OUTPUT_PP; gpioinit.Speed=GPIO_SPEED_FREQ_LOW; __HAL_RCC_GPIOA_CLK_ENABLE(); for(i=0;i<4;i++) { gpioinit.Pin=SEG_DigPins[i]; HAL_GPIO_WritePin(GPIOA,SEG_DigPins[i],GPIO_PIN_SET); HAL_GPIO_Init(GPIOA,&gpioinit); } } void Seg_DisplaySingleDigit(uint8_t n) { const uint8_t font[]= { 0x3f,0x06,0x5B,0x4F,0x66,0x6D,0X7D,0X07,0X7F,0X6F }; uint32_t i; for(i=0;i<8;i++) { if((font[n] & (0x1 << i))!=0) { HAL_GPIO_WritePin(GPIOA,SEG_SegPins [i],GPIO_PIN_SET); } else { HAL_GPIO_WritePin(GPIOA,SEG_SegPins [i],GPIO_PIN_RESET); } } } void Seg_DynamicScan(uint8_t n1,uint8_t n2,uint8_t n3,uint8_t n4) { uint32_t i, j; uint8_t numbers[4]; numbers[0]=n1; numbers[1]=n2; numbers[2]=n3; numbers[3]=n4; for(i=0;i<4;i++) { for(j=0;j<4;j++) { HAL_GPIO_WritePin(GPIOA,SEG_DigPins[j],GPIO_PIN_SET); } Seg_DisplaySingleDigit(numbers[i]); HAL_GPIO_WritePin(GPIOA,SEG_DigPins[i],GPIO_PIN_RESET); HAL_Delay(10); } } |
没有电路图/没有数码管的资料也不好分析的。需要区分共阴还是共阳,供电电压/电流是否符合? 建议先单独点亮某一划来确认下问题所在。
也可以挂着示波器单独调试一下,看看问题出在哪里
也可以挂着示波器单独调试一下,看看问题出在哪里
没有电路图/没有数码管的资料也不好分析的。需要区分共阴还是共阳,供电电压/电流是否符合? 建议先单独点 ...
共阴的,所有的比划都点亮了是正常的,A0-A7接的8个段选引脚。A8-A11接的4个位选引脚。
也可以挂着示波器单独调试一下,看看问题出在哪里
所有的比划都点亮了是正常的,A0-A7接的8个段选引脚。A8-A11接的4个位选引脚。共阴的。
共阴的,所有的比划都点亮了是正常的,A0-A7接的8个段选引脚。A8-A11接的4个位选引脚。 ...
延时那部分检查下。
延时那部分检查下。
能帮检查指导下吗?我检查了好几遍没有发现问题
while(1) { tsStart=HAL_GetTick(); n1=(counter/1000)%10; n2=(counter/100)%10; n3=(counter/10)%10; n4=counter%10; while(HAL_GetTick()-tsStart >=1000) { Seg_DynamicScan(n1,n2,n3,n4); } counter++; } 红色部分能执行??????
while(1) { tsStart=HAL_GetTick();
先获取滴答定时器当前的时间是多少多少毫秒减去一刚开头记时的时间,如果这两个时间的差值大于1000的话。也就表示我刚开始计时到本次的时候,时间已经过去了1s。然后等完一秒后,我的counter自动加1。while循环里面就是用来做的刷新。