[应用方案] 【我的DIY设计-多功能点阵电子信息屏制作】

[复制链接]
 楼主| jinglixixi 发表于 2023-6-26 10:16 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2023-6-26 10:25 编辑

1)包含项目方案的构想
在各种公共场合,对以点阵信息屏来发布信息。这种信息屏是以多个功能单元串接所构成的,每个功能单元既有输入接口,也有输出接口,从而有利于快速组装和扩展。
这里所用的是一款P4.75的显示板,又称半板,其显示分辨率为16*64点。
由于显示的信息量不大,故只用一块单元板即可。
在功能设计方面,是用它来显示当前时间、环境的光照强度、温度及大气压值。
为保障精确计时,所使用的是RTC模块DS1302,并利用TBK-RD8T37x开发板的触摸面板来调整RTC计时初试值、设置闹钟时间、切换功能显示等。
用于光照强度检测的传感器为BH1750,用于温度、大气压检测的为BMP085。

2)设计、搭建
该设计以MDK为开发工具,并配以ISP烧录软件来下载程序。
1.jpg
图1  MDK开发界面

2.jpg
图2  程序下载界面

在硬件设计方面,其构成如图3所示。

3.jpg
图3 结构框图

3)调试流程
在开发过程中,首先要解决的是点阵信息屏的驱动问题。
点阵信息屏与开发板的连接关系为:
A---P47
B---P46
C---P45
D---P44
OE---P14
R1---P15
STB---P16
SCL---P17

4.jpg
图4 所用接口

相应引脚的语句定义为:
#define LA P47
#define LB P46
#define LC P45
#define LD P44
#define OE P14
#define LR1  P15
#define STB  P16
#define CLK  P17

所用引脚的配置函数为:
  1. void SC_GPIO_Init(void)
  2. {
  3.         GPIO_Init(GPIO4, GPIO_PIN_7,GPIO_MODE_OUT_PP);
  4.         GPIO_Init(GPIO4, GPIO_PIN_6,GPIO_MODE_OUT_PP);
  5.         GPIO_Init(GPIO4, GPIO_PIN_5,GPIO_MODE_OUT_PP);
  6.         GPIO_Init(GPIO4, GPIO_PIN_4,GPIO_MODE_OUT_PP);
  7.         GPIO_Init(GPIO1, GPIO_PIN_7,GPIO_MODE_OUT_PP);
  8.         GPIO_Init(GPIO1, GPIO_PIN_6,GPIO_MODE_OUT_PP);
  9.         GPIO_Init(GPIO1, GPIO_PIN_5,GPIO_MODE_OUT_PP);
  10.         GPIO_Init(GPIO1, GPIO_PIN_4,GPIO_MODE_OUT_PP);
  11. }

点阵屏发送数据的函数为:
  1. void OutByte(uint16_t dat)
  2. {
  3.     uint8_t i=0 ;
  4.     for(i=0;i<16;i++)
  5.     {
  6.         CLK=LED_OFF;
  7.         Delay(0x0010);
  8.         if(dat&0x0001)
  9.         {
  10.             LR1=LED_ON;
  11.         }
  12.         else
  13.         {
  14.             LR1=LED_OFF;
  15.         }
  16.         dat=dat>>1;
  17.         Delay(0x0010);
  18.         CLK=LED_ON;
  19.     }
  20. }

发送各列数据的函数为:
  1. void DisCol(uint16_t lenght)
  2. {
  3.     uint16_t dat;
  4.     uint8_t m=0;
  5.     while(lenght--)
  6.     {
  7.          dat=(S[sj[m+1]*16+ScanRow]<<8)+S[sj[m]*16+ScanRow];
  8.          OutByte(dat);
  9.          m=m+2;
  10.     }
  11. }

输出行地址的函数为:
  1. void SeleRow(uint8_t Nd)
  2. {
  3.     uint8_t N;
  4.     N=Nd;
  5.     N=N%16;
  6.     if(N&0x01)   LA=LED_ON;
  7.     else  LA=LED_OFF;
  8.     if (N&0x02)  LB=LED_ON;
  9.     else  LB=LED_OFF;
  10.     if (N&0x04)  LC=LED_ON;
  11.     else  LC=LED_OFF;
  12.     if (N&0x08)  LD=LED_ON;
  13.     else  LD=LED_OFF;
  14. }

显示数值的函数为:
  1. void Display(void)
  2. {
  3.           DisCol(4);
  4.           OE=LED_ON;
  5.           Delay(0x0010);
  6.           STB=LED_ON;
  7.           Delay(0x0010);
  8.           STB=LED_OFF;
  9.           Delay(0x0010);
  10.           SeleRow(ScanRow);
  11.           OE=LED_OFF;
  12.           Delay(0x0010);
  13.           ScanRow++;
  14.           if(ScanRow>15)  ScanRow=0;
  15. }

实现电子时钟显示牌测试功能的主程序为:
  1. int32_t main(void)
  2. {
  3.       SC_Init();
  4.       Delay(0xffff);
  5.       LED1= LED_ON;
  6.       ScanRow=0;
  7.       Display();
  8.       while(1)
  9.       {
  10.           Display();
  11.           Delay(0x08ff);
  12.       }
  13. }

5.jpg
图5 显示效果

在完成点阵板显示功能的基础上,即可添加DS1302模块的RTC计时功能。
DS1302功能模块与开发板的连接关系为:
SCK ---P04
IO ---P05
RST ---P06

DS1302读取字节数据的函数为:
  1. uint8_t ds1302_read_byte(uint8_t addr)
  2. {
  3.           uint8_t i,temp;
  4.           RST=1;
  5.           addr = addr | 0x01;
  6.           GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_OUT_PP);
  7.           for (i = 0; i < 8; i ++)
  8.           {
  9.                 if (addr & 0x01)
  10.                 {
  11.                         IO=1;
  12.                 }
  13.                 else
  14.                 {
  15.                         IO=0;
  16.                 }
  17.                 SCK=1;
  18.                 SCK=0;
  19.                 addr = addr >> 1;
  20.                 }
  21.                 GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_IN_PU);
  22.                 for (i = 0; i < 8; i ++)
  23.                 {
  24.                 temp = temp >> 1;
  25.                 if (IO==1)
  26.                 {
  27.                         temp |= 0x80;
  28.                 }
  29.                 else
  30.                 {
  31.                         temp &= 0x7F;
  32.                 }
  33.                 SCK=1;
  34.                 SCK=0;
  35.           }
  36.           RST=0;
  37.           return temp;
  38. }

DS1302读取时间的函数为:
  1. void ds1302_read_time(void)
  2. {
  3.         time_buf[1]=ds1302_read_byte(ds1302_year_add);
  4.         time_buf[2]=ds1302_read_byte(ds1302_month_add);
  5.         time_buf[3]=ds1302_read_byte(ds1302_date_add);
  6.         time_buf[4]=ds1302_read_byte(ds1302_hr_add);
  7.         time_buf[5]=ds1302_read_byte(ds1302_min_add);
  8.         time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;
  9.         time_buf[7]=ds1302_read_byte(ds1302_day_add);
  10. }

辅助RTC显示的函数为:
  1. void RTC_disp(void)
  2. {
  3.             sj[0]=(time_buf[4]>>4);
  4.             sj[1]=(time_buf[4]&0x0f);
  5.             sj[3]=(time_buf[5]>>4);
  6.             sj[4]=(time_buf[5]&0x0f);
  7.             sj[6]=(time_buf[6]>>4);
  8.             sj[7]=(time_buf[6]&0x0f);
  9. }

实现电子计时广告牌的主程序为:
  1. void main(void)
  2. {
  3.     SC_Init();
  4.     Delay(0xffff);
  5.     LED1= LED_ON;
  6.     ScanRow=0;
  7.     Display();
  8.     ds1302_init();
  9.     ds1302_write_time();
  10.     while(1)
  11.     {
  12.                  ds1302_read_time();
  13.                  RTC_disp();
  14.                  Display();
  15.     }
  16. }

在连接DS1302功能模块的情况下,其计时效果如图6所示。
6.jpg
图6  DS1302计时效果

因版面原因,对传感器BH1750和BMP085的介绍从略,可参考以下链接:
(1)新定义MCU开发板测评】 + 环境温度及大气压检测
https://bbs.21ic.com/icview-3266988-1-1.html
(2)【新定义MCU开发板测评】 + 光照强度检测与显示
https://bbs.21ic.com/icview-3267180-1-1.html

4)作品展示、制作心得和总结
多功能点阵电子信息屏的制作终于完成了,以前在显示方面多采用OLED屏或TFT显示屏,它们多适用于个人使用,这次使用的点阵信息屏有效地将显示目标指向公共环境,是一次有效的尝试,受时间和精力的限制此次涉及的检测内容还较少,后续可进行相应的功能扩展,以使其性能更强。

视频:



评论

高大上,围观一下。  发表于 2023-6-26 22:10
 楼主| jinglixixi 发表于 2023-6-27 08:23 | 显示全部楼层
多谢支持!!!
黄叶落 发表于 2023-10-26 18:54 | 显示全部楼层
很漂亮的工作
 楼主| jinglixixi 发表于 2023-10-26 22:35 | 显示全部楼层

感谢支持!!!
yangjiaxu 发表于 2023-10-30 09:14 | 显示全部楼层
这种效果不错啊,支持一波,感觉不错
 楼主| jinglixixi 发表于 2023-10-30 09:31 | 显示全部楼层
多谢主持!!!
咕咕呱呱孤寡 发表于 2023-10-30 10:45 | 显示全部楼层
创意多多,赞赞赞
 楼主| jinglixixi 发表于 2023-10-30 15:12 | 显示全部楼层

感谢支持!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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

518

主题

2933

帖子

39

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