本帖最后由 jinglixixi 于 2023-7-20 00:48 编辑
#申请原创#
在通常的情况下,我们所所用的显示器件多是数码管、液晶屏、OLED屏及TFT屏。但在公共场合要显示信息,就要有较大尺寸以便观察。 通常多使用半板来拼接成较大的广告牌,这里使用的是一款P4.75的红色点阵板,其显示分辨率为16*64像素点。
图1 点阵屏外观
该点阵屏采用的接口方式为HUB08,各引脚的名称如图2所示。 图2 HUB08接口
图3 硬件构成
该点阵屏与开发板的连接关系为: A----PB5 B----PB3 C----PB4 D----PB6 R1----PA8 CLK----PB7 EN ----PA2 STB----PA3
所用引脚输出高低电平的语句定义为: #defineLA_high GPIO_SetPinLevel(GPIOB,GPIO_PIN5, GPIO_LEVEL_HIGH) #defineLA_low GPIO_SetPinLevel(GPIOB,GPIO_PIN5, GPIO_LEVEL_LOW) #defineLB_high GPIO_SetPinLevel(GPIOB,GPIO_PIN3, GPIO_LEVEL_HIGH) #defineLB_low GPIO_SetPinLevel(GPIOB,GPIO_PIN3, GPIO_LEVEL_LOW) #defineLC_high GPIO_SetPinLevel(GPIOB,GPIO_PIN4, GPIO_LEVEL_HIGH) #defineLC_low GPIO_SetPinLevel(GPIOB,GPIO_PIN4, GPIO_LEVEL_LOW) #defineLD_high GPIO_SetPinLevel(GPIOB,GPIO_PIN6, GPIO_LEVEL_HIGH) #defineLD_low GPIO_SetPinLevel(GPIOB,GPIO_PIN6, GPIO_LEVEL_LOW) #defineLR1_high GPIO_SetPinLevel(GPIOA,GPIO_PIN8, GPIO_LEVEL_HIGH) #defineLR1_low GPIO_SetPinLevel(GPIOA,GPIO_PIN8, GPIO_LEVEL_LOW) #defineCLK_high GPIO_SetPinLevel(GPIOB,GPIO_PIN7, GPIO_LEVEL_HIGH) #defineCLK_low GPIO_SetPinLevel(GPIOB,GPIO_PIN7, GPIO_LEVEL_LOW) #defineLEN_high GPIO_SetPinLevel(GPIOA, GPIO_PIN2,GPIO_LEVEL_HIGH) #defineLEN_low GPIO_SetPinLevel(GPIOA,GPIO_PIN2, GPIO_LEVEL_LOW) #defineLSTB_high GPIO_SetPinLevel(GPIOA,GPIO_PIN3, GPIO_LEVEL_HIGH) #defineLSTB_low GPIO_SetPinLevel(GPIOA,GPIO_PIN3, GPIO_LEVEL_LOW)
所用引脚的初始化函数为: - void dzb_GPIO(void)
- {
- GPIO_SetFunc(GPIOB, GPIO_PIN3, GPIO_FUN0);
- GPIO_SetFunc(GPIOB, GPIO_PIN4, GPIO_FUN0);
- GPIO_SetFunc(GPIOB, GPIO_PIN5, GPIO_FUN0);
- GPIO_SetFunc(GPIOB, GPIO_PIN6, GPIO_FUN0);
- GPIO_SetFunc(GPIOB, GPIO_PIN7 , GPIO_FUN0);
- GPIO_SetFunc(GPIOA, GPIO_PIN8, GPIO_FUN0);
- GPIO_SetFunc(GPIOA, GPIO_PIN2, GPIO_FUN0);
- GPIO_SetFunc(GPIOA, GPIO_PIN3, GPIO_FUN0);
- GPIO_SetDir(GPIOB, GPIO_PIN3, GPIO_OUT);
- GPIO_SetDir(GPIOB, GPIO_PIN4, GPIO_OUT);
- GPIO_SetDir(GPIOB, GPIO_PIN5, GPIO_OUT);
- GPIO_SetDir(GPIOB, GPIO_PIN6, GPIO_OUT);
- GPIO_SetDir(GPIOB, GPIO_PIN7, GPIO_OUT);
- GPIO_SetDir(GPIOA, GPIO_PIN8, GPIO_OUT);
- GPIO_SetDir(GPIOA, GPIO_PIN2, GPIO_OUT);
- GPIO_SetDir(GPIOA, GPIO_PIN3, GPIO_OUT);
- }
点阵板发送数据的函数为: - 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;
- u8 sj[]={0x01,0x02,0x0A,0x03,0x00,0x0A,0x03,0x00};
- 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,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*"3",3*/
- 0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00,/*"4",4*/
- 0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00,/*"5",5*/
- 0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*"6",6*/
- 0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,/*"7",7*/
- 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*"8",8*/
- 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,
- };
实现显示输出的函数为: - int main(void)
- {
- InitDelay();
- InitDebug();
- TIMER_PrdInit();
- mdelay(200);
- dzb_GPIO();
- ScanRow=0;
- while (1)
- {
- Display();
- mdelay(1);
- }
- }
经程序的编译与下载,其执行效果如图4所示。 图4 电子时钟显示效果
|