本帖最后由 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显示屏,它们多适用于个人使用,这次使用的点阵信息屏有效地将显示目标指向公共环境,是一次有效的尝试,受时间和精力的限制此次涉及的检测内容还较少,后续可进行相应的功能扩展,以使其性能更强。
视频:
|
高大上,围观一下。