在开发板的LED例程中介绍说是一个LED屏的控制卡示例,由于缺少详细的使用,故而无法弄清其具体的用法。
为此,自己动手制作了一个16*64点阵板的驱动程序,并以此来实现滚动字幕的显示效果。
该点阵板是一款P3.75的红色点阵板,其外观如图1所示。
图1 点阵屏外观
该点阵板所采用的接口方式为HUB08,各引脚的排列如图2所示。
图2 HUB08接口
点阵板与开发板的引脚连接关系为:
A ---- PA0
B ---- PA1
C ---- PA2
D ----PA3
R1 ---- PA5
CLK----PA6
OE ---- PA7
LAT---- PA8
所用引脚的工作模式配置函数为:
void dzb_Init(void)
{
GPIOA_ModeCfg( GPIO_Pin_4, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_0, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_1, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_2, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_3, GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_5 , GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_6 , GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_7 , GPIO_ModeOut_PP_5mA );
GPIOA_ModeCfg( GPIO_Pin_8 , GPIO_ModeOut_PP_5mA );
}
所用引脚输出高低电平的语句定义为:
#define LR1_high GPIOA_SetBits(GPIO_Pin_5) // R1
#define LR1_low GPIOA_ResetBits(GPIO_Pin_5)
#define CLK_high GPIOA_SetBits(GPIO_Pin_6) // CLK
#define CLK_low GPIOA_ResetBits(GPIO_Pin_6)
#define LSTB_high GPIOA_SetBits(GPIO_Pin_7) // OE
#define LSTB_low GPIOA_ResetBits(GPIO_Pin_7)
#define LEN_high GPIOA_SetBits(GPIO_Pin_8) // LAT
#define LEN_low GPIOA_ResetBits(GPIO_Pin_8)
#define LA_high GPIOA_SetBits(GPIO_Pin_0) // LA
#define LA_low GPIOA_ResetBits(GPIO_Pin_0)
#define LB_high GPIOA_SetBits(GPIO_Pin_1) // LB
#define LB_low GPIOA_ResetBits(GPIO_Pin_1)
#define LC_high GPIOA_SetBits(GPIO_Pin_2) // LC
#define LC_low GPIOA_ResetBits(GPIO_Pin_2)
#define LD_high GPIOA_SetBits(GPIO_Pin_3) // LD
#define LD_low GPIOA_ResetBits(GPIO_Pin_3)
点阵板发送数据的函数为:
void OutByte(uint16_t dat)
{
uint8_t i=0 ;
for(i=0;i<16;i++)
{
CLK_low;
if(dat&0x8000)
{
LR1_high;
}
else
{
LR1_low;
}
dat=dat<<1;
CLK_high;
}
}
发送多列数据的函数为:
void DisCol(int16_t lengh)
{
// 动态显示
int16_t dat;
int8_t m=0,s;
int32_t v=0;
m=cl;
while(lengh--)
{
v=(tab[m*32+ScanRow*2+1]<<8)+tab[m*32+ScanRow*2];
v=v<<16;
v=(v+(tab[(m+1)*32+ScanRow*2+1]<<8)+tab[(m+1)*32+ScanRow*2])<< w;
m=m+1;
dat=v>>16;
OutByte(dat);
}
}
输出行地址的函数为:
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;
}
为进行显示,所配置的字模由数组来存储,其内容为:
uint8_t tab[]={
// 金(0) 蛇(1) 迎(2) 春(3) 蛇(4) 年(5) 大(6) 吉(7) 灵(4) 蛇(5) 献(6) 瑞(7)
0x00,0x01,0x00,0x01,0x80,0x02,0x40,0x04,0x20,0x08,0x10,0x10,0xE8,0x2F,0x06,0xC1,
0x00,0x01,0xF8,0x3F,0x00,0x01,0x10,0x11,0x10,0x09,0x20,0x09,0xFE,0xFF,0x00,0x00,/"金",0/
0x20,0x10,0x10,0x10,0x10,0x10,0xFE,0x7D,0x02,0x55,0x04,0x56,0x80,0x54,0x88,0x54,
0x90,0x7C,0xA0,0x50,0xC0,0x10,0x82,0x14,0x82,0x1E,0x82,0xE2,0x7E,0x40,0x00,0x00,/"蛇",1/
... ...
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
实现显示输出的主程序为:
int main()
{
int k=0,y=0;
HSECFG_Capacitance(HSECap_18p);
SetSysClock(CLK_SOURCE_HSE_PLL_62_4MHz);
dzb_Init();
ScanRow=0;
while(1)
{
for(k=0;k<40;k++)
{
Display();
DelayMs(1);
}
if(y>15)
{
y=0;
cl=(cl+1)%8;
}
else
{
y=y+1;
}
w=y;
}
}
经程序的编译与运行,其执行效果如图3和图4所示。
图3 显示效果1
图4 显示效果2
演示视频:
更多回帖