本帖最后由 jinglixixi 于 2024-11-28 11:27 编辑
在通常的情况下,我们所用的显示器件多是数码管、液晶屏等。但在公共场合则需要使用较大尺寸规格的显示器件。 通常情况下,告广牌是由半板拼接而成,这里是选用一款P4.75的红色点阵板,其显示分辨率为16*64像素点。 图1 点阵屏外观
该点阵板采用的接口方式为HUB08,各引脚的名称如图2所示。 图2 HUB08接口
点阵板与开发板的引脚连接关系为: A---- PA5 B---- PA15 C---- PB7 D---- PA9 R1 ---- PB9 CLK---- PB8 EN ---- PA7 STB---- PA6
图3 所用接口
所用引脚的工作模式配置函数为: - void dzp_CONFIG(void)
- {
- gpio_init_type gpio_init_struct;
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
- gpio_default_para_init(&gpio_init_struct);
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_mode = GPIO_MODE_OUTPUT;
- gpio_init_struct.gpio_pins=PIO_PINS_5|GPIO_PINS_6|GPIO_PINS_7|GPIO_PINS_9|GPIO_PINS_15;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init(GPIOA, &gpio_init_struct);
- crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
- gpio_init_struct.gpio_pins = GPIO_PINS_7|GPIO_PINS_8|GPIO_PINS_9;
- gpio_init(GPIOB, &gpio_init_struct);
- }
所用引脚输出高低电平的语句定义为: - #define LA_high gpio_bits_write(GPIOA,GPIO_PINS_5,TRUE)
- #define LA_low gpio_bits_write(GPIOA,GPIO_PINS_5,FALSE)
- #define LB_high gpio_bits_write(GPIOA,GPIO_PINS_15,TRUE)
- #define LB_low gpio_bits_write(GPIOA,GPIO_PINS_15,FALSE)
- #define LC_high gpio_bits_write(GPIOB,GPIO_PINS_7,TRUE)
- #define LC_low gpio_bits_write(GPIOB,GPIO_PINS_7,FALSE)
- #define LD_high gpio_bits_write(GPIOA,GPIO_PINS_9,TRUE)
- #define LD_low gpio_bits_write(GPIOA,GPIO_PINS_9,FALSE)
- #define LR1_high gpio_bits_write(GPIOB,GPIO_PINS_9,TRUE)
- #define LR1_low gpio_bits_write(GPIOB,GPIO_PINS_9,FALSE)
- #define CLK_high gpio_bits_write(GPIOB,GPIO_PINS_8,TRUE)
- #define CLK_low gpio_bits_write(GPIOB,GPIO_PINS_8,FALSE)
- #define LEN_high gpio_bits_write(GPIOA,GPIO_PINS_7,TRUE)
- #define LEN_low gpio_bits_write(GPIOA,GPIO_PINS_7,FALSE)
- #define LSTB_high gpio_bits_write(GPIOA,GPIO_PINS_6,TRUE)
- #define LSTB_low gpio_bits_write(GPIOA,GPIO_PINS_6,FALSE)
点阵板发送数据的函数为: - 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)
- {
- sj[0]=1;
- sj[1]= 2;
- sj[2]= 10;
- sj[3]= 3;
- sj[4]= 4;
- sj[5]= 10;
- sj[6]= 5;
- sj[7]= 6;
- Display();
- }
实现显示测试的主程序为: - int32_t main(void)
- {
- dzp_CONFIG();
- ScanRow=0;
- while (1)
- {
- ShowTime();
- }
- }
经程序的编译与下载,其显示效果如图4所示。 图4 硬件构成及显示效果
此外,在变更字库及显示函数的情况下,可实现汉字的显示,其效果如图5所示。 图5 汉字显示效果
|