为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,这就需要应用在的来衡量了。
此前接触过AVR单片机,发现无论是书店里面的教材,还是网上一大堆的中文资料,无一例外都是说windows下使用WinAVR、ICCAVR之类的,Linux方面的简直只字不提,难道这就是传说中的中国国情?外国情况可很不一样,玩单片机的Geek一般都很哈Linux,做单片机开发的软件一应俱全,当然还是开源的。 昨天从淘宝重新买了条USB的下载线,回来一看是USBasp的设计,附送的光盘当然也是win下的驱动和说明了,忽略。 插上下载器,lsusb,认倒是认出来了,叫做VOIT,那怎么用呢?上网一搜,原来USBasp是德国人的设计http://www.fischl.de/usbasp/,GPL的,其中提到AVRDUDE支持USBasp,当然也有源码下载。不过我用的是Ubuntu,发挥超级牛力的时候到了:sudo apt-get install avrdude,恩,几秒钟搞定,让他们去编译吧! Linux下做单片机开发当然首选GCC,就如这些英文教程说的,下载源码?No,No,APT has Super Cow Powers,继续sudo apt-get install gcc-avr binutils-avr avr-libc 几分钟装完,很好,估计那些下载源码回来编译的同学要去喝两个小时茶才能用了。 万事俱全,先写个单片机的HelloWorld,借用micahcarrick的源码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #define F_CPU 1000000UL /* 1 MHz CPU clock */ #include <util/delay.h> #include <avr/io.h> [...]
这些天一直在想怎么扩充ibus输入法的词库,虽然一般使用感觉还好。在网上找到sogou提供了一个“互联网词库”,里面是搜索引擎分析出来的15万多词语,本想拿来导入到ibus,先用python测试了一下有多少词语已经在ibus的默认词库中,最后发现15万流行词中只有200多不在默认词库中,ibus词库确实挺优秀。 程序输出:(测试代码见后) seached: 157200 times. 215 phrases not in the database, written in file 'notexist' 查看notexist文件,发现除了后半部分一大堆频度为1的成语之外,只有20多个大频率词没在默认词库: (- -|原来连“裸体”都没有?太和谐了!建议广滇驹推荐ibus为国家首选输入法) 乾坤 3561275 N, 乾隆 3088184 N, 乾净 1533219 夥伴 1052393 瞭望 984469 宏碁 979267 乾脆 953204 乾燥 624377 清乾隆 480337 乾隆皇帝 380252 N, 阿房宫 235461 乾隆年间 214986 定乾坤 210477 乾隆帝 149133 乾坤袋 143966 著色 111072 萧乾 84647 [...]
Page optimized by WP Minify WordPress Plugin