树莓派论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11575|回复: 7
收起左侧

终于搞掂树莓派驱动I2C LCD1602 液晶 显示时间 附C 版源码

[复制链接]
发表于 2014-1-12 14:38:05 | 显示全部楼层 |阅读模式
话说我我已经买了好几个液晶了。。。
第一个1602是普通的1602,包括背光共有16个脚,接上线那个乱!这我也忍了,就是在网上找了好多资料,试过N次,驱动不上来,后来我总结:这玩意脚多,不是好东西,于是网上又找了一个集成I2C模块的1602,共四个脚,两个电源,两个数据。

接着又是找了好多资料,我是想找C语言的,包括wiringPi里的examples,都不正常。倒是以下这个脚本能正常显示字来,实在没办法了,就把这个Python脚本用C改写了一下,效果还行,把程序贴出来,方便其他朋友。
  1. #!/usr/bin/python

  2. import time
  3. import smbus

  4. BUS = smbus.SMBus(1)
  5. LCD_ADDR = 0x27

  6. #LCD_ADDR = 0x3F sudo i2cdetect -y -a 0

  7. def send_command(comm):
  8.         # Send bit7-4 firstly
  9.         buf = comm & 0xF0
  10.         buf |= 0x04               # RS = 0, RW = 0, EN = 1
  11.         BUS.write_byte(LCD_ADDR ,buf)
  12.         time.sleep(0.002)
  13.         buf &= 0xFB               # Make EN = 0
  14.         BUS.write_byte(LCD_ADDR ,buf)
  15.        
  16.         # Send bit3-0 secondly
  17.         buf = (comm & 0x0F) << 4
  18.         buf |= 0x04               # RS = 0, RW = 0, EN = 1
  19.         BUS.write_byte(LCD_ADDR ,buf)
  20.         time.sleep(0.002)
  21.         buf &= 0xFB               # Make EN = 0
  22.         BUS.write_byte(LCD_ADDR ,buf)

  23. def send_data(data):
  24.         # Send bit7-4 firstly
  25.         buf = data & 0xF0
  26.         buf |= 0x05               # RS = 1, RW = 0, EN = 1
  27.         BUS.write_byte(LCD_ADDR ,buf)
  28.         time.sleep(0.002)
  29.         buf &= 0xFB               # Make EN = 0
  30.         BUS.write_byte(LCD_ADDR ,buf)
  31.        
  32.         # Send bit3-0 secondly
  33.         buf = (data & 0x0F) << 4
  34.         buf |= 0x05               # RS = 1, RW = 0, EN = 1
  35.         BUS.write_byte(LCD_ADDR ,buf)
  36.         time.sleep(0.002)
  37.         buf &= 0xFB               # Make EN = 0
  38.         BUS.write_byte(LCD_ADDR ,buf)

  39. def init_lcd():
  40.         try:
  41.                 send_command(0x33) # Must initialize to 8-line mode at first
  42.                 time.sleep(0.005)
  43.                 send_command(0x32) # Then initialize to 4-line mode
  44.                 time.sleep(0.005)
  45.                 send_command(0x28) # 2 Lines & 5*7 dots
  46.                 time.sleep(0.005)
  47.                 send_command(0x0C) # Enable display without cursor
  48.                 time.sleep(0.005)
  49.                 send_command(0x01) # Clear Screen
  50.         except:
  51.                 return False
  52.         else:
  53.                 return True

  54. def clear_lcd():
  55.         send_command(0x01) # Clear Screen

  56. def print_lcd(x, y, str):
  57.         if x < 0:
  58.                 x = 0
  59.         if x > 15:
  60.                 x = 15
  61.         if y <0:
  62.                 y = 0
  63.         if y > 1:
  64.                 y = 1

  65.         # Move cursor
  66.         addr = 0x80 + 0x40 * y + x
  67.         send_command(addr)
  68.        
  69.         for chr in str:
  70.                 send_data(ord(chr))

  71. if __name__ == '__main__':
  72.         init_lcd()
  73.        
  74.         print_lcd(0, 0, 'Hello, world!')
  75.         print_lcd(0, 1, 'ucat.taobao.com')
复制代码
我改写的C语言版
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #include <errno.h>
  5. #include <string.h>
  6. #include <time.h>
  7. #include <wiringPi.h>
  8. #include <lcd.h>

  9. int xio;

  10. void send_command(int comm)
  11. {
  12.         // Send bit7-4 firstly
  13.         int buf;
  14.         buf = comm & 0xF0;
  15.         buf |= 0x04;               // RS = 0, RW = 0, EN = 1

  16.         wiringPiI2CWrite(xio,buf);
  17.         usleep(2000);
  18.         buf &= 0xFB;               // Make EN = 0
  19.         wiringPiI2CWrite(xio,buf);

  20.         // Send bit3-0 secondly
  21.         buf = (comm & 0x0F) << 4;
  22.         buf |= 0x04;               // RS = 0, RW = 0, EN = 1
  23.         wiringPiI2CWrite(xio,buf);
  24.         usleep(2000);
  25.         buf &= 0xFB;               // Make EN = 0
  26.         wiringPiI2CWrite(xio,buf);
  27. }


  28. void send_data(data)
  29. {
  30.         // Send bit7-4 firstly
  31.         int buf;
  32.         buf = data & 0xF0;
  33.         buf |= 0x05;//               # RS = 1, RW = 0, EN = 1
  34.         wiringPiI2CWrite(xio,buf);
  35.         usleep(2000);
  36.         buf &= 0xFB;//               # Make EN = 0
  37.         wiringPiI2CWrite(xio,buf);
  38.        
  39.         // Send bit3-0 secondly
  40.         buf = (data & 0x0F) << 4;
  41.         buf |= 0x05;//               # RS = 1, RW = 0, EN = 1
  42.         wiringPiI2CWrite(xio,buf);
  43.         usleep(2000);
  44.         buf &= 0xFB;//               # Make EN = 0
  45.         wiringPiI2CWrite(xio,buf);
  46. }

  47. void init_lcd(void)
  48. {
  49.                 send_command(0x33);// # Must initialize to 8-line mode at first
  50.                 usleep(5000);
  51.                 send_command(0x32);// # Then initialize to 4-line mode
  52.                 usleep(5000);
  53.                 send_command(0x28);// # 2 Lines & 5*7 dots
  54.                 usleep(5000);
  55.                 send_command(0x0C);// # Enable display without cursor
  56.                 usleep(5000);
  57.                 send_command(0x01);// # Clear Screen
  58. }
  59.                
  60.                
  61. void print_lcd(int x, int y, char* str)
  62. {
  63.         int addr;
  64.        
  65.         if( x < 0)
  66.                 x = 0;
  67.         if(x > 15)
  68.                 x = 15;
  69.         if(y <0)
  70.                 y = 0;
  71.         if(y > 1)
  72.                 y = 1;

  73.         //# Move cursor
  74.         addr = 0x80 + 0x40 * y + x;
  75.         send_command(addr);
  76.        
  77.         while(*str)
  78.                 send_data(*str++);
  79. }
  80.                
  81. int main (void)
  82. {
  83.   struct tm *t ;
  84.   time_t tim ;

  85.   char buf [32] ;
  86.   
  87.   printf ("Raspberry Pi LCD test program\n") ;

  88.   xio = wiringPiI2CSetup (0x27);
  89.   if (xio < 0){
  90.     fprintf (stderr, "xio: Unable to initialise I2C: %s\n", strerror (errno));
  91.     return 1;
  92.   }
  93.   wiringPiI2CWriteReg8 (xio, 0x0a, 0x84) ;  // IOCON - set BANK bit
  94.   wiringPiI2CWriteReg8 (xio, 0x05, 0x84) ;  // IOCON - set ODR in bank 0
  95.   wiringPiI2CWriteReg8 (xio, 0x00, 0x00) ;  // Port A -> Outputs

  96.   init_lcd();
  97.        

  98.   while(1)
  99.         {
  100.     tim = time (NULL) ;
  101.     t = localtime (&tim) ;
  102.     sprintf (buf, "    %02d:%02d:%02d    ", t->tm_hour, t->tm_min, t->tm_sec) ;

  103.         print_lcd(0, 0, "ucat.taobao.com");
  104.     print_lcd (0, 1, buf) ;
  105.         }
  106.        
  107.   return 0;
  108. }
复制代码
C 版运行效果
IMG_20140112_005717.jpg


这几天天冷,我想做一个即时显示温度的设备,温度传感器方面以前已测试过了,就是这显示折腾了我好久。
python版的代码,我忘记出处了,好像也是这个论坛的。
回复

使用道具 举报

 楼主| 发表于 2014-1-12 14:40:12 | 显示全部楼层
大家看图上的接线,是不是好清爽啊?
回复 支持 反对

使用道具 举报

发表于 2014-1-13 10:23:33 | 显示全部楼层
赞一个,好东西
回复 支持 反对

使用道具 举报

发表于 2014-1-13 19:26:53 | 显示全部楼层
....浪费电,5V 1A  5瓦的时钟、、、、不过喜欢就好
回复 支持 反对

使用道具 举报

发表于 2014-1-14 18:14:52 | 显示全部楼层
编程完全看不懂,过年这段时间打算买几本书补一补
回复 支持 反对

使用道具 举报

发表于 2014-2-18 08:45:31 | 显示全部楼层
好酷啊
回复 支持 反对

使用道具 举报

发表于 2014-2-22 11:31:54 | 显示全部楼层
楼主,我想做一个uart的部分,但是搜不到什么资料,你有相关资料吗?1058306167@qq.com
回复 支持 反对

使用道具 举报

发表于 2014-3-5 16:39:07 | 显示全部楼层
好东西,谢谢分享
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|树莓派论坛 ( 粤ICP备15075382号-1  

GMT+8, 2024-11-25 20:27 , Processed in 1.109375 second(s), 27 queries , Gzip On.

Powered by Shumeipai.net! X3.2

© 2001-2015 树莓派论坛安全联盟

快速回复 返回顶部 返回列表