找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5056|回复: 1
收起左侧

OLED花样显示之折线图 STM32源程序

[复制链接]
ID:222477 发表于 2019-6-11 23:24 | 显示全部楼层 |阅读模式
用STM32F103C8T6驱动0.96寸OLED显示屏显示折线图,可以用于显示温读,湿度等数据,让数据的变化更直观,界面更炫酷
制作出来的实物图如下:
IMG_20190611_225950.jpg

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"         
  6. #include "usmart.h"        
  7. #include "OLED_I2C.h"
  8. extern unsigned char BMP1[];

  9. unsigned char BMP2[8192];

  10. //将128*8的数组转为128*64
  11. void Change_to_12864(unsigned char BMP[])
  12. {
  13.         unsigned int j=0;
  14.         unsigned char x,y,n,BMP3[1024];
  15.         for(y=0;y<64;y=y+8)
  16.         {
  17.                 for(x=0;x<128;x++)
  18.                 {
  19.                         BMP3[j]=BMP[j];
  20.                         for(n=0;n<8;n++)
  21.                         {        
  22.                                         if(BMP3[j]&0x01)
  23.                                         BMP2[x+(y+n)*128]=1;
  24.                                         BMP3[j]=BMP3[j]>>1;
  25.                         }               
  26.                         j++;                        
  27.                 }
  28.         }
  29. }
  30. //将128*64的数组转为128*8
  31. void Change_to_1288(unsigned char BMP4[])
  32. {
  33.         unsigned int j=0;
  34.         unsigned char x,y,n,temp;
  35.         
  36.         for(y=0;y<64;y=y+8)
  37.         {
  38.                 for(x=0;x<128;x++)
  39.                 {
  40.                         for(n=0;n<8;n++)
  41.                         {               
  42.                                         temp|=BMP4[x+(y+n)*128]<<7;
  43.                                         if(n<7)
  44.                                         temp=temp>>1;
  45.                         }
  46.                         BMP1[j]=temp;
  47.                         temp=0;
  48.                         j++;
  49.                 }
  50.         }
  51. }

  52. //画线
  53. //x1,y1:起点坐标
  54. //x2,y2:终点坐标  
  55. void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2)
  56. {
  57.         u16 t;
  58.         int xerr=0,yerr=0,delta_x,delta_y,distance;
  59.         int incx,incy,uRow,uCol;
  60.         delta_x=x2-x1; //计算坐标增量
  61.         delta_y=y2-y1;
  62.         uRow=x1;
  63.         uCol=y1;
  64.         if(delta_x>0)incx=1; //设置单步方向
  65.         else if(delta_x==0)incx=0;//垂直线
  66.         else {incx=-1;delta_x=-delta_x;}
  67.         if(delta_y>0)incy=1;
  68.         else if(delta_y==0)incy=0;//水平线
  69.         else{incy=-1;delta_y=-delta_y;}
  70.         if( delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴
  71.         else distance=delta_y;
  72.         for(t=0;t<=distance+1;t++ )//画线输出
  73.         {  
  74.                 BMP2[uRow+uCol*128]=1;//画点
  75.                 xerr+=delta_x ;
  76.                 yerr+=delta_y ;
  77.                 if(xerr>distance)
  78.                 {
  79.                         xerr-=distance;
  80.                         uRow+=incx;
  81.                 }
  82.                 if(yerr>distance)
  83.                 {
  84.                         yerr-=distance;
  85.                         uCol+=incy;
  86.                 }
  87.         }  
  88. }   

  89. //显示全屏
  90. void OLED_Fast(unsigned char BMP[])
  91. {
  92.         unsigned int j=0;
  93.         unsigned char x,y;
  94.         for(y=0;y<8;y++)
  95.         {               
  96.                 OLED_SetPos(0,y);
  97.     for(x=0;x<128;x++)
  98.                 {
  99.                         WriteDat(BMP[j]);
  100.                         j++;
  101.                 }
  102.         }
  103. }

  104. //显示折线图
  105. void ZXT(unsigned char num)
  106. {
  107.         static unsigned char num2=0;
  108.         unsigned char x,y;
  109.         LCD_DrawLine(122,63-num2,126,63-num);//画线
  110.         num2=num;
  111.         Change_to_1288((unsigned char *)BMP2);
  112.         for(x=0;x<124;x++)//画横轴和横轴刻度
  113.         {
  114.                 if(x%8==0&&x!=0)
  115.                 BMP1[x+7*128]|=0xC0;
  116.                 else
  117.                 BMP1[x+7*128]|=0x80;
  118.         }
  119.         for(y=0;y<8;y++)//画纵轴
  120.         {
  121.                 BMP1[y*128]|=0xFF;
  122.         }
  123.         for(y=0;y<8;y++)//画纵轴刻度
  124.         {
  125.                 BMP1[1+y*128]|=0x80;
  126.         }
  127.         for(y=0;y<64;y++)//图像左移4个像素
  128.         {               
  129.     for(x=0;x<124;x++)
  130.                 {
  131.                         BMP2[x+y*128]=BMP2[x+y*128+4];
  132.                 }
  133.         }
  134.         for(y=0;y<64;y++)//清除最右边的一条画线
  135.         {               
  136.     for(x=124;x<128;x++)
  137.                 {
  138.                         BMP2[x+y*128]=0;
  139.                 }
  140.         }
  141. }

  142. //LED状态设置函数
  143. void led_set(u8 sta)
  144. {
  145.         LED1=sta;
  146. }
  147. //函数参数调用测试函数
  148. void test_fun()
  149. {
  150.         OLED_DrawBMP(0,0,128,8,(unsigned char *)BMP1);
  151. }         
  152. int main(void)
  153. {        
  154.          u8 y;
  155.          u8 s[17]={44,48,55,50,53,31,40,49,48,42,38,38,25,29,46,39,47};
  156.         delay_init();                     //延时函数初始化         
  157.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  158.         uart_init(115200);                 //串口初始化为115200
  159.          LED_Init();                             //LED端口初始化
  160.         I2C_Configuration();
  161.         OLED_Init();
  162.         usmart_dev.init(SystemCoreClock/1000000);        //初始化USMART        
  163.         OLED_CLS();        
  164.           while(1)
  165.         {        
  166.                 ZXT(s[y]);//输入0到63的数
  167.                 OLED_Fast((unsigned char *)BMP1);
  168.                 y++;
  169.                 if(y==17)y=0;
  170.                 delay_ms(100);
  171.         }               
  172. }
复制代码

所有资料51hei提供下载:
OLED-显示折线图.7z (209.24 KB, 下载次数: 119)
回复

使用道具 举报

ID:408363 发表于 2019-10-6 16:15 | 显示全部楼层
像这种折线图的应用还是比较广的,一般人机交互这块用的比较多一点,比如楼主的显示温度与时间的关系,还可以用来展示某一时段的用电量等等。所以说,一般我们用到人机界面展示数据的时候,这种会比纯显示数据好的多
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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