在公共场合,通常的显示器件将难以发挥功效,此时则需要点阵显示器件出场。常见的广告牌是由一种称为半板的器件拼接而成的,它就是典型的点阵显示板。半板也分多种类型,这里是选取P4.75型的红色显示板作为驱动目标,其显示分辨率为16*64像素点,外观见图1所示。

图1 点阵板外观
该显示板所采用的接口为HUB08方式,其排列顺序及名称见图2所示。

图2 HUB08接口
为驱动该显示板,它与开发板的引脚连接关系为:
A---- PA2
B---- PA5
C---- PB4
D---- PB5
R1 ---- PB12
CLK---- PB11
EN ---- PB14
STB---- PB13
对所用引脚的配置函数为:
void DZB_CONFIG()
{
GPIO_Init(GPIOA, PIN2, 1, 0, 0, 0);
GPIO_Init(GPIOA, PIN5, 1, 0, 0, 0);
GPIO_Init(GPIOB, PIN4, 1, 0, 0, 0);
GPIO_Init(GPIOB, PIN5, 1, 0, 0, 0);
GPIO_Init(GPIOB, PIN11, 1, 0, 0, 0);
GPIO_Init(GPIOB, PIN12, 1, 0, 0, 0);
GPIO_Init(GPIOB, PIN13, 1, 0, 0, 0);
GPIO_Init(GPIOB, PIN14, 1, 0, 0, 0);
}所用引脚输出高低电平的语句定义为:
#define LA_high GPIO_SetBit(GPIOA, PIN2)
#define LA_low GPIO_ClrBit(GPIOA, PIN2)
#define LB_high GPIO_SetBit(GPIOA, PIN5)
#define LB_low GPIO_ClrBit(GPIOA, PIN5)
#define LC_high GPIO_SetBit(GPIOB, PIN4)
#define LC_low GPIO_ClrBit(GPIOB, PIN4)
#define LD_high GPIO_SetBit(GPIOB, PIN5)
#define LD_low GPIO_ClrBit(GPIOB, PIN5)
#define LR1_high GPIO_SetBit(GPIOB, PIN12)
#define LR1_low GPIO_ClrBit(GPIOB, PIN12)
#define CLK_high GPIO_SetBit(GPIOB, PIN11)
#define CLK_low GPIO_ClrBit(GPIOB, PIN11)
#define LSTB_high GPIO_SetBit(GPIOB, PIN13)
#define LSTB_low GPIO_ClrBit(GPIOB, PIN13)
#define LEN_high GPIO_SetBit(GPIOB, PIN14)
#define LEN_low GPIO_ClrBit(GPIOB, PIN14)
向显示板发送字节数据的函数为:
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 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 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;
}
}在模拟电子时钟效果时,电子时钟的显示数据被存放在数组中,并通过调用函数Display()来显示,对应的显示函数为:
void ShowTime(void)
{
sj[0]= 1;
sj[1]= 2;
sj[2]= 10;
sj[3]= 3;
sj[4]= 0;
sj[5]= 10;
sj[6]= 0;
sj[7]= 8;
Display();
}支持显示输出的函数内容为:
void Display(void)
{
DisCol(4);
LEN_high;
LSTB_high;
LSTB_low;
SeleRow(ScanRow);
LEN_low;
ScanRow++;
if(ScanRow>15) ScanRow=0;
}供显示测试的主程序为:
int main(void)
{
SystemInit();
DZB_CONFIG();
ScanRow=0;
while(1)
{
ShowTime();
}
}经程序的编译与下载,其显示效果如图3所示,说明驱动有效。

图3 测试效果
我要赚赏金
