找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7764|回复: 5
收起左侧

U8glib写的oled电量显示

[复制链接]
ID:255921 发表于 2018-1-17 20:10 | 显示全部楼层 |阅读模式
用的U8glib写的,用了两种方式,位图和字符输出 QQ图片20180117200534.png ,代码直接打包放下面,默认i2c接线A4 A5。我用的arduino nano ,OLED显示屏显示的位置根据自己需要改代码中相应位置

源程序如下:

  1. #include "U8glib.h"
  2. U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);        // I2C / TWI
  3. //U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);        // I2C / TWI  SDA A4 SCL   A5
  4. #define u8g_logo_width 38
  5. #define u8g_logo_height 24
  6. //static unsigned char u8g_logo_bits[] = {
  7. int flash=0;
  8. const uint8_t rook_bitmap5[] U8G_PROGMEM = {
  9. 0x00,0x00,0xFE,0xFF,0xFF,0xFE,0x00,0x00};//电池满   
  10. const uint8_t rook_bitmap4[] U8G_PROGMEM = {
  11. 0x00,0x00,0xFE,0xFD,0xFD,0xFE,0x00,0x00};
  12. const uint8_t rook_bitmap3[] U8G_PROGMEM = {
  13. 0x00,0x00,0xFE,0xF9,0xF9,0xFE,0x00,0x00};
  14. const uint8_t rook_bitmap2[] U8G_PROGMEM = {
  15. 0x00,0x00,0xFE,0xE1,0xE1,0xFE,0x00,0x00};
  16. const uint8_t rook_bitmap1[] U8G_PROGMEM = {
  17. 0x00,0x00,0xFE,0x81,0x81,0xFE,0x00,0x00};
  18. const uint8_t rook_bitmap0[] U8G_PROGMEM = {
  19. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //电池空   
  20. //读取vcc电压
  21. long readVcc() {
  22.   long result;
  23.   // Read 1.1V reference against AVcc
  24.   ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  25.   delay(2); // Wait for Vref to settle
  26.   ADCSRA |= _BV(ADSC); // Convert
  27.   while (bit_is_set(ADCSRA,ADSC));
  28.   result = ADCL;
  29.   result |= ADCH<<8;
  30.   result = 1126400L / result; // Back-calculate AVcc in mV
  31.   return result;
  32. }
  33. void loop(void) {
  34. float vcc_vol=readVcc()/1000;                //将读取的vcc电压mv转换为v
  35. //旋转90°
  36. //u8g.setRot90(); //or setRot180();  setRot270();
  37. u8g.setFont(u8g_font_gdr14r);//坐标函数 字体osb18
  38. // u8g.setPrintPos(0, 20);      //定位电池电量图标的起始位置
  39.    if (vcc_vol >=4.5 ){
  40.   u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, rook_bitmap5);// u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, rook_bitmap0);
  41.   }
  42.   if (vcc_vol <4.5 && vcc_vol>=4 ){
  43.   u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, rook_bitmap4);
  44.   }
  45.   if (vcc_vol <4 && vcc_vol>=3.5 ){
  46.   u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, rook_bitmap3);
  47.   }
  48.   if (vcc_vol <3.5 && vcc_vol>=3 ){
  49. u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, rook_bitmap2);
  50.   }
  51.   if (vcc_vol <3 ){                  //当VCC电压小于3v时图标闪烁,电池电量不足警告
  52.   switch (flash){               
  53.     case 0:  
  54.          u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, rook_bitmap1);
  55.          flash=1;
  56.          break;
  57.     case 1:
  58.          u8g.drawXBMP( 0, 0, u8g_logo_width, u8g_logo_height, rook_bitmap0);
  59.          flash=0;
  60.          break;
  61.        }     
  62.      }

  63. ……………………

  64. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
XBM.zip (1.24 KB, 下载次数: 65)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:255921 发表于 2018-1-19 17:18 | 显示全部楼层
代码有点问题了,不过现在没时间改了
回复

使用道具 举报

ID:277903 发表于 2018-5-13 09:45 | 显示全部楼层
代码帮你改了下 现在正常可以使用

  1. #include "U8glib.h"
  2. //U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);        // I2C / TWI
  3. U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NONE);        // I2C / TWI  SDA A4 SCL   A5
  4. //static unsigned char u8g_logo_bits[] = {
  5. int flash = 0;
  6. const uint8_t rook_bitmap5[] U8G_PROGMEM = {
  7.   0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFE, 0x00, 0x00
  8. };//电池满
  9. const uint8_t rook_bitmap4[] U8G_PROGMEM = {
  10.   0x00, 0x00, 0xFE, 0xFD, 0xFD, 0xFE, 0x00, 0x00
  11. };
  12. const uint8_t rook_bitmap3[] U8G_PROGMEM = {
  13.   0x00, 0x00, 0xFE, 0xF9, 0xF9, 0xFE, 0x00, 0x00
  14. };
  15. const uint8_t rook_bitmap2[] U8G_PROGMEM = {
  16.   0x00, 0x00, 0xFE, 0xE1, 0xE1, 0xFE, 0x00, 0x00
  17. };
  18. const uint8_t rook_bitmap1[] U8G_PROGMEM = {
  19.   0x00, 0x00, 0xFE, 0x81, 0x81, 0xFE, 0x00, 0x00
  20. };
  21. const uint8_t rook_bitmap0[] U8G_PROGMEM = {
  22.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  23. }; //电池空
  24. //读取vcc电压
  25. long readVcc() {
  26.   long result;
  27.   // Read 1.1V reference against AVcc
  28.   ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
  29.   delay(2); // Wait for Vref to settle
  30.   ADCSRA |= _BV(ADSC); // Convert
  31.   while (bit_is_set(ADCSRA, ADSC));
  32.   result = ADCL;
  33.   result |= ADCH << 8;
  34.   result = 1126400L / result; // Back-calculate AVcc in mV
  35.   return result;
  36. }
  37. void loop(void) {
  38.   float vcc_vol = readVcc() / 1000;            //将读取的vcc电压mv转换为v
  39.   //旋转90°
  40.   //u8g.setRot90(); //or setRot180();  setRot270();
  41.   u8g.firstPage();
  42.   do {
  43.     u8g.setFont(u8g_font_gdr14r);//坐标函数 字体osb18
  44.     if (vcc_vol >= 4.5 ) {
  45.       u8g.drawBitmapP(0, 0, 1, 8, rook_bitmap5);
  46.     }
  47.     if (vcc_vol < 4.5 && vcc_vol >= 4 ) {
  48.       u8g.drawBitmapP(0, 0, 1, 8, rook_bitmap4);
  49.     }
  50.     if (vcc_vol < 4 && vcc_vol >= 3.5 ) {

  51.       u8g.drawBitmapP(0, 0, 1, 8, rook_bitmap3);
  52.     }
  53.     if (vcc_vol < 3.5 && vcc_vol >= 3 ) {

  54.       u8g.drawBitmapP(0, 0, 1, 8, rook_bitmap2);
  55.     }
  56.     if (vcc_vol < 3 ) {                //当VCC电压小于3v时图标闪烁,电池电量不足警告
  57.       switch (flash) {
  58.         case 0:
  59.           u8g.drawBitmapP(0, 0, 1, 8, rook_bitmap1);
  60.           flash = 1;
  61.           break;
  62.         case 1:
  63.           u8g.drawBitmapP(0, 0, 1, 8, rook_bitmap0);
  64.           flash = 0;
  65.           break;
  66.       }
  67.     }
  68.   } while ( u8g.nextPage() );
  69. }

  70. void setup(void) {
  71.   // flip screen, if required
  72.   // u8g.setRot180();
  73. }


复制代码
回复

使用道具 举报

ID:373684 发表于 2018-10-21 16:48 | 显示全部楼层
楼上都是大神啊。
回复

使用道具 举报

ID:429183 发表于 2018-11-22 12:27 | 显示全部楼层
膜拜大神。。。
回复

使用道具 举报

ID:371527 发表于 2018-12-18 20:34 | 显示全部楼层
谢谢!看看你的显示效果,如果上贴图片更直观
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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