[LKS32 硬件] 【凌鸥创芯电机开发板LKS32MC071CBT8评测报告】+点阵板的显示驱动

[复制链接]
1452|12
 楼主| jinglixixi 发表于 2023-6-20 12:52 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-6-24 11:17 编辑

#申请原创#    @21小跑堂

LKS32MC071开发板是凌鸥创芯推出的一款面向电机控制的开发板,它采用的是一种组合结构,上层是核心板,底层则是面向电机控制的驱动板。
那么除了进行电机控制,该开发板还能用于哪方面呢?
本人是将它用在点阵板的显示驱动上,所驱动的是一款红色的P4.75点阵板,其显示规格为16*64点阵,它的外观如图1所示。
1.bmp
图1 点阵板外观

该点阵板采用的接口方式为HUB08,其引脚名称与排列方式如图2所示。
2.bmp
图2  HUB08接口

该点阵板与开发板的连接关系为:
A  ---P0.0
B  ---P0.4
C  ---P1.10
D  ---P1.11
R1 ---P0.14
OE ---P2.2
LAT ---P2.3
CLK ---P2.7

所用引脚输出高低电平的语句定义为:
#defineLR1_high   GPIO_SetBits(GPIO0,GPIO_Pin_14)
#defineLR1_low    GPIO_ResetBits(GPIO0,GPIO_Pin_14)
#defineCLK_high   GPIO_SetBits(GPIO2,GPIO_Pin_7)
#defineCLK_low    GPIO_ResetBits(GPIO2,GPIO_Pin_7)
#defineLA_high    GPIO_SetBits(GPIO0,GPIO_Pin_0)
#defineLA_low     GPIO_ResetBits(GPIO0,GPIO_Pin_0)
#defineLB_high    GPIO_SetBits(GPIO0,GPIO_Pin_4)
#defineLB_low     GPIO_ResetBits(GPIO0, GPIO_Pin_4)
#defineLC_high    GPIO_SetBits(GPIO1,GPIO_Pin_10)
#defineLC_low     GPIO_ResetBits(GPIO1,GPIO_Pin_10)
#defineLD_high    GPIO_SetBits(GPIO1,GPIO_Pin_11)
#defineLD_low     GPIO_ResetBits(GPIO1,GPIO_Pin_11)
#defineLEN_high   GPIO_SetBits(GPIO2,GPIO_Pin_2)
#defineLEN_low    GPIO_ResetBits(GPIO2,GPIO_Pin_2)
#defineLSTB_high  GPIO_SetBits(GPIO2,GPIO_Pin_3)

对所用引脚的工作模式配置函数为:

  1. void dzb_init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     GPIO_StructInit(&GPIO_InitStruct);
  5.     GPIO_StructInit(&GPIO_InitStruct);
  6.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  7.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_4|GPIO_Pin_14;
  8.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  9.         GPIO_StructInit(&GPIO_InitStruct);
  10.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  11.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_10|GPIO_Pin_11;
  12.     GPIO_Init(GPIO1, &GPIO_InitStruct);
  13.         GPIO_StructInit(&GPIO_InitStruct);
  14.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  15.     GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_7;
  16.     GPIO_Init(GPIO2, &GPIO_InitStruct);
  17. }

为了向点阵板发送16位的显示数据,所配置的函数为:
  1. void OutByte(uint16_t dat)
  2. {
  3.     uint8_t i=0 ;
  4.     for(i=0;i<16;i++)
  5.     {
  6.         CLK_low;
  7.         if(dat&0x8000)
  8.         {
  9.             LR1_high;
  10.         }
  11.         else
  12.         {
  13.             LR1_low;
  14.         }
  15.         dat=dat<<1;
  16.         CLK_high;
  17.     }
  18. }

相应的行地址输出函数为:
  1. void  SeleRow(uint8_t Nd)
  2. {
  3. uint8_t N;
  4.         N=Nd;
  5.         N=N%16;
  6. if(N&0x01)   LA_high;
  7. else  LA_low;
  8. if (N&0x02)  LB_high;
  9. else  LB_low;
  10. if (N&0x04)  LC_high;
  11. else  LC_low;
  12. if (N&0x08)  LD_high;
  13. else  LD_low;
  14. }

实现多列数据发送的函数为:
  1. voidDisCol(uint16_t dat,uint16_t len)
  2. {
  3. while(len--)
  4.     {
  5.                 OutByte(dat);
  6.     }
  7. }

进行驱动测试的函数为:
  1. void  Display(void)
  2. {
  3.         DisCol(0x5555,4);
  4.         LEN_high;
  5.         LSTB_high;
  6.         LSTB_low;
  7. SeleRow(ScanRow);
  8. LEN_low;
  9. ScanRow++;
  10.         if(ScanRow>15)  ScanRow=0;
  11. }

对应的主程序为:
  1. int main(void)
  2. {
  3.         Hardware_init();
  4.         ScanRow=0;
  5.         dzb_init();
  6.         for (;;)
  7.         {
  8. Display();
  9. }
  10. }

经程序的编译和下载,其显示效果如图3所示,说明情况正常。
3.bmp
图3测试效果

以此为基础,在添加字库的情况下,则可进行汉字的显示。
其配置的字库结构为:
uint8_tV[]={
// 远上寒山石径斜白云生处有人家 …
0x00,0x00,0xF8,0x23,0x00,0x10,0x00,0x10,0x00,0x00,0xFC,0x07,0x20,0xF1,0x20,0x11,
0x20,0x11,0x20,0x11,0x24,0x11,0x24,0x12,0x24,0x12,0x1C,0x14,0x00,0x28,0xFE,0x47,/*0*/
0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0xF8,0x03,0x00,0x02,
0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0xFE,0xFF,0x00,0x00,/*1*/
0x00,0x02,0x00,0x01,0xFE,0x7F,0x42,0x44,0xF4,0x9F,0x40,0x04,0xF8,0x3F,0x40,0x04,
0xFE,0xFF,0x20,0x08,0x10,0x13,0x88,0x20,0x46,0xC0,0x00,0x06,0x80,0x01,0x40,0x00,/*2*/
0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,
0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0x08,0x21,0xF8,0x3F,0x08,0x00,0x00,0x00,/*3*/
...
};

为配合字库的显示,需对函数DisCol() 和Display()加以调整。
修改后的DisCol()函数为:
  1. voidDisCol(uint16_t lenght)
  2. {
  3. uint16_tdat;
  4. uint8_t m=0;   // 远上寒山石径斜 白云深处有人家
  5. while(lenght--)
  6.     {
  7. dat=(V[m*32+ScanRow*2+1]<<8)+V[m*32+ScanRow*2];
  8. OutByte(dat);
  9.           m=m+1;
  10.     }
  11. }

修改后的Display()函数为:
  1. void  Display(void)
  2. {
  3. DisCol(4);
  4. LEN_high;
  5. LSTB_high;
  6. LSTB_low;
  7. SeleRow(ScanRow);
  8. LEN_low;
  9. ScanRow++;
  10. if(ScanRow>15)  ScanRow=0;
  11. }

重新编译和下载后,其显示效果见图4所示。
4.bmp
图4中文显示效果
除了文字信息的显示,数据也是显示的主要内容,为此还需为其配置一个字符库,其存储结构为:
uint8_tS[]={
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, /*" ",12*/
};

因取模方式的不同,需对OutByte()函数加以调整,其修改后的内容为:
  1. voidOut Byte (u16 dat)
  2. {
  3.     u8 i=0 ;
  4.     for(i=0;i<16;i++)
  5.     {
  6.         CLK_low;
  7.         if(dat&0x0001)
  8.         {
  9.             LR1_high;
  10.         }
  11.         else
  12.         {
  13.             LR1_low;
  14.         }
  15. dat=dat>>1;
  16. CLK_high;
  17.     }
  18. }

所对应的DisCol()函数则修改为:
  1. voidDisCol(u16 lenght)
  2. {
  3.     u16dat;
  4.     u8 m=0;
  5.     u8 sj[]={0x01,0x02,0x0A,0x03,0x00,0x0A,0x03,0x00};  // 存放显示内容  0~9:- 等
  6.     while(lenght--)
  7.     {
  8. dat=(S[sj[m+1]*16+ScanRow]<<8)+S[sj[m]*16+ScanRow];
  9. OutByte(dat);
  10.           m=m+2;
  11.     }
  12. }

所实现的数据所示效果见图5所示,当然要让时钟真的行走起来还需RTC的配合。因片内没有配置RTC计时器,以此要使用RTC计时功能需外挂DS1302这样的功能模块。
5.bmp
图5数值显示效果

nawu 发表于 2023-7-4 16:03 | 显示全部楼层
这个点阵板是通过什么种类的接口进行控制的呢
tpgf 发表于 2023-7-4 16:50 | 显示全部楼层
这种类型点阵板的驱动原理或者是电路原理是什么呢
gwsan 发表于 2023-7-4 17:10 | 显示全部楼层
显示的真不错 字库是点阵板自己就有的吗
tfqi 发表于 2023-7-4 17:24 | 显示全部楼层
看了一下 只能烧写特定字符的字库是吗
aoyi 发表于 2023-7-4 18:00 | 显示全部楼层
如果需要烧写入这个字符库的话 需要多大的空间呢
zljiu 发表于 2023-7-4 18:41 | 显示全部楼层
像这种点阵板 是不是只能显示一些非常简单的图形啊
 楼主| jinglixixi 发表于 2023-7-4 23:44 | 显示全部楼层
tfqi 发表于 2023-7-4 17:24
看了一下 只能烧写特定字符的字库是吗

字库大的话,需外观W25Q16之类的存储芯片。
 楼主| jinglixixi 发表于 2023-7-4 23:44 | 显示全部楼层
zljiu 发表于 2023-7-4 18:41
像这种点阵板 是不是只能显示一些非常简单的图形啊

多用于信息类显示
 楼主| jinglixixi 发表于 2023-7-4 23:46 | 显示全部楼层
aoyi 发表于 2023-7-4 18:00
如果需要烧写入这个字符库的话 需要多大的空间呢

建字库的话,使用W25Q16基本差不多。
 楼主| jinglixixi 发表于 2023-7-4 23:47 | 显示全部楼层
gwsan 发表于 2023-7-4 17:10
显示的真不错 字库是点阵板自己就有的吗

字库是自建的,放在程序中。
 楼主| jinglixixi 发表于 2023-7-4 23:48 | 显示全部楼层
tpgf 发表于 2023-7-4 16:50
这种类型点阵板的驱动原理或者是电路原理是什么呢

不同的厂家电路差异较大,但原理基本差不多。
 楼主| jinglixixi 发表于 2023-7-4 23:49 | 显示全部楼层
nawu 发表于 2023-7-4 16:03
这个点阵板是通过什么种类的接口进行控制的呢

基本是采用HUB08接口,主体是串并转换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

521

主题

2949

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部