六、温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)!
七、点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)
八、LCD1602点阵字符型液晶显示模块驱动封装(中)
已经有好一阵子没写了,一方面是因为最近闲杂的事特多,另一方面(主要方面)是因为我卡在了LCD1602驱动的权衡上面——总共3个控制线和一个8位并行的数据线,放在51这种引脚直接使用的8位单片机上驱动代码非常简洁;放在CC2541这种引脚需要提前声明属性,并且引脚属性分输入和输出两种,其驱动代码就稍微复杂;等到将其移植到STM32F103上的时候,整个代码已经不能看了!我先基于51平台写其驱动,然后扩展写CC2541,最后准备攻克STM,结果代码乱到不想看~由此,我想如果强行地去适应各种硬件平台,不如根据不同得组合场景写不同的代码,强扭的瓜不甜,所以接下来计划有变→_→!
遂思忖良久,终醍醐灌顶——maybe 51和LCD1602更配哦~following:
用MCU+LCD+无线构成一个无线显示模块
而不拘泥于之前得用一个模块强硬地去适应各种平台的做法
本节尝试做一个最简单的无线显示屏,然后在接下来几节不断完善做出让你大吃一惊的无线显示屏
1、本节的无线显示屏的样子
由于LCD1602屏分为上下两行,每行可显示16个字符(ASCII),为了达到较好的显示效果(我从老式新闻联播下面的消息滚动得来灵感),决定尝试做一个滚动的显示屏~
2、先做个滚动显示屏
第一种滚屏方式:双行双信息
void main()
{
uchar a;
init(); write_com(0x80 + ); //将第一个字符写在向右偏移17个字符处,为后面的由右向左划入做准备。
delay();
for(a = ; a < ; a++)
{
write_date(table1[a]);
delay();
} write_com(0xc0 + );
delay();
for(a = ; a < ; a++)
{
write_date(table2[a]);
delay();
} for(a = ; a < ; a++)
{
write_com(0x18); //左移
delay1();
}
while();
}
该种方式中6-20行先将要显示的两行内容分别存储到LCD1602非显示区的内存处,然后在22-26行通过左移指令将未显示区数据拉到显示区显示,从而达到滚动效果!该种显示效果是同时利用两行向左滚动信息的方式,但是两行必须同时滚动,不太理想~
第二种滚屏方式:双行滚一信息,满屏清屏
void main()
{
init();
for(num = ; num < ; num++) //第一屏
{
beep = ;
write_data(table[num]);
delay();
beep = ;
delay();
}
write_com(0x80 + 0x40);
for(num = ; num < ; num++)
{
beep = ;
write_data(table1[num]);
delay();
beep = ;
delay();
}
write_com(0x01); //清屏
write_com(0x80); //设置字符显示位置指针于第一行
for(num = ; num < ; num++) // 第二屏
{
beep = ;
write_data(table2[num]);
delay();
beep = ;
delay();
}
write_com(0x80 + 0x40); //设置字符显示位置指针于第二行
for(num = ; num < ; num++)
{
beep = ;
write_data(table3[num]);
delay();
beep = ;
delay();
}
write_com(0x80);
write_com(0x01);
for(num = ; num < ; num++) //第三屏
{
beep = ;
write_data(table4[num]);
delay();
beep = ;
delay();
}
write_com(0x80 + 0x40);
for(num = ; num < ; num++)
{
beep = ;
write_data(table5[num]);
delay();
beep = ;
delay();
}
write_com(0x01);
write_com(0x80);
for(num = ; num < ; num++) //第四屏
{
beep = ;
write_data(table6[num]);
delay();
beep = ;
delay();
}
write_com(0x80 + 0x40);
for(num = ; num < ; num++)
{
beep = ;
write_data(table7[num]);
delay();
beep = ;
delay();
}
write_com(0x01);
write_com(0x80);
for(num = ; num < ; num++) //第五屏
{
beep = ;
write_data(table8[num]);
delay();
beep = ;
delay();
}
write_com(0x80 + 0x40);
for(num = ; num < ; num++)
{
beep = ;
write_data(table9[num]);
delay();
beep = ;
delay();
}
write_com(0x01);
write_com(0x80); for(num = ; num < ; num++) //第六屏
{
beep = ;
write_data(table10[num]);
delay();
beep = ;
delay();
}
write_com(0x80 + 0x40);
for(num = ; num < ; num++)
{
beep = ;
write_data(table11[num]);
delay();
beep = ;
delay();
}
while();
}
此种显示方式是将下面的一个名人名言滚动显示出来——
uchar code table [] = "I want to bring ";
uchar code table1[] = "out the secret ";
uchar code table2[] = "of nature and ";
uchar code table3[] = "apply them for ";
uchar code table4[] = "the happiness of";
uchar code table5[] = "man.I don't know";
uchar code table6[] = "of any better s-";
uchar code table7[] = "-ervice to offer";
uchar code table8[] = "for the short t-";
uchar code table9[] = "-ime we are in ";
uchar code table10[] = "the world. ";
uchar code table11[] = "---Thomas Edison";
每次写另一行数据时会调用write_com(0x80)或write_com(0xC0)命令重新调整字符显示位置指针,当执行写0x80之后,再写数据就会依次写入0x80,0x81....中(即第一行的从左往右的数据),当写0xC0之后,再写数据将会依次写入0xC0,0xC1....(即第二行的从左往右的数据),每次两行数据都写过之后写入0x01清屏,进入下次数据写入环节~该滚动效果符合正常阅读习惯——从上到下,从左到右
3、开工做无线滚动屏
经常读我文章的朋友可能知道我写这个无线滚动显示屏的制作肯定会以蓝牙串口透传模块作为切入点——因为蓝牙串口透传模块只要简单连线就能像操作串口一样来实现蓝牙无线传输数据了,我在这方面也花了比较多的笔墨介绍它——
下面是以前写的蓝牙串口透传的各种应用:
[C#] 编程控制笔记本蓝牙与外部蓝牙设备通信
[安卓] 11、串口蓝牙·将软硬结合进行到底
[安卓] 13、安卓蓝牙定位(一)——如何周期性获得蓝牙节点信号强度?
[智能硬件] 1、三分钟看懂智能硬件原理——蓝牙防丢器制作教程(包括手机应用)
[智能硬件] 2、三分钟看懂智能硬件原理——智能玩具小风扇制作教程(包括手机应用开发)
[智能硬件] 3、三分钟看懂智能硬件原理——简易智能手环制作教程(包括炫酷手机客户端开发)
最终效果预览
综上,我们实现串口发送也就很方便利用蓝牙透传实现无线屏
因此,我们只要实现在上位机串口助手上发送一个字符串,能够在LCD1602显示屏上显示出来就算完成了制作一个最简单的无线显示屏的任务了!
由于,今天有点晚,所以先来个效果预览,具体工程明天再细讲!
@beautifulzzzz
2015-10-1 持续更新中~