找回密码
 立即注册

QQ登录

只需一步,快速开始

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

k60 oled源码 挺有用的

[复制链接]
ID:197084 发表于 2017-5-5 21:17 | 显示全部楼层 |阅读模式
这是oled 源码哦,挺有用的  山外库很少的
0.png

源程序:
  1. /**********************************
  2. **日期:2017/1/20
  3. **作者:King
  4. **功能:驱动 128*64 OLED
  5. ***********************************/

  6. #include "codetab.h"
  7. #include "oled.h"
  8. #include "MK60_spi.h"
  9. #include "MK60_gpio.h"
  10. //#include "VCAN_camera.h"

  11. const uint8 F14x16_Idx[] =
  12. {
  13.         "芜湖蓝宙电子为您服务"
  14. };
  15. const uint8 F14x16[] = {
  16. 0x0C,0xCC,0xCC,0xDE,0xDE,0xCC,0xCC,0xCC,0xDE,0xDE,0xCC,0xCC,0x0C,0x00,
  17. 0xC6,0xC6,0x66,0x36,0x1E,0x0F,0x07,0x7E,0xFE,0xC6,0xC6,0xC6,0xE6,0xE0,/*"芜",0*/

  18. 0x64,0xCC,0x18,0x30,0xFE,0xFE,0x30,0x30,0xFC,0x4C,0x4C,0xFC,0xFC,0x00,
  19. 0xF0,0x3C,0x00,0x3F,0x19,0x19,0x9F,0xC0,0x7F,0x04,0xC4,0xFF,0x7F,0x00,/*"湖",0*/


  20. 0x04,0x04,0xE4,0x04,0x0F,0xF4,0x04,0x04,0xF4,0x44,0xCF,0x44,0x44,0x44,0x04,0x00,
  21. 0x40,0x40,0x7D,0x44,0x44,0x7D,0x44,0x45,0x44,0x7C,0x44,0x45,0x7C,0x40,0x40,0x00,


  22. 0x10,0x0C,0xC4,0x44,0x44,0x44,0x45,0xF6,0x44,0x44,0x44,0x44,0xC4,0x14,0x0C,0x00,
  23. 0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x7F,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,



  24. 0x00,0x00,0xF8,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,
  25. 0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x7F,0x88,0x88,0x88,0x88,0x9F,0x80,0xF0,0x00,

  26. 0x80,0x82,0x82,0x82,0x82,0x82,0x82,0xE2,0xA2,0x92,0x8A,0x86,0x82,0x80,
  27. 0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,


  28. 0x60,0x60,0x64,0x7C,0x78,0xE0,0xFE,0x7E,0x60,0x60,0x60,0xE0,0xE0,0x00,
  29. 0xC0,0x60,0x30,0x18,0x0C,0x07,0x03,0x0C,0xD8,0xD0,0xC0,0x7F,0x3F,0x00,/*"为",0*/

  30. 0x30,0xF8,0xFE,0x06,0x30,0xB8,0x9E,0x1E,0xF8,0xF8,0x18,0xB8,0xB8,0x00,
  31. 0x60,0x73,0x03,0x78,0xF9,0xC1,0xC8,0xDB,0xD3,0xE1,0x60,0x18,0x31,0x21,/*"您",0*/


  32. 0xFE,0xFE,0x66,0xFE,0xFE,0x00,0xFE,0xFE,0x86,0xB6,0xB6,0xBE,0x9E,0x00,
  33. 0xFF,0x3F,0xC6,0xFF,0x7F,0x00,0xFF,0xFF,0x41,0x6F,0x31,0x7F,0xE7,0x40,/*"服",0*/


  34. 0x00,0x20,0x30,0x98,0xBE,0xEE,0xCC,0xCC,0xEC,0xBC,0x1C,0x00,0x00,0x00,
  35. 0xC3,0xC3,0xCF,0x6D,0x7D,0x3E,0x0E,0x0C,0xCD,0xFD,0x7F,0x03,0x03,0x01,/*"务",0*/  


  36. };


  37.    
  38. //******************************
  39. //功能说明:初始化GPIO
  40. //函数返回:无
  41. //修改时间:2017/1/20
  42. //备注:无
  43. //******************************
  44. void Init_gpio ()
  45. {
  46.   gpio_init (PTD3, GPO, 1);
  47.   gpio_init (PTD4, GPO, 1);
  48. }

  49. //********************************
  50. //功能说明:初始化SPI
  51. //函数返回:无
  52. //修改时间:2017/1/20
  53. //备注:无
  54. //********************************
  55. void Init_SPI ()
  56. {
  57.   spi_init(SPI,SPI_CS, MASTER,40*1000*1000);
  58. }

  59. //******************************
  60. //功能说明:LCD写数据
  61. //参数说明:dat 写入八位数据
  62. //函数返回:无
  63. //修改时间:2017/1/20
  64. //备注:无
  65. //******************************

  66. void LCD_WrDat(uint8 dat)
  67. {
  68.   uint8 buff;
  69.   
  70.   DC = 1;
  71.   spi_mosi(SPI,SPI_CS,&dat,&buff,1);
  72. }

  73. //******************************
  74. //功能说明:LCD写命令
  75. //参数说明:dat 写入八位数据
  76. //函数返回:无
  77. //修改时间:2017/1/20
  78. //备注:无
  79. //******************************

  80. void LCD_WrCmd(uint8 cmd)
  81. {
  82.   uint8 buff;
  83.   
  84.   DC = 0;
  85.   spi_mosi(SPI,SPI_CS,&cmd,&buff,1);
  86. }

  87. //******************************
  88. //功能说明:LCD 设置坐标
  89. //参数说明:x  0~128
  90. //          y  0~64
  91. //函数返回:无
  92. //修改时间:2014/6/12
  93. //备注:无
  94. //******************************

  95. void LCD_Set_Pos(uint8 x, uint8 y)
  96. {
  97.         LCD_WrCmd(0xb0 + y);
  98.         LCD_WrCmd(((x&0xf0)>>4)|0x10);
  99.         LCD_WrCmd((x&0x0f)|0x01);
  100.    
  101. }

  102. //******************************
  103. //功能说明:LCD 全屏
  104. //参数说明:
  105. //函数返回:无
  106. //修改时间:2014/6/12
  107. //备注:无
  108. //******************************

  109. void LCD_Fill(uint8 bmp_dat)
  110. {
  111.         uint8 y,x;
  112.         for(y=0;y<8;y++)
  113.         {
  114.                 LCD_WrCmd(0xb0+y);
  115.                 LCD_WrCmd(0x01);
  116.                 LCD_WrCmd(0x10);
  117.                 for(x=0;x<X_WIDTH;x++)
  118.                 LCD_WrDat(bmp_dat);
  119.         }
  120. }

  121. //******************************
  122. //功能说明:LCD 复位
  123. //参数说明:无
  124. //函数返回:无
  125. //修改时间:2014/6/12
  126. //备注:无
  127. //******************************

  128. void LCD_CLS(void)
  129. {
  130.         uint8 y,x;
  131.         for(y=0;y<8;y++)
  132.         {
  133.                 LCD_WrCmd(0xb0+y);
  134.                 LCD_WrCmd(0x01);
  135.                 LCD_WrCmd(0x10);
  136.                 for(x=0;x<X_WIDTH;x++)
  137.                         LCD_WrDat(0);
  138.         }
  139. }

  140. //******************************
  141. //功能说明:LCD 初始化
  142. //参数说明:无
  143. //函数返回:无
  144. //修改时间:2014/6/12
  145. //备注:无
  146. //******************************
  147. void LCD_Init(void)     
  148. {  
  149.     Init_SPI();
  150.     Init_gpio ();

  151.     RST = 0;        /* 产生一个让LCD复位的低电平脉冲 */
  152.     systick_delay_ms(100);
  153.     RST = 1;
  154.     systick_delay_ms(50);
  155.         
  156.     LCD_WrCmd(0xae);//--turn off oled panel
  157.     LCD_WrCmd(0x00);//---set low column address
  158.     LCD_WrCmd(0x10);//---set high column address
  159.     LCD_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  160.     LCD_WrCmd(0x81);//--set contrast control register
  161.     LCD_WrCmd(0xcf); // Set SEG Output Current Brightness
  162.     LCD_WrCmd(0xa0);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  163.     LCD_WrCmd(0xc0);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  164.     LCD_WrCmd(0xa6);//--set normal display
  165.     LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  166.     LCD_WrCmd(0x3f);//--1/64 duty
  167.     LCD_WrCmd(0xd3);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  168.     LCD_WrCmd(0x00);//-not offset
  169.     LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  170.     LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  171.     LCD_WrCmd(0xd9);//--set pre-charge period
  172.     LCD_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  173.     LCD_WrCmd(0xda);//--set com pins hardware configuration
  174.     LCD_WrCmd(0x12);
  175.     LCD_WrCmd(0xdb);//--set vcomh
  176.     LCD_WrCmd(0x40);//Set VCOM Deselect Level
  177.     LCD_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  178.     LCD_WrCmd(0x02);//
  179.     LCD_WrCmd(0x8d);//--set Charge Pump enable/disable
  180.     LCD_WrCmd(0x14);//--set(0x10) disable
  181.     LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  182.     LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  183.     LCD_WrCmd(0xaf);//--turn on oled panel
  184.     LCD_Fill(0x00);  //初始清屏
  185.     LCD_Set_Pos(0,0);        
  186. }

  187. //******************************
  188. //功能说明:显示6*8一组标准ASCII字符串
  189. //参数说明:显示的坐标(x,y),y为页范围0~7
  190. //函数返回:无
  191. //修改时间:2014/6/21
  192. //备注:无
  193. //******************************

  194. void LCD_P6x8Str(uint8 x,uint8 y, uint8 ch[],uint8 set)
  195. {
  196.         uint8 c = 0, i = 0, j = 0;
  197.         while(ch[j]!='\0')
  198.         {
  199.                 c = ch[j] - 32;
  200.                 if(x > 126)
  201.                 {
  202.                         x = 0;
  203.                         y++;
  204.                 }
  205.                 LCD_Set_Pos(x, y);
  206.                 for(i = 0;i < 6;i++)
  207.                 {
  208.                         if(set == 0)    LCD_WrDat( F6x8[c][i]);
  209.                         else            LCD_WrDat(~F6x8[c][i]);         
  210.                 }
  211.                 x+=6;
  212.                 j++;
  213.         }
  214. }

  215. //******************************
  216. //功能说明:显示8*16一组标准ASCII字符串
  217. //参数说明:显示的坐标(x,y),y为页范围0~7
  218. //函数返回:无
  219. //修改时间:2014/6/21
  220. //备注:无
  221. //******************************
  222. void LCD_P8x16Str(uint8 x,uint8 y, uint8 ch[], uint8 set)
  223. {
  224.         uint8 c = 0, i = 0, j = 0;
  225.         while(ch[j]!='\0')
  226.         {
  227.                 c = ch[j] - 32;
  228.                 if(x > 126)
  229.                 {
  230.                         x = 0;
  231.                         y++;
  232.                 }
  233.                 LCD_Set_Pos(x, y);
  234.                 for(i = 0;i < 8;i++)
  235.                 {
  236.                         if(set == 0)    LCD_WrDat( F8x16[i+c*16]);
  237.                         else            LCD_WrDat(~F8x16[i+c*16]);
  238.                 }
  239.                 LCD_Set_Pos(x,y+1);
  240.                 for(i = 0;i < 8;i++)
  241.                 {
  242.                         if(set == 0)    LCD_WrDat( F8x16[i+8+c*16]);
  243.                         else            LCD_WrDat(~F8x16[i+8+c*16]);
  244.                 }
  245.                 x+=8;
  246.                 j++;
  247.         }
  248. }

  249. //******************************
  250. //功能说明:显示16*16点阵
  251. //参数说明:显示的坐标(x,y),y为页范围0~7
  252. //函数返回:无
  253. //修改时间:2014/6/21
  254. //备注:无
  255. //******************************
  256. void LCD_P16x16Ch(uint8 x, uint8 y, uint8 N)
  257. {
  258.         uint8 wm = 0;
  259.         uint16 adder = 32*N;
  260.         LCD_Set_Pos(x, y);
  261.         for(wm = 0;wm < 16;wm++)
  262.         {
  263.                 LCD_WrDat(F16x16[adder]);
  264.                 adder+=1;
  265.         }
  266.         LCD_Set_Pos(x, y+1);
  267.         for(wm = 0;wm < 16;wm++)
  268.         {
  269.                 LCD_WrDat(F16x16[adder]);
  270.                 adder+=1;
  271.         }
  272. }
  273. //******************************
  274. //功能说明:显示显示BMP图片128×64起始点坐标(x,y)
  275. //参数说明:显示的坐标(x,y),y为页范围0~7
  276. //函数返回:无
  277. //修改时间:2014/6/21
  278. //备注:无
  279. //******************************

  280. void Draw_BMP(uint8 x0, uint8 y0,uint8 x1,uint8 y1,uint8 BMP[])
  281. {
  282.         uint16 j = 0;
  283.         uint8 x, y;
  284.         if(y1%8 == 0)
  285.                 y = y1/8;
  286.         else
  287.                 y = y1/8 + 1;
  288.         for(y = y0;y < y1;y++)
  289.         {
  290.                 LCD_Set_Pos(x0, y);
  291.                 for(x = x0;x < x1;x++)
  292.                         LCD_WrDat(BMP[j++]);
  293.         }
  294. }

  295. /*void Draw_Logo(uint8 x0, uint8 y0,uint8 x1, uint8 y1,uint8 Logo[])
  296. {        
  297.   uint16 j=0;
  298.   uint8 x,y;
  299.   
  300.   if(y1%8==0)
  301.     y=y1/8;      
  302.   else
  303.     y=y1/8+1;
  304.   for(y=y0;y<y1;y++)
  305.   {
  306.     LCD_Set_Pos(x0,y);
  307.     for(x=x0;x<x1;x++)
  308.     {      
  309.       LCD_WrDat(~Logo[j++]);
  310.     }
  311.   }
  312. }

  313. void Draw_Info(uint8 x0, uint8 y0, uint8 *img)
  314. {
  315.   uint16 j = 0;
  316.   uint8 x, y;
  317.   uint8 img_uint[CAMERA_H/8+1][CAMERA_W];
  318.   
  319.   for(j = 0; j < 7; j++)
  320.   {
  321.     for(uint8 i = 0; i < CAMERA_W; i++)
  322.     {      
  323.       for(uint8 k = 0; k < 8; k++)
  324.       {
  325.         img_uint[j][i] >>= 1;
  326.         if(*img != 0)        img_uint[j][i] |= 0x80;                     
  327.         img += 80;
  328.       }
  329.       img -= (80*8-1);
  330.     }
  331.     img += 7*80;
  332.   }
  333.   
  334.   for(uint8 i = 0; i < CAMERA_W; i++)
  335.     {      
  336.       for(uint8 k = 0; k < 4; k++)
  337.       {
  338.         img_uint[j][i] >>= 1;
  339.         if(*img != 0)        img_uint[j][i] |= 0x80;                     
  340.         img += 80;
  341.       }
  342.       img_uint[j][i] >>= 4;
  343.       img -= (80*4-1);
  344.     }
  345.   

  346.   for(y = y0;y < y0+8;y++)
  347.   {
  348.           LCD_Set_Pos(x0, y);
  349.           for(x = x0;x < x0+80;x++)
  350.                   LCD_WrDat(img_uint[y-y0][x-x0]);
  351.   }
  352. }
  353. */
  354. /*void Draw_line(void)
  355. {
  356.   char i = 0;
  357.   LCD_Set_Pos(20, 3);
  358.   for(i = 0;i < 14;i++)
  359.   {
  360.     LCD_WrDat(0x20);
  361.   }
  362.   LCD_WrDat(0x04);
  363.   LCD_WrDat(0x88);
  364.   LCD_WrDat(0x70);
  365.   LCD_WrDat(0x20);
  366.   LCD_Set_Pos(34, 4);
  367.   LCD_WrDat(0x01);
  368. }*/
  369. void LCD_P14x16Str(uint8 x,uint8 y,uint8 ch[])
  370. {
  371.         uint8 wm=0,ii = 0;
  372.         uint16 adder=1;
  373.        
  374.         while(ch[ii] != '\0')
  375.         {
  376.           wm = 0;
  377.           adder = 1;
  378.           while(F14x16_Idx[wm] > 127)
  379.           {
  380.                   if(F14x16_Idx[wm] == ch[ii])
  381.                   {
  382.                           if(F14x16_Idx[wm + 1] == ch[ii + 1])
  383.                           {
  384.                                   adder = wm * 14;
  385.                                   break;
  386.                           }
  387.                   }
  388.                   wm += 2;                       
  389.           }
  390.           if(x>118){x=0;y++;}
  391.           LCD_Set_Pos(x , y);
  392.           if(adder != 1)// 显示汉字                                       
  393.           {
  394.                   LCD_Set_Pos(x , y);
  395.                   for(wm = 0;wm < 14;wm++)               
  396.                   {
  397.                           LCD_WrDat(F14x16[adder]);       
  398.                           adder += 1;
  399.                   }      
  400.                   LCD_Set_Pos(x,y + 1);
  401.                   for(wm = 0;wm < 14;wm++)         
  402.                   {
  403.                           LCD_WrDat(F14x16[adder]);
  404.                           adder += 1;
  405.                   }                  
  406.           }
  407.           else                          //显示空白字符                       
  408.           {
  409.                   ii += 1;
  410.       LCD_Set_Pos(x,y);
  411.                   for(wm = 0;wm < 16;wm++)
  412.                   {
  413.                                   LCD_WrDat(0);
  414.                   }
  415.                   LCD_Set_Pos(x,y + 1);
  416.                   for(wm = 0;wm < 16;wm++)
  417.                   {                  
  418.                                   LCD_WrDat(0);       
  419.                   }
  420.           }
  421.           x += 14;
  422.           ii += 2;
  423.         }
  424. }
  425. void LCD_Print(uint8 x, uint8 y, uint8 ch[])
  426. {
  427.         uint8 ch2[3];
  428.         uint8 ii=0;        
  429.         while(ch[ii] != '\0')
  430.         {
  431.                 if(ch[ii] > 127)
  432.                 {
  433.                         ch2[0] = ch[ii];
  434.                          ch2[1] = ch[ii + 1];
  435.                         ch2[2] = '\0';                        //汉字为两个字节
  436.                         LCD_P14x16Str(x , y, ch2);        //显示汉字
  437.                         x += 14;
  438.                         ii += 2;
  439.                 }
  440.                 else
  441.                 {
  442.                         ch2[0] = ch[ii];       
  443.                         ch2[1] = '\0';                        //字母占一个字节
  444.                         LCD_P8x16Str(x , y , ch2,1);        //显示字母
  445.                      
  446.                         x += 8;
  447.                         ii+= 1;
  448.                 }
  449.                
  450.         }
  451. }

  452. void Dis_Char(unsigned char y,unsigned char x,unsigned char asc)
  453. {
  454.   unsigned char ch2[2];
  455.         x=x*8;        
  456.         ch2[0] = asc;       
  457.         ch2[1] = '\0';                        //字母占一个字节
  458.         LCD_P6x8Str(x , y , ch2,1);        //显示字母
  459. }



复制代码


oled.zip

3.29 KB, 下载次数: 38, 下载积分: 黑币 -5

回复

使用道具 举报

ID:222830 发表于 2017-7-30 20:32 | 显示全部楼层
是山外的吗?
回复

使用道具 举报

ID:226206 发表于 2017-8-9 17:01 | 显示全部楼层
黑币不够怎么下载…………………………
回复

使用道具 举报

ID:255359 发表于 2017-11-29 19:35 | 显示全部楼层
就一个文本呀
回复

使用道具 举报

ID:280621 发表于 2018-1-29 21:01 | 显示全部楼层
为什么第一个宏定义报错啊
回复

使用道具 举报

ID:135256 发表于 2018-1-29 21:03 | 显示全部楼层
请问有具体的代码吗?就一个文本看不出来什么啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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