#申请原创#
在通常的情况下,我们所用的显示器件多是数码管、液晶屏等。但在公共场合则需要使用较大尺寸规格的显示器件。 通常情况下,告广牌是由半板拼接而成,这里是选用一款P4.75的红色点阵板,其显示分辨率为16*64像素点。
图1 点阵屏外观
该点阵板采用的接口方式为HUB08,各引脚的名称如图2所示。 图2 HUB08接口
点阵板与开发板的引脚连接关系为: A ---- PA10 B ---- PA11 C ---- PA12 D ----PA15 R1 ---- PB5 CLK---- PB6 EN ---- PB7 STB---- PB8 所用引脚的工作模式配置函数为: 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 硬件构成及显示效果
|