久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11585|回復: 2
打印 上一主題 下一主題
收起左側

OLED花樣顯示之畫圓矩形直線STM32源程序

[復制鏈接]
跳轉到指定樓層
樓主
用STM32F103C8T6控制0.96寸OLED顯示屏顯示矩形,直線和圓,動態生成,是移植的正點原子TFT顯示屏的程序
制作出來的實物圖如下:


單片機源程序如下:
  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. //(x1,y1),(x2,y2):矩形的對角坐標
  91. void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2)
  92. {
  93.         LCD_DrawLine(x1,y1,x2,y1);
  94.         LCD_DrawLine(x1,y1,x1,y2);
  95.         LCD_DrawLine(x1,y2,x2,y2);
  96.         LCD_DrawLine(x2,y1,x2,y2);
  97. }
  98. //在指定位置畫一個指定大小的圓
  99. //(x,y):中心點
  100. //r    :半徑
  101. void LCD_Draw_Circle(u16 x0,u16 y0,u8 r)
  102. {
  103.         int a,b,x,y;
  104.         int di;
  105.         a=0;b=r;         
  106.         di=3-(r<<1);             //判斷下個點位置的標志
  107.         while(a<=b)
  108.         {
  109.                 BMP2[x0+a+(y0-b)*128]=1;             //5
  110.                  BMP2[x0+b+(y0-a)*128]=1;             //0           
  111.                 BMP2[x0+b+(y0+a)*128]=1;             //4               
  112.                 BMP2[x0+a+(y0+b)*128]=1;             //6
  113.                 BMP2[x0-a+(y0+b)*128]=1;             //1      
  114.                  BMP2[x0-b+(y0+a)*128]=1;            
  115.                 BMP2[x0-a+(y0-b)*128]=1;             //2            
  116.           BMP2[x0-b+(y0-a)*128]=1;             //7                     
  117.                 a++;
  118.                 //使用Bresenham算法畫圓     
  119.                 if(di<0)di +=4*a+6;         
  120.                 else
  121.                 {
  122.                         di+=10+4*(a-b);   
  123.                         b--;
  124.                 }                                                     
  125.         }
  126. }
  127. //顯示全屏
  128. void OLED_Fast(unsigned char BMP[])
  129. {
  130.         unsigned int j=0;
  131.         unsigned char x,y;
  132.         for(y=0;y<8;y++)
  133.         {               
  134.                 OLED_SetPos(0,y);
  135.     for(x=0;x<128;x++)
  136.                 {
  137.                         WriteDat(BMP[j]);
  138.                         j++;
  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 h,y,x,z;
  155.         delay_init();                     //延時函數初始化         
  156.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  157.         uart_init(115200);                 //串口初始化為115200
  158.          LED_Init();                             //LED端口初始化
  159.         I2C_Configuration();
  160.         OLED_Init();
  161.         usmart_dev.init(SystemCoreClock/1000000);        //初始化USMART        
  162.         OLED_CLS();        
  163.         h=12;
  164.           while(1)
  165.         {        
  166.                 for(y=0;y<64;y++)
  167.                 {
  168.                         for(x=0;x<128;x++)
  169.                         {
  170.                                 BMP2[x+y*128]=0;        
  171.                         }
  172.                 }
  173.                  LCD_Draw_Circle(32+z,32,12);
  174.                 LCD_Draw_Circle(96-z,32,h);
  175.                 LCD_DrawRectangle(56,48,72,56);
  176.                  Change_to_1288((unsigned char *)BMP2);
  177.                  OLED_Fast((unsigned char *)BMP1);
  178.                 if(z<8)
  179.                 z=z+1;
  180.                 else
  181.                 z=z-1;
  182.                 if(z==8)z=16;
  183.                 if(z==10)z=0;
  184.         }                        
  185. }
復制代碼

所有資料51hei提供下載:
OLED-畫圓矩形直線.7z (209.67 KB, 下載次數: 204)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:75408 發表于 2019-10-15 20:36 | 只看該作者
看似有幫助,明天放到STC90單片機中試試。
回復

使用道具 舉報

板凳
ID:884042 發表于 2021-7-30 16:01 | 只看該作者
請問可以兼容51嗎?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99久久免费观看 | 欧美一区二区三区在线观看视频 | 91精品国产91久久久久久三级 | 免费午夜剧场 | 亚洲成人网在线播放 | 影视先锋av资源噜噜 | 亚洲国产精品成人无久久精品 | 国产精品一区网站 | 日韩成人在线播放 | 美女天天操 | 国产精品久久久久久久久久久久 | 亚洲精品久久久久中文字幕欢迎你 | 欧美精品一区二区三区四区 | 另类亚洲视频 | 亚洲婷婷六月天 | 国产日韩久久 | 亚洲日韩中文字幕一区 | www.99re5.com| 欧美精品二区 | 成人免费视频网站在线看 | 午夜影视网 | 一级日批片 | 97精品久久 | 羞羞视频网页 | 欧美一区二区三区视频在线观看 | 91免费高清 | 免费观看一级毛片 | 中文字幕成人在线 | 国产精品成人69xxx免费视频 | 成人综合视频在线观看 | 成人午夜毛片 | 97在线超碰 | 日日干日日操 | 精品国产一区二区三区久久久蜜月 | 黄视频在线网站 | 国产一区二区三区免费观看视频 | 国内精品久久久久久影视8 最新黄色在线观看 | 成人免费网站www网站高清 | 国产精品一区二区福利视频 | 国产乱人伦精品一区二区 | 欧美精品91爱爱 |