本帖最后由 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 光照强度显示效果
至此,就完成了多功能显示信息屏的制作。
视频演示:
|