极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20478|回复: 5

I2C接口1306芯片OLED屏12864,字符串向上下左右移动演示

[复制链接]
发表于 2013-7-28 14:58:09 | 显示全部楼层 |阅读模式
本帖最后由 Microduino 于 2013-7-29 23:27 编辑

I2C接口1306芯片OLED屏12864,字符串向上下左右移动演示
作用:字符串向左移动,向右移动,向下称动,向上移动,在同一个位置显示一个ASCII字符

I2C接口OLED屏12864 张老师的
1306驱动芯片
IDE V1.01
u8glib V1.12

OLED屏线路连接 GND接Ardunio GND
              VCC接Arduino 3.3V
              SDA接Ardunio 模拟口A4
              SCL接Ardunio 模拟口A5

这个屏只能使用 u8glib 这个库文件

驱动芯片选择 U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);        // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)

OLED 12864图片


由于个人经验不足,没有找到清屏的函数,或是用空格清除指定位置的字符的函数。
经实验发现,可以用翻页的方法实现。

比如一个字符串向左移动

第一页,在坐标0,0显示字符串
接下来 下一页,在坐标-10,0显示字符串
再一页,在坐标-20,0显示字符串 如此类推,就实现了字符串的移动功能。

完整的Arduino代码如下:
  1. //张老师的OLED版12864
  2. //本程序实现了一个字符串向左移动,向右移动,向下称动,向上移动,在同一个位置显示一个ASCII字符
  3. //该程序的函数不能通用化,使用起来麻烦
  4. #include "U8glib.h"
  5. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);        // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
  6. char str1[]="HW SPI Com: CS = 10, A0 = 9 ";
  7. char str2[]="HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)";


  8. void moveStrToRight(void)
  9. //这个函数未实现字符串从左向右移动,而是出现了字符串叠加的现象(使用str2)。
  10. //原来是字符串太长了
  11. {
  12.   u8g.setFont(u8g_font_unifont);
  13.   char str1[]="HW SPI Com: CS = 10, A0 = 9 ";
  14.   for (int i=0;i<=12;i++)
  15.   {
  16.     u8g.firstPage();  
  17.     do {

  18.       u8g.drawStr(i*10,10,(char *)str1);


  19.     }
  20.     while( u8g.nextPage() );   
  21.     delay(100);
  22.   }  

  23. }
  24. void moveStr2ToRight(char *str1,char *str2,int x1,int y1,int x2,int y2)
  25. //这个函数未实现字符串从左向右移动,而是出现了字符串叠加的现象。
  26. //原来是字符串太长了
  27. {

  28.   for (int i=0;i<=12;i++)
  29.   {
  30.     u8g.firstPage();  
  31.     do {

  32.       u8g.drawStr(i*10+x1,y1,(char *)str1);
  33.       u8g.drawStr(i*10+x2,y2,(char *)str2);


  34.     }
  35.     while( u8g.nextPage() );   
  36.     delay(100);
  37.   }  

  38. }


  39. void moveStrToLeft(void)
  40. //这个函数未实现字符串从右向左移动,而是出现了字符串叠加的现象。
  41. //原来是字符串太长了
  42. {
  43.   u8g.setFont(u8g_font_unifont);

  44.   char str[]="HW SPI Com: CS = 10, A0 = 9 ";

  45.   for (int i=0;i<=12;i++)
  46.   {
  47.     u8g.firstPage();  
  48.     do {
  49.       u8g.drawStr(120-i*10,22,(char *)str);



  50.     }
  51.     while( u8g.nextPage() );   
  52.     delay(300);
  53.   }  

  54. }
  55. void moveStrToDown(void)// 这个过程是字符串竖直排,从上向下移动位置

  56. {
  57.   u8g.setFont(u8g_font_unifont);//似乎只有设置这个字体drawStr90函数才起作用
  58.   char str[]="HW SPI Com: CS = 10 ";
  59.   //注这个字符串共有20个字符,20*8=160(字体像素以6*8计算)
  60.   //显示的位置是从Y轴-160开始,然后每次向下增进10个像素值,从上向下完全的完整显示字符串
  61.   for (int i=0;i<=10;i++)
  62.   {
  63.     u8g.firstPage();  
  64.     do {
  65.       u8g.drawStr90(10,i*16-160,(char *)str);



  66.     }
  67.     while( u8g.nextPage() );   
  68.     delay(300);
  69.   }  

  70. }

  71. void moveStrToUp(void)// 这个过程是字符串竖直排,从下向上移动位置

  72. {
  73.   u8g.setFont(u8g_font_unifont);
  74.   char str[]="HW SPI Com: CS = 10 ";
  75.   //注这个字符串共有20个字符,20*8=160(字体像素以6*8计算)
  76.   //显示的位置是从Y轴-160开始,然后每次向上增进10个像素值,从下向上完全的完整显示字符串
  77.   //为了能显示最后一个字符,Y轴的值至少为-20*8=-160
  78.   for (int i=0;i<=17;i++)
  79.   {
  80.     u8g.firstPage();  
  81.     do {
  82.       u8g.drawStr90(10,60-i*10,(char *)str);



  83.     }
  84.     while( u8g.nextPage() );   
  85.     delay(300);
  86.   }  

  87. }
  88. void u8g_prepare(void) {
  89.   u8g.setFont(u8g_font_6x10);
  90.   u8g.setFontRefHeightExtendedText();
  91.   u8g.setDefaultForegroundColor();
  92.   u8g.setFontPosTop();
  93. }
  94. uint8_t draw_state = 0;

  95. void mydraw(void) {
  96.   u8g_prepare();
  97.   switch(draw_state >> 3) {
  98.   case 0:
  99.     moveStrToLeft();
  100.     break;
  101.   case 1:   
  102.     moveStrToRight() ;
  103.     break;
  104.   case 2:
  105.     moveStrToUp();
  106.     break;
  107.   case 3:
  108.     moveStrToDown();
  109.     break;
  110.   case 4:
  111.     displayAchar();
  112.     break;
  113.   case 5:
  114.     u8g_ascii_1();
  115.     break;
  116.   case 6:
  117.     newtest();
  118.     break;


  119.   }
  120. }


  121. void u8g_ascii_1() //显示ascii在屏幕上
  122. {
  123.   char s[2] = " ";
  124.   uint8_t x, y;
  125.   u8g.drawStr( 0, 0, "ASCII page 1");
  126.   for( y = 0; y < 6; y++ ) {
  127.     for( x = 0; x < 16; x++ )
  128.     {
  129.       s[0] = y*16 + x + 32;
  130.       u8g.firstPage();  
  131.       do {

  132.         u8g.drawStr(31, 40, s);  
  133.         //如果需要依次在不同的位置显示,如下行
  134.         //u8g.drawStr(x*7, y*10+10, s);
  135.         delay(50);

  136.       }
  137.       while( u8g.nextPage() );


  138.     }
  139.   }
  140. }
  141. char s[2]=" ";
  142. void test(char s)//显示一个ASCII字符
  143. {

  144.   uint8_t x,y;
  145.   u8g.drawStr(0,0,"ASCII a char");


  146.   u8g.drawStr(100,50,(char *)s);
  147.   delay(100);

  148. }
  149. void newtest()//显示一个ASCII字符
  150. {
  151.   int i=33;
  152.   s[2]=i;
  153.   test( s[0]);
  154.   if (i>126) //如是i>126进入死循环中,不在做任何事
  155.     while (true)
  156.     {
  157.       continue;
  158.     }

  159.   i++;
  160. }   


  161. void setup()
  162. {


  163.   if ( u8g.getMode() == U8G_MODE_R3G3B2 )
  164.     u8g.setColorIndex(255);     // white
  165.   else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
  166.     u8g.setColorIndex(3);         // max intensity
  167.   else if ( u8g.getMode() == U8G_MODE_BW )
  168.     u8g.setColorIndex(1);         // pixel on

  169.   u8g.setFont(u8g_font_unifont);
  170.   Serial.begin(9600);


  171.   u8g_prepare();//初始化字体,屏幕参数



  172. }

  173. void loop()
  174. {


  175.   mydraw();

  176.   draw_state++;
  177.   if ( draw_state >= 7*8 )
  178.     draw_state = 0;

  179.   // rebuild the picture after some delay
  180.   delay(100);

  181. }



  182. void displayAchar()//这个过程,在同一个位置,显示不同的字符
  183. {

  184.   char s[2] = " ";
  185.   uint8_t x, y;
  186.   u8g.drawStr( 0, 0, "ASCII page 1");
  187.   for( y = 0; y < 6; y++ ) {
  188.     for( x = 0; x < 16; x++ )
  189.     {
  190.       s[0] = y*16 + x + 32;
  191.       u8g.firstPage();  
  192.       do {

  193.         u8g.drawStr(31, 40, s);  
  194.         //如果需要依次在不同的位置显示,如下行
  195.         //u8g.drawStr(x*7, y*10+10, s);
  196.         delay(50);

  197.       }
  198.       while( u8g.nextPage() );



  199.     }
  200.   }

  201. }




  202. 为了方便程序的移植,将各个函数标准化,使之能通用。
  203. 代码如下:



  204. //张老师的I2C OLED版12864
  205. //本程序实现了一个字符串向左移动,向右移动,向下称动,向上移动,在同一个位置显示一个ASCII字符
  206. //将各个函数改写使之通用化
  207. #include "U8glib.h"
  208. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);        // HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)
  209. char str1[]="HW SPI Com: CS = 10, A0 = 9 ";
  210. char str2[]="HW SPI Com: CS = 10, A0 = 9 (Hardware Pins are  SCK = 13 and MOSI = 11)";


  211. void moveStrToRight(char *str,int x,int y)
  212. //这个函数未实现字符串从左向右移动,而是出现了字符串叠加的现象。
  213. //原来是字符串太长了
  214. {

  215.   for (int i=0;i<=12;i++)
  216.   {
  217.     u8g.firstPage();  
  218.     do {

  219.       u8g.drawStr(i*10+x,y,(char *)str);


  220.     }
  221.     while( u8g.nextPage() );   
  222.     delay(100);
  223.   }  

  224. }

  225. void moveStr2ToRight(char *str1,char *str2,int x1,int y1,int x2,int y2)
  226. //这个函数未实现字符串从左向右移动,而是出现了字符串叠加的现象。
  227. //原来是字符串太长了
  228. {

  229.   for (int i=0;i<=12;i++)
  230.   {
  231.     u8g.firstPage();  
  232.     do {

  233.       u8g.drawStr(i*10+x1,y1,(char *)str1);
  234.       u8g.drawStr(i*10+x2,y2,(char *)str2);


  235.     }
  236.     while( u8g.nextPage() );   
  237.     delay(100);
  238.   }  

  239. }


  240. void moveStrToLeft(char *str,int x, int y)
  241. //这个函数未实现字符串从右向左移动,而是出现了字符串叠加的现象。
  242. //原来是字符串太长了
  243. {



  244.   for (int i=0;i<=12;i++)
  245.   {
  246.     u8g.firstPage();  
  247.     do {
  248.       u8g.drawStr(x-i*10,y,(char *)str1);

  249.     }
  250.     while( u8g.nextPage() );   
  251.     delay(100);
  252.   }  

  253. }
  254. void moveStrToDown(char *str,int x ,int y)// 这个过程是字符串竖直排,从上向下移动位置

  255. {

  256.   //注这个字符串共有20个字符,20*8=160(字体像素以6*8计算)
  257.   //显示的位置是从Y轴-160开始,然后每次向下增进10个像素值,从上向下完全的完整显示字符串
  258.   for (int i=0;i<=10;i++)
  259.   {
  260.     u8g.firstPage();  
  261.     do {
  262.       u8g.drawStr90(x,i*16-y,(char *)str);



  263.     }
  264.     while( u8g.nextPage() );   
  265.     delay(100);
  266.   }  

  267. }

  268. void moveStrToUp(char *str,int x,int y)// 这个过程是字符串竖直排,从下向上移动位置

  269. {


  270.   //str1[]  注这个字符串共有20个字符,20*8=160(字体像素以6*8计算)
  271.   //显示的位置是从Y轴-160开始,然后每次向上增进10个像素值,从下向上完全的完整显示字符串
  272.   //为了能显示最后一个字符,Y轴的值至少为-20*8=-160
  273.   for (int i=0;i<=17;i++)
  274.   {
  275.     u8g.firstPage();  
  276.     do {
  277.       u8g.drawStr90(x,y-i*10,(char *)str1);

  278.     }
  279.     while( u8g.nextPage() );   
  280.     delay(100);
  281.   }  

  282. }
  283. void u8g_prepare(void) {
  284.   u8g.setFont(u8g_font_6x10);
  285.   u8g.setFontRefHeightExtendedText();
  286.   u8g.setDefaultForegroundColor();
  287.   u8g.setFontPosTop();
  288. }
  289. uint8_t draw_state = 0;

  290. void mydraw(void) {
  291.   u8g_prepare();
  292.   switch(draw_state >> 3) {
  293.   case 0:
  294.     moveStrToLeft(str1,120,10); //x=20(个字符数)*6(字符宽),y=10差不多在第一行
  295.     break;
  296.   case 1:   
  297.     moveStrToRight(str1,0,10) ; //x=0,y=10 ,y=10差不多在第一行
  298.     break;
  299.   case 2:
  300.     moveStrToUp(str1,10,60); //x=10,y=60 x在超过一个字符位置,Y在差不多第六行
  301.     break;
  302.   case 3:
  303.     moveStrToDown(str1,10,120); //x=10,由于str1字符长度20个,字符串长度是=20*8=160,y就等于120
  304.     break;
  305.   case 4:
  306.     displayAchar(); //在依次显示不同的ASCII字符
  307.     break;
  308.   case 5:
  309.     u8g_ascii_1(30,50); //在指定的坐标,显示不同的ASCII字符
  310.     break;



  311.   }
  312. }


  313. void u8g_ascii_1(int i,int j) //显示ascii在屏幕上
  314. {
  315.   char s[2] = " ";
  316.   uint8_t x, y;

  317.   for( y = 0; y < 6; y++ ) {
  318.     for( x = 0; x < 16; x++ )
  319.     {
  320.       s[0] = y*16 + x + 32;
  321.       do {
  322.         u8g.drawStr( 0, 0, "ASCII page 1");
  323.         u8g.drawStr(i, j, s);   
  324.         //如果需要依次在不同的位置显示,如下行
  325.         //  u8g.drawStr(x*7+i, y*10+j, s);        
  326.         delay(50);

  327.       }
  328.       while( u8g.nextPage() );



  329.     }
  330.   }
  331. }


  332. void setup()
  333. {


  334.   if ( u8g.getMode() == U8G_MODE_R3G3B2 )
  335.     u8g.setColorIndex(255);     // white
  336.   else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
  337.     u8g.setColorIndex(3);         // max intensity
  338.   else if ( u8g.getMode() == U8G_MODE_BW )
  339.     u8g.setColorIndex(1);         // pixel on

  340.   // u8g.setFont(u8g_font_unifont);
  341.   Serial.begin(9600);


  342.   u8g_prepare();//初始化字体,屏幕参数



  343. }

  344. void loop()
  345. {


  346.   //moveStr2ToRight(str1,str2,0,0,0,10);
  347.   mydraw();
  348.   draw_state++;
  349.   if ( draw_state >= 7*8 )
  350.     draw_state = 0;

  351.   // rebuild the picture after some delay
  352.   delay(100);

  353. }



  354. void displayAchar()//这个过程,依次在不同的坐标,显示不同ASCII的字符
  355. {

  356.   char s[2] = " ";
  357.   uint8_t x, y;

  358.   for( y = 0; y < 6; y++ ) {
  359.     for( x = 0; x < 16; x++ )
  360.     {
  361.       s[0] = y*16 + x + 32;
  362.       u8g.firstPage();  
  363.       do {
  364.         u8g.drawStr( 0, 0, "ASCII page 1");
  365.         //  u8g.drawStr(31, 40, s);   
  366.         //如果需要依次在不同的位置显示,如下行
  367.         u8g.drawStr(x*7, y*10, s);        
  368.         delay(50);

  369.       }
  370.       while( u8g.nextPage() );



  371.     }
  372.   }

  373. }
复制代码












400px-Oled.jpg
回复

使用道具 举报

发表于 2013-7-28 15:25:17 | 显示全部楼层
阅。。。有空尝试。。
回复 支持 反对

使用道具 举报

发表于 2013-7-28 22:54:38 | 显示全部楼层
看着好麻烦的样子呀
回复 支持 反对

使用道具 举报

发表于 2013-12-29 00:01:24 | 显示全部楼层
赞一个!
回复 支持 反对

使用道具 举报

发表于 2014-2-24 17:52:24 | 显示全部楼层
能给这LCD的TB链接么?
回复 支持 反对

使用道具 举报

发表于 2018-5-22 15:07:30 | 显示全部楼层
试过了,可用。

再研究一下,看看怎么才能用起来。
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2020-9-27 15:33 , Processed in 0.051210 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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