打印
[活动专区]

【杰发科技AC7802x测评】+多功能显示信息屏

[复制链接]
806|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinglixixi 于 2023-7-30 19:07 编辑

#申请原创# @21小跑堂
将点阵屏与RTC计时及传感器相配合可构建一个多功能信息信息装置,
这里仅以温度、大气压传感器BMP085和RTC计时器为例来进行介绍。
点阵屏采用的是HUB08接口,见图1所示。
图1 HUB08接口

该点阵屏与开发板的连接关系为:
A----PB5
B----PB3
C----PB4
D----PB6
R1----PA8
CLK----PB7
EN ----PA2
STB----PA3
BMP085与开发板的连接关系为:
SDA ----PA0
SCL ----P A1

1.电子时钟
由于AC7802x内部所配置的RTC只是一个计时器,并没有日历处理功能,故需要以秒计时通过软件的方式来实现日历的进制处理。
关于点阵屏的驱动显示参见:https://bbs.21ic.com/icview-3315650-1-1.html
在显示过程中,只提供按键来切换显示的内容,对按键所用引脚的配置函数为:
void  key_GPIO(void)
{
          GPIO_SetFunc(GPIOB, GPIO_PIN2, GPIO_FUN0);  // NMI
          GPIO_SetDir(GPIOB, GPIO_PIN2, GPIO_IN);
         
          GPIO_SetFunc(GPIOA, GPIO_PIN3, GPIO_FUN0);  // KEY1
          GPIO_SetDir(GPIOA, GPIO_PIN11, GPIO_IN);
}


实现图2和图3显示功能的主程序为:
int main(void)
{
      char v,m=0;
      InitDelay();
      InitDebug();
      key_GPIO();
      RTC_Timeout1s();
      Rtc_SetDateTime();
      dzb_GPIO();
      ScanRow=0;
      while (1)
     {
                if(GPIO_GetPinLevel(GPIOB, GPIO_PIN2)==0)   m=0;
                if(GPIO_GetPinLevel(GPIOA, GPIO_PIN11)==0)  m=1;
                if(g_timeoutFlag)
                {
                          if(m==0)
                          {
                                        g_timeoutFlag = 0;
                                        dt.sec=dt.sec+1;
                                        if(dt.sec==60)
                                        {
                                                  dt.sec=0;
                                                  dt.min=dt.min+1;
                                        }
                                        if(dt.min==60)
                                        {
                                                  dt.min=0;
                                                  dt.hour=dt.hour+1;
                                        }
                                        if(dt.hour==24)
                                        {
                                                  dt.hour=0;
                                                  dt.mday=dt.mday+1;
                                        }
                                }
                                if(m==1)
                                {
                                        if(dt.mon==2)
                                        {
                                                  v=(Rtc_IsLeapYear(dt.year) == 1) ? (29U) : (28U);
                                        }
                                        else
                                        {
                                                  v=month_day_num[dt.mon];
                                        }
                                        if(dt.mday>v)
                                        {
                                                  dt.mday=1;
                                                  dt.mon=dt.mon+1;
                                        }
                                        if(dt.mon>12)
                                       {
                                                  dt.mon=1;
                                                  dt.year=dt.year+1;
                                       }
                             }
                         }
                        if(m==0)
                        {
                                sj[2]=0x0A;
                                sj[5]=0x0A;
                                sj[0]=dt.hour/10;
                                sj[1]=dt.hour%10;
                                sj[3]=dt.min/10;
                                sj[4]=dt.min%10;
                                sj[6]=dt.sec/10;
                                sj[7]=dt.sec%10;
                   }
                   if(m==1)
                    {
                                sj[2]=0x0B;
                                sj[5]=0x0B;
                                sj[0]=dt.year/10;
                                sj[1]=dt.year%10;
                                sj[3]=dt.mon/10;
                                sj[4]=dt.mon%10;
                                sj[6]=dt.mday/10;
                                sj[7]=dt.mday%10;
                   }
                   Display();
    }
}

图2 时间显示效果

图3 日期显示效果

2.环境检测
环境检测方面,主要是显示环境的温度及大气压。
关于BMP085的使用参见:https://bbs.21ic.com/icview-3315398-1-1.html
由于在环境状态检测方面其显示内容要比时间显示功能更丰富,故需对显示字模加以扩充,所添加的内容如下:

u8 S[]={
...
0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7F,0x00,0x00,/*"L",0*/
0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"i",1*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C,/*"g",2*/
0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"h",3*/
0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00,/*"t",4*/
0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00,/*"=",5*/
0x00,0x00,0x00,0x7C,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1C,0x00,0x00,/*"C",6*/
0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x2A,0x2A,0x2A,0x2A,0x2A,0x6B,0x00,0x00,/*"M",7*/
0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x42,0x3E,0x02,0x02,0x02,0x02,0x07,0x00,0x00,/*"P",8*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x78,0x44,0x42,0x42,0xFC,0x00,0x00,/*"a",9*/
0x00,0x00,0x00,0x7F,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00,/*"T",10*/
0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"H",11*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,/*".",12*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00,/*"x",0*/
...
}


实现图4和图5显示功能的主程序为:
int main(void)
{
        char v,m=0;
        u32 u=0,f=0;
        InitDelay();
        InitDebug();
        GPIO_LedInit();
        RTC_Timeout1s();
        Rtc_SetDateTime();
        dzb_GPIO();
        ScanRow=0;
        BMP085_Init();
        Init_BMP085();
        mdelay(500);
        bmp085Convert();
        while (1)
        {
                          if(GPIO_GetPinLevel(GPIOB, GPIO_PIN2)==0)  m=0;
                          if(GPIO_GetPinLevel(GPIOA, GPIO_PIN11)==0)  m=1;
                          if(f>50000)
                          {
                                   bmp085Convert();
                                   f=0;
                          }
                          if(m==0)
                          {
                                   u=pressure/100;
                                   sj[0]=20;
                                   sj[1]=17;
                                   sj[2]=u/1000;
                                   sj[3]=u%1000/100;
                                   sj[4]=u%100/10;
                                   sj[5]=u%10;
                                   sj[6]=19;
                                   sj[7]=20;
                          }
                          if(m==1)
                          {
                                   u=temperature1/10;
                                   sj[0]=22;
                                   sj[1]=17;
                                   sj[2]=u%100/10;
                                   sj[3]=u%10;
                                   sj[4]=26;
                                   sj[5]=18;
                                   sj[6]=26;
                                   sj[7]=26;
                          }
                          Display();
                          f=f+1;
    }
}



图4 温度显示效果

图5 气压显示效果

当然还可添加传感器BH1750来检测光照强度等,见图6所示,这里就不再细述。
图6 光照强度显示效果

至此,就完成了多功能显示信息屏的制作。

视频演示:




使用特权

评论回复

相关帖子

沙发
juventus9554| | 2023-9-5 22:25 | 只看该作者
这么好的原创竟然没人顶

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2023-9-6 08:00 | 只看该作者
juventus9554 发表于 2023-9-5 22:25
这么好的原创竟然没人顶

感谢支持!!!

使用特权

评论回复
地板
chenjun89| | 2023-9-6 08:26 | 只看该作者
支持一下,原创不易。

使用特权

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

本版积分规则

446

主题

2675

帖子

37

粉丝