打印
[应用方案]

【我的DIY设计-多功能点阵电子信息屏制作】

[复制链接]
1271|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2023-6-26 10:25 编辑

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

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

图2  程序下载界面

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

图3 结构框图

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

图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

所用引脚的配置函数为:
void SC_GPIO_Init(void)
{
        GPIO_Init(GPIO4, GPIO_PIN_7,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO4, GPIO_PIN_6,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO4, GPIO_PIN_5,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO4, GPIO_PIN_4,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO1, GPIO_PIN_7,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO1, GPIO_PIN_6,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO1, GPIO_PIN_5,GPIO_MODE_OUT_PP);
        GPIO_Init(GPIO1, GPIO_PIN_4,GPIO_MODE_OUT_PP);
}

点阵屏发送数据的函数为:
void OutByte(uint16_t dat)
{
    uint8_t i=0 ;
    for(i=0;i<16;i++)
    {
        CLK=LED_OFF;
        Delay(0x0010);
        if(dat&0x0001)
        {
            LR1=LED_ON;
        }
        else
        {
            LR1=LED_OFF;
        }
        dat=dat>>1;
        Delay(0x0010);
        CLK=LED_ON;
    }
}

发送各列数据的函数为:
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;
    }
}

输出行地址的函数为:
void SeleRow(uint8_t Nd)
{
    uint8_t N;
    N=Nd;
    N=N%16;
    if(N&0x01)   LA=LED_ON;
    else  LA=LED_OFF;
    if (N&0x02)  LB=LED_ON;
    else  LB=LED_OFF;
    if (N&0x04)  LC=LED_ON;
    else  LC=LED_OFF;
    if (N&0x08)  LD=LED_ON;
    else  LD=LED_OFF;
}

显示数值的函数为:
void Display(void)
{
          DisCol(4);
          OE=LED_ON;
          Delay(0x0010);
          STB=LED_ON;
          Delay(0x0010);
          STB=LED_OFF;
          Delay(0x0010);
          SeleRow(ScanRow);
          OE=LED_OFF;
          Delay(0x0010);
          ScanRow++;
          if(ScanRow>15)  ScanRow=0;
}

实现电子时钟显示牌测试功能的主程序为:
int32_t main(void)
{
      SC_Init();
      Delay(0xffff);
      LED1= LED_ON;
      ScanRow=0;
      Display();
      while(1)
      {
          Display();
          Delay(0x08ff);
      }
}

图5 显示效果

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

DS1302读取字节数据的函数为:
uint8_t ds1302_read_byte(uint8_t addr)
{
          uint8_t i,temp;
          RST=1;
          addr = addr | 0x01;
          GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_OUT_PP);
          for (i = 0; i < 8; i ++)
          {
                if (addr & 0x01)
                {
                        IO=1;
                }
                else
                {
                        IO=0;
                }
                SCK=1;
                SCK=0;
                addr = addr >> 1;
                }
                GPIO_Init(GPIO0, GPIO_PIN_5, GPIO_MODE_IN_PU);
                for (i = 0; i < 8; i ++)
                {
                temp = temp >> 1;
                if (IO==1)
                {
                        temp |= 0x80;
                }
                else
                {
                        temp &= 0x7F;
                }
                SCK=1;
                SCK=0;
          }
          RST=0;
          return temp;
}

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

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

实现电子计时广告牌的主程序为:
void main(void)
{
    SC_Init();
    Delay(0xffff);
    LED1= LED_ON;
    ScanRow=0;
    Display();
    ds1302_init();
    ds1302_write_time();
    while(1)
    {
                 ds1302_read_time();
                 RTC_disp();
                 Display();
    }
}

在连接DS1302功能模块的情况下,其计时效果如图6所示。
图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 回复TA
高大上,围观一下。 
沙发
jinglixixi|  楼主 | 2023-6-27 08:23 | 只看该作者
多谢支持!!!

使用特权

评论回复
板凳
黄叶落| | 2023-10-26 18:54 | 只看该作者
很漂亮的工作

使用特权

评论回复
地板
jinglixixi|  楼主 | 2023-10-26 22:35 | 只看该作者

感谢支持!!!

使用特权

评论回复
5
yangjiaxu| | 2023-10-30 09:14 | 只看该作者
这种效果不错啊,支持一波,感觉不错

使用特权

评论回复
6
jinglixixi|  楼主 | 2023-10-30 09:31 | 只看该作者
多谢主持!!!

使用特权

评论回复
7
咕咕呱呱孤寡| | 2023-10-30 10:45 | 只看该作者
创意多多,赞赞赞

使用特权

评论回复
8
jinglixixi|  楼主 | 2023-10-30 15:12 | 只看该作者

感谢支持!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2678

帖子

37

粉丝