<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>apt-blog.net   无证程序员的PT桑 &#187; LCD</title> <atom:link href="http://apt-blog.net/tag/lcd/feed" rel="self" type="application/rss+xml" /><link>http://apt-blog.net</link> <description>潜逃中。</description> <lastBuildDate>Sat, 26 Nov 2011 07:45:40 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3</generator> <item><title>完成一个LCD4Linux的USB屏幕</title><link>http://apt-blog.net/the_lcd4linux_project</link> <comments>http://apt-blog.net/the_lcd4linux_project#comments</comments> <pubDate>Sat, 05 Sep 2009 16:21:53 +0000</pubDate> <dc:creator>BOYPT</dc:creator> <category><![CDATA[Programming]]></category> <category><![CDATA[单片机]]></category> <category><![CDATA[Arch]]></category> <category><![CDATA[atmega]]></category> <category><![CDATA[atmega48]]></category> <category><![CDATA[AUR]]></category> <category><![CDATA[AVR]]></category> <category><![CDATA[LCD]]></category> <category><![CDATA[LCD4Linux]]></category> <category><![CDATA[Linux]]></category> <guid
isPermaLink="false">http://apt-blog.net/archives/540.html</guid> <description><![CDATA[暑假之前就注意了LCD4Linux这个Project，简单说，这就是个硬件版conky的驱动服务，用户自己DIY各式各样的硬件屏幕，自己编写驱动、编写各种插件来控制输出到屏幕上的信息，LCD4Linux就是这样一个平台，也是一个geek味道非常浓郁的、可玩性相当高的一个Project。 图片里面是LCD4Linux项目页里面收集的部分人实现的一些屏幕，有像我这样一块小小的1602，也有用块10多寸的液晶屏作成很拉风的监控屏，甚至，挂一个户外广告那样的LED阵列，你也可以转换成VGA信号输出给大屏幕的电视机，或者弄个天线发射出外太空都是可能的…… 这个项目的可玩性就在于硬件的多样性，很可能每个人实现的屏幕都不一样，而作为开源项目，geek们只需或多或少地修改一下别人的驱动就可让屏幕跑起来了。 我实现的这块，是用了一块通用AVR单片机，通过USB接口直接取电和传输的数据的架构，硬件和协议参考的是LCD2USB项目。其原来用的是atmega8芯片，而我手边只有atmega48，算是类似吧，但换换IO口还是在所难免的。 实现一个系统，同时也藉此了解一下相关的技术（不然还真的很难做得出来），首先是USB，USB我们天天在用，但是学校的《微机接口》之类的课程可从来不涉及这些“时髦”技术的，虽然USB已经流行了10多年了。通过V-USB库，在AVR单片机上实现USB设备还真没什么难度，只需要填写设备ID设备名称之类的，然后再实现协议处理函数就完了，在Linux下使用是直接支持，一插上运行lsusb就能认出（Win下需要另外装驱动）。我第一个实验USB就是接了几个二极管开关，用libusb的python binding， pyusb，很容易就控制几个灯。（想起The Big Bang Theory S1E9开头那一段，再import个SimpleHTTPServer，然后让单片机连接几个继电器，就能像他们那样让别人用浏览器来开关我的台灯了，哈！） 其实单纯几个LED都能够作为LCD4Linux的一个设备了，比如能够用来做邮件提醒、pidgin消息之类。同样是用V-USB，有个德国人做了个叫USB-LED-Fader的东东，同样是几个LED，人家可实现了每个灯在pwm控制下以独立的方式闪亮，要知道，atmega8只有两个pwm channel，而USB-LED-Fader里面没有用硬件pwm，而是用io口来输出的，为了实现独立波形，还实现了一个message queue，俨然一个操作系统了……所以他的固件编译出来4K多，即使我修改后也刷不进去mega48里面，就没得看看他的效果了。不过赞一下的是，这个项目虽然是玩具级别的，但是人家的电路、电路板、固件代码（注释）、文档、上位机控制（包括win版、win驱动）通通一应俱全，非常规范和详细，俨然一个商业项目。 将USB模块跟显示屏驱动模块合起来并没什么难度，几个月前我自己写过这个1602的驱动程序，虽然当时花了好几天，但实际上都只是很简单的几个函数。不过这次，因为接上USB后这块28针的mega48就没那么多io给我挥霍了，此前的驱动用的都是8位数据线，现在只能用4位，分两次传送。不过还好，这类HD44780的驱动几乎满地都是，一般外国人写的不像国内一些网站上面的，扔几个函数在那里就完事，LCD2USB的代码里面用的是Peter Fleury的LCD Library，封装得很漂亮，不过原来的代码只能讲4位数据线连接在一组io口的高四位上，而接上外置晶振后的mega48仅剩的带高位PortD，刚好又是几个pwm波输出，我打算另外再扩展协议让LCD2USB带有几个漂亮的提示灯，就重写了一下LCD的两个底层函数，当然不是仅仅重写，不然对不起原来那些漂亮的代码，用了宏定义来设置数据线是接在HIGHER_BIT or LOWER_BIT。 其实相比之下，LCD4Linux最精彩的地方在于它的驱动、插件的编写，新版里面其也支持了Python，意味着做个硬件版twitter器不是什么难事了！不过LCD4Linux本身的安装让我困扰了一天，大概作者没有时间吧，这个项目的主代码很几年没更新了，一个版本更新的跨幅有好几年，以致稍旧点的版本在新版本的内核里面编译不了，比如有个rdtscl的宏调用，在新内核里面被移除了……这个问题在LCD4Linux的SVN里面的版本倒是解决了，但是因为autotool的更新，编译过程又出错，折腾了半天，发现原来autoconf检查python的模块ac_python_devel 因为莫名的原因会让configure文件出错，下载一个新版的ax_python_devel.m4覆盖掉就好了。另外发现AUR里面的lcd4linux-svn包是“弃婴”，于是“收养”了回来更新，添加了个编译的patch，现在Archer们直接yaourt lcd4linux就可以编译安装了，O.O . 还是一句，LCD4Linux的可玩性非常高，说技术性嘛，不算高也不算低吧，召唤大家一起玩一起交流哈……]]></description> <content:encoded><![CDATA[<p
style="text-align: center;"><a
href="http://apt-blog.net/wp-content/uploads/2009/09/pt_lcd2usb.jpg" target="_blank" rel="lightbox[540]" title="LCD2USB with 1602 LCD"><img
class="aligncenter size-full wp-image-548" title="LCD2USB with 1602 LCD" src="http://apt-blog.net/wp-content/uploads/2009/09/pt_lcd2usb.jpg" alt="LCD2USB with 1602 LCD" width="476" height="261" /></a></p><p>暑假之前就注意了<a
href="http://lcd4linux.bulix.org/" target="_blank">LCD4Linux</a>这个Project，简单说，这就是个硬件版conky的驱动服务，用户自己DIY各式各样的硬件屏幕，自己编写驱动、编写各种插件来控制输出到屏幕上的信息，LCD4Linux就是这样一个平台，也是一个geek味道非常浓郁的、可玩性相当高的一个Project。</p><p>图片里面是LCD4Linux项目页里面收集的部分人实现的一些屏幕，有像我这样一块小小的1602，也有用块10多寸的液晶屏作成很拉风的监控屏，甚至，挂一个户外广告那样的LED阵列，你也可以转换成VGA信号输出给大屏幕的电视机，或者弄个天线发射出外太空都是可能的……<br
/> <a
href="http://apt-blog.net/wp-content/uploads/2009/09/lcd4linux.jpg" rel="lightbox[540]" title="LCD4Linux"><img
class="alignright" style="margin: 10px; max-width: 800px;" title="LCD4Linux" src="http://apt-blog.net/wp-content/uploads/2009/09/lcd4linux.jpg" alt="" width="288" height="480" /></a><br
/> 这个项目的可玩性就在于硬件的多样性，很可能每个人实现的屏幕都不一样，而作为开源项目，geek们只需或多或少地修改一下别人的驱动就可让屏幕跑起来了。</p><p>我实现的这块，是用了一块通用AVR单片机，通过USB接口直接取电和传输的数据的架构，硬件和协议参考的是<a
href="http://www.harbaum.org/till/lcd2usb/index.shtml" target="_blank">LCD2USB</a>项目。其原来用的是atmega8芯片，而我手边只有atmega48，算是类似吧，但换换IO口还是在所难免的。</p><p>实现一个系统，同时也藉此了解一下相关的技术（不然还真的很难做得出来），首先是USB，USB我们天天在用，但是学校的《微机接口》之类的课程可从来不涉及这些“时髦”技术的，虽然USB已经流行了10多年了。通<a
href="http://www.obdev.at/products/vusb/index.html" target="_blank">过V-USB</a>库，在AVR单片机上实现USB设备还真没什么难度，只需要填写设备ID设备名称之类的，然后再实现协议处理函数就完了，在Linux下使用是直接支持，一插上运行lsusb就能认出（Win下需要另外装驱动）。我第一个实验USB就是接了几个二极管开关，用libusb的python binding， pyusb，很容易就控制几个灯。（想起<a
href="http://v.youku.com/v_show/id_XNTc5OTMxNjg=.html" target="_blank">The Big Bang Theory S1E9开头那一段</a>，再import个SimpleHTTPServer，然后让单片机连接几个继电器，就能像他们那样让别人用浏览器来开关我的台灯了，哈！）</p><p>其实单纯几个LED都能够作为LCD4Linux的一个设备了，比如能够用来做邮件提醒、pidgin消息之类。同样是用V-USB，<a
href="http://www.schatenseite.de/index.php?id=216&amp;L=2" target="_blank">有个德国人做了个叫USB-LED-Fader的东东</a>，同样是几个LED，人家可实现了每个灯在pwm控制下以独立的方式闪亮，要知道，atmega8只有两个pwm channel，而USB-LED-Fader里面没有用硬件pwm，而是用io口来输出的，为了实现独立波形，还实现了一个message queue，俨然一个操作系统了……所以他的固件编译出来4K多，即使我修改后也刷不进去mega48里面，就没得看看他的效果了。不过赞一下的是，这个项目虽然是玩具级别的，但是人家的电路、电路板、固件代码（注释）、文档、上位机控制（包括win版、win驱动）通通一应俱全，非常规范和详细，俨然一个商业项目。</p><p>将USB模块跟显示屏驱动模块合起来并没什么难度，<a
href="http://apt-blog.net/archives/238.html" target="_blank">几个月前我自己写过这个1602的驱动程序</a>，虽然当时花了好几天，但实际上都只是很简单的几个函数。不过这次，因为接上USB后这块28针的mega48就没那么多io给我挥霍了，此前的驱动用的都是8位数据线，现在只能用4位，分两次传送。不过还好，这类HD44780的驱动几乎满地都是，一般外国人写的不像国内一些网站上面的，扔几个函数在那里就完事，LCD2USB的代码里面用的是<a
href="http://www.jump.to/fleury" target="_blank">Peter Fleury的LCD Library</a>，封装得很漂亮，不过原来的代码只能讲4位数据线连接在一组io口的高四位上，而接上外置晶振后的mega48仅剩的带高位PortD，刚好又是几个pwm波输出，我打算另外再扩展协议让LCD2USB带有几个漂亮的提示灯，就重写了一下LCD的两个底层函数，当然不是仅仅重写，不然对不起原来那些漂亮的代码，用了宏定义来设置数据线是接在HIGHER_BIT or LOWER_BIT。</p><p>其实相比之下，<a
href="http://lcd4linux.bulix.org/" target="_blank">LCD4Linux</a>最精彩的地方在于它的驱动、插件的编写，新版里面其也支持了Python，意味着做个硬件版twitter器不是什么难事了！不过<a
href="http://lcd4linux.bulix.org/" target="_blank">LCD4Linux</a>本身的安装让我困扰了一天，大概作者没有时间吧，这个项目的主代码很几年没更新了，一个版本更新的跨幅有好几年，以致稍旧点的版本在新版本的内核里面编译不了，比如有个rdtscl的宏调用，在新内核里面被移除了……这个问题在<a
href="http://lcd4linux.bulix.org/" target="_blank">LCD4Linux</a>的SVN里面的版本倒是解决了，但是因为autotool的更新，编译过程又出错，折腾了半天，发现原来autoconf检查python的模块ac_python_devel 因为莫名的原因会让configure文件出错，下载一个新版的ax_python_devel.m4覆盖掉就好了。另外发现<a
href="http://aur.archlinux.org/packages.php?ID=20514" target="_blank">AUR里面的lcd4linux-svn包</a>是“弃婴”，于是“收养”了回来更新，添加了个编译的patch，现在Archer们直接yaourt lcd4linux就可以编译安装了，O.O .</p><p><a
href="http://lcd4linux.bulix.org/" target="_blank">还是一句，LCD4Linux</a>的可玩性非常高，说技术性嘛，不算高也不算低吧，召唤大家一起玩一起交流哈……</p> ]]></content:encoded> <wfw:commentRss>http://apt-blog.net/the_lcd4linux_project/feed</wfw:commentRss> <slash:comments>22</slash:comments> </item> <item><title>为AVR写的1602A液晶屏幕驱动程序</title><link>http://apt-blog.net/1602_lcd_driver_under_avr_chip</link> <comments>http://apt-blog.net/1602_lcd_driver_under_avr_chip#comments</comments> <pubDate>Sun, 12 Apr 2009 13:09:38 +0000</pubDate> <dc:creator>BOYPT</dc:creator> <category><![CDATA[单片机]]></category> <category><![CDATA[AVR]]></category> <category><![CDATA[LCD]]></category> <category><![CDATA[液晶]]></category> <category><![CDATA[驱动]]></category> <guid
isPermaLink="false">http://apt-blog.net/?p=238</guid> <description><![CDATA[为1602ALCD屏幕实现的基本驱动功能，8位数据线，3位控制线，可自定义端口，可从LCD_Init函数设定工作方式，实现发送单字符和字符串的基本功能，带busy_wait。使用avr-gcc 编译。 代码下载：http://code.google.com/p/ptcoding/source/browse/trunk/AVR 更新：SVN目录内还有串口通讯的模块，以及串口和LCD驱动结合起来的一个试验性程序 参考资料：lcd1602a_398762.pdf（英文） ourAVR （注意两份资料的出入，前者更详细） 开发手记： 之前从天河赛格买了个1602的液晶屏，折腾了两天，终于让ATmega48驱动起来。 1602本来是一个挺简单的器件，8位数据线和3位控制线，其工作时序图初看起来挺复杂，但其实也就E端使能脉冲的事情，但是折腾下来，再一次验证了“简体中文”资料的不可靠，还有就是“这就是传说中的‘驱动程序’”。 首先我是从ourAVR网站提供的1602B液晶使用范例提供的资料入手（1602A、B好像没太大区别），借鉴了人家用ICCAVR写的代码（虽然代码是我敲的，但是基本上还是抄的），当LCD上显示出第一个字母时，还挺兴奋的，然而，这只是刚刚开始……（才100多行代码，加上看资料个把小时什么都好了。） 接下来才是噩梦般的调试，要么给黑方块，要么乱码，不稳定，这次能显示，重启就不行……还是ourAVR那篇资料提醒了我，初始化工作做的不够，写个循环发20次初始化信号，果然稳定了…… 奇怪阿，我明明按照Datasheet的数据来写的，怎么初始化不够呢？……说起1602的Datasheet，ourAVR那里提供了一份中文版，由“长沙太阳人电子有限公司”整理的，区区5页PDF，我另外Google了一份英文版的，顶，80多页，仔细一看，时序图居然有出入！转念一想，1602作为一种标准产品，一般的厂商只是兼容罢了，有多少出入还是正常的吧？不能全相信网上的Datasheet... 也从网上找了其他人写的1602驱程，51的、汇编的什么都来，有些的E使能脉冲居然是下降沿的，如此借鉴来借鉴去，折腾了两天。 最后还是被编译器“跹”了一回，比如把字符串写在发送函数的参数里就给我显示黑方块、乱码，又看了半天AVR的Flash空间、SRAM空间、EEPROM空间等的一大堆，最后才确定，是因为我使用之前《初尝Linux下的AVR单片机开发》里面的avr-objcopy -j .text参数，导致被放在.data段的字符串根本没有放到烧录文件内。 最后还有时序问题。一开始我使用了Busy Wait（读LCD的D7），认为以后就不用考虑命令时序了（LCD接受的命令有us级的一般命令ms级的两条清屏命令），结果还是乱的一团糟，最后往Busy Wait里面放了个死循环，发现程序根本都不绕进去，原来AVR芯片太快的，输出E信号后等不及LCD输出。 其他人写的驱动中，有些根本不考虑Busy标志的问题（干脆R/W接地），只要等候的时间足够，就可以保证写入的正常。在我最后写好的驱动中，我尝试把调用LCD_Busy_Wait的地方换成_delay_ms(5)，把整个LCD_Busy_Wait注释掉，这样工作起来是完全正常的，而且还省了36字节的程序，只是感觉上屏幕的反应就有那么一点的拖滞感。也可以把这个delay换成_delay_us(100)，这样没有拖滞感，但注意0x01这样的复位命令要注意要加个ms级的延时，但如果这样的延时语句多几条，程序在延时上膨胀的体积就远不止36字节了（别小看_delay_ms()，延时越久代码就越大），还不如用上Busy_Wait，这就需要应用在的来衡量了。]]></description> <content:encoded><![CDATA[<p>为1602ALCD屏幕实现的基本驱动功能，8位数据线，3位控制线，可自定义端口，可从LCD_Init函数设定工作方式，实现发送单字符和字符串的基本功能，带busy_wait。使用avr-gcc 编译。</p><p>代码下载：<a
href="http://code.google.com/p/ptcoding/source/browse/trunk/AVR">http://code.google.com/p/ptcoding/source/browse/trunk/AVR</a></p><p>更新：SVN目录内还有串口通讯的模块，以及串口和LCD驱动结合起来的一个试验性程序</p><p>参考资料：<a
href="http://cn.ic-on-line.cn/iol_lcd-1602a/pdfview/917106.htm" target="_blank">lcd1602a_398762.pdf（英文）</a> <a
href="http://www.ouravr.com/download_file.jsp?FileName=app_1602B_lcd_using_sample_pdf.raramp;DownloadPath=./bbs/bbs_upload/download/app_1602B_lcd_using_sample_pdf.raramp;FileSize=363K" target="_blank">ourAVR</a> （注意两份资料的出入，前者更详细）</p><h4>开发手记：</h4><p>之前从天河赛格买了个1602的液晶屏，折腾了两天，终于让ATmega48驱动起来。</p><div
id="attachment_240" class="wp-caption alignright" style="width: 266px"><img
class="size-full wp-image-240" title="AVR-LCD" src="http://apt-blog.net/wp-content/uploads/2009/04/avr-lcd.jpg" alt="AVR-LCD" width="256" height="192" /><p
class="wp-caption-text">闪着“PT from Mars”的LCD(手机照相太差了)</p></div><p>1602本来是一个挺简单的器件，8位数据线和3位控制线，其工作时序图初看起来挺复杂，但其实也就E端使能脉冲的事情，但是折腾下来，再一次验证了“简体中文”资料的不可靠，还有就是“这就是传说中的‘驱动程序’”。</p><p>首先我是从ourAVR网站提供的<a
href="http://www.ouravr.com/app_1602B_lcd_using_sample.html" target="_blank">1602B液晶使用范例</a>提供的资料入手（1602A、B好像没太大区别），借鉴了人家用ICCAVR写的代码（虽然代码是我敲的，但是基本上还是抄的），当LCD上显示出第一个字母时，还挺兴奋的，然而，这只是刚刚开始……（才100多行代码，加上看资料个把小时什么都好了。）</p><p>接下来才是噩梦般的调试，要么给黑方块，要么乱码，不稳定，这次能显示，重启就不行……还是ourAVR那篇资料提醒了我，初始化工作做的不够，写个循环发20次初始化信号，果然稳定了……</p><p>奇怪阿，我明明按照Datasheet的数据来写的，怎么初始化不够呢？……说起1602的Datasheet，ourAVR那里提供了一份中文版，由“长沙太阳人电子有限公司”整理的，区区5页PDF，我另外Google了一份英文版的，顶，80多页，仔细一看，时序图居然有出入！转念一想，1602作为一种标准产品，一般的厂商只是兼容罢了，有多少出入还是正常的吧？不能全相信网上的Datasheet...</p><p>也从网上找了其他人写的1602驱程，51的、汇编的什么都来，有些的E使能脉冲居然是下降沿的，如此借鉴来借鉴去，折腾了两天。</p><p>最后还是被编译器“跹”了一回，比如把字符串写在发送函数的参数里就给我显示黑方块、乱码，又看了半天AVR的Flash空间、SRAM空间、EEPROM空间等的一大堆，最后才确定，是因为我使用之前<a
href="http://apt-blog.net/archives/220.html" target="_blank">《初尝Linux下的AVR单片机开发》</a>里面的avr-objcopy -j .text参数，导致被放在.data段的字符串根本没有放到烧录文件内。</p><p>最后还有时序问题。一开始我使用了Busy Wait（读LCD的D7），认为以后就不用考虑命令时序了（LCD接受的命令有us级的一般命令ms级的两条清屏命令），结果还是乱的一团糟，最后往Busy Wait里面放了个死循环，发现程序根本都不绕进去，原来AVR芯片太快的，输出E信号后等不及LCD输出。</p><p>其他人写的驱动中，有些根本不考虑Busy标志的问题（干脆R/W接地），只要等候的时间足够，就可以保证写入的正常。在我最后写好的驱动中，我尝试把调用LCD_Busy_Wait的地方换成_delay_ms(5)，把整个LCD_Busy_Wait注释掉，这样工作起来是完全正常的，而且还省了36字节的程序，只是感觉上屏幕的反应就有那么一点的拖滞感。也<strong>可以把这个delay换成_delay_us(100)，这样没有拖滞感，但注意0x01这样的复位命令要注意要加个ms级的延时，但如果这样的延时语句多几条，程序在延时上膨胀的体积就远不止36字节了（别小看_delay_ms()，延时越久代码就越大），还不如用上Busy_Wait，这就需要应用在的来衡量了。</strong></p> ]]></content:encoded> <wfw:commentRss>http://apt-blog.net/1602_lcd_driver_under_avr_chip/feed</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
