本帖最后由 jinglixixi 于 2023-8-8 22:47 编辑
#申请原创#
在通常的情况下,我们所所用的显示器件多是数码管、液晶屏、OLED屏及TFT屏。但在公共场合要显示信息,就要有较大尺寸以便观察。 通常多使用半板来拼接成较大的广告牌,这里使用的是一款P4.75的红色点阵板,其显示分辨率为16*64像素点。
图1 点阵屏外观
该点阵屏采用的接口方式为HUB08,各引脚的名称如图2所示。 图2 HUB08接口
图3 硬件构成
该点阵屏与开发板的连接关系为: A ----PB0 B ----PB14 C ----PB2 D ----PA12 R1 ----PB3 CLK----PB4 EN ----PA9 STB----PA15
图4 所用接口
所用引脚输出高低电平的语句定义为: #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 dzb_GPIO_Init(void)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_10|GPIO_PIN_14;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_12|GPIO_PIN_15;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
点阵板发送数据的函数为: void OutByte(u16 dat)
{
u8 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(u16 lenght)
{
u16 dat;
u8 m=0;
while(lenght--)
{
dat=(S[sj[m+1]*16+ScanRow]<<8)+S[sj[m]*16+ScanRow];
OutByte(dat);
m=m+2;
}
}
输出行地址的函数为: void SeleRow(u8 Nd)
{
u8 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;
}
为实现数字符号的显示,以字模提取软件所构建的字库存储结构为: u8 S[]={ 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"0",0*/ 0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"1",1*/ 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00,/*"2",2*/ ... 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00,/*"9",9*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,/*":",10*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",11*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",12*/ };
读取RTC计时值函数为: static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
{
RTC_DateTypeDef sdatestructureget;
RTC_TimeTypeDef stimestructureget;
HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
sj[0]=stimestructureget.Hours/10;
sj[1]=stimestructureget.Hours%10;
sj[3]=stimestructureget.Minutes/10;
sj[4]=stimestructureget.Minutes%10;
sj[6]=stimestructureget.Seconds/10;
sj[7]=stimestructureget.Seconds%10;
Display();
}
实现显示输出效果的函数为: int main(void)
{
HAL_Init();
SystemClock_Config();
MX_RTC_Init();
MX_ICACHE_Init();
RTCStatus = 1;
dzb_GPIO_Init();
ScanRow=0;
while (1)
{
RTC_CalendarShow(aShowTime, aShowDate);
}
}
经程序的编译与下载,其执行效果如图4所示。在添加字库的情况下,其汉字显示效果如图5所示。
图5 显示效果
视频演示:
|