- void dzp_CONFIG(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- __RCC_GPIOC_CLK_ENABLE();
- GPIO_InitStruct.IT = GPIO_IT_NONE;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pins = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7| GPIO_PIN_8;
- GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pins = GPIO_PIN_10 | GPIO_PIN_11| GPIO_PIN_12| GPIO_PIN_15;
- GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
- }
所用引脚输出高低电平的语句定义为:
#defineLA_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0, GPIO_PIN_SET)
#defineLA_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0, GPIO_PIN_RESET)
#defineLB_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14, GPIO_PIN_SET)
#defineLB_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14, GPIO_PIN_RESET)
#defineLC_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2, GPIO_PIN_SET)
#defineLC_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2, GPIO_PIN_RESET)
#defineLD_high HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12, GPIO_PIN_SET)
#defineLD_low HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12, GPIO_PIN_RESET)
#defineLR1_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3, GPIO_PIN_SET)
#defineLR1_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3, GPIO_PIN_RESET)
#defineCLK_high HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4, GPIO_PIN_SET)
#defineCLK_low HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4, GPIO_PIN_RESET)
#defineLEN_high HAL_GPIO_WritePin(GPIOA,GPIO_PIN_9, GPIO_PIN_SET)
#defineLEN_low HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9,GPIO_PIN_RESET)
#defineLSTB_high HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15, GPIO_PIN_SET)
#defineLSTB_low HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15, GPIO_PIN_RESET)
点阵板发送数据的函数为:
- void OutByte(uint16_t dat)
- {
- uint8_t i=0 ;
- for(i=0;i<16;i++)
- {
- CLK_low;
- if(dat&0x0001)
- {
- LR1_high;
- }
- else
- {
- LR1_low;
- }
- dat=dat>>1;
- CLK_high;
- }
- }
发送多列数据的函数为:
- void DisCol(uint16_t lenght)
- {
- uint16_t dat;
- uint8_t m=0;
- while(lenght--)
- {
- dat=(S[sj[m+1]*16+ScanRow]<<8)+S[sj[m]*16+ScanRow];
- OutByte(dat);
- m=m+2;
- }
- }
输出行地址的函数为:
- void SeleRow(uint8_t Nd)
- {
- uint8_t N;
- N=Nd;
- N=N%16;
- if(N&0x01) LA_high;
- else LA_low;
- if (N&0x02) LB_high;
- else LB_low;
- if (N&0x04) LC_high;
- else LC_low;
- if (N&0x08) LD_high;
- else LD_low;
- }
实现显示输出的函数为:
- void Display(void)
- {
- DisCol(4);
- LEN_high;
- LSTB_high;
- LSTB_low;
- SeleRow(ScanRow);
- LEN_low;
- ScanRow++;
- if(ScanRow>15) ScanRow=0;
- }
读取RTC计时值并加以显示的函数为:
- void ShowTime(void)
- {
- RTC_TimeTypeDef RTC_TimeStruct = {0};
- RTC_DateTypeDef RTC_DateStruct = {0};
- RTC_GetDate(&RTC_DateStruct);
- RTC_GetTime(&RTC_TimeStruct);
- sj[0]= RTC_TimeStruct.Hour /10;
- sj[1]= RTC_TimeStruct.Hour %10;
- sj[3]= RTC_TimeStruct.Minute /10;
- sj[4]= RTC_TimeStruct.Minute %10;
- sj[6]= RTC_TimeStruct.Second /10;
- sj[7]= RTC_TimeStruct.Second %10;
- Display();
- }
实现显示输出的主程序为:
- int32_t main(void)
- {
- RTC_InitTypeDef RTC_InitStruct = {0};
- RTC_AlarmTypeDef RTC_AlarmStruct = {0};
- RCC_Configuration();
- GPIO_Configuration();
- NVIC_Configuration();
- RCC_LSE_Enable(RCC_LSE_MODE_OSC, RCC_LSE_AMP_NORMAL, RCC_LSE_DRIVER_NORMAL);
- RTC_InitStruct.DateStruct.Day = 0x26; RTC_InitStruct.DateStruct.Month =10;
- RTC_InitStruct.DateStruct.Week = 4;
- RTC_InitStruct.DateStruct.Year = 0x23;
- RTC_InitStruct.TimeStruct.Hour = 0x12;
- RTC_InitStruct.TimeStruct.Minute = 0x20;
- RTC_InitStruct.TimeStruct.Second = 0x00;
- RTC_InitStruct.TimeStruct.AMPM = 0;
- RTC_InitStruct.TimeStruct.H24 = 0;
- RTC_InitStruct.RTC_ClockSource = RTC_RTCCLK_FROM_LSE;
- RTC_Init(&RTC_InitStruct);
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- RCC_HSI_Enable(RCC_HSIOSC_DIV6);
- __RCC_GPIOC_CLK_ENABLE();
- dzp_CONFIG();
- ScanRow=0;
- while (1)
- {
- ShowTime();
- }
- }
图3 硬件构成及显示效果