[经验] 电设之F5529(2)OLED(外设)

sunduoze   2015-8-24 22:56 楼主
电设之F5529(1)UCS
电设之F5529(2)OLED(外设)
电设之F5529(3)SPI
电设之F5529(4)定时器
电设之F5529——我的核心系统板

前边是时钟,时钟搞定了,就差了数据什么的显示,就用OLED作为显示的外设
串口后边发吧,家里有事,几个月后再补充吧!

本人新手,差的东西还很多,希望大家多多指出不足,提出好的建议,相互学习!

这个是某宝买的OLED,自己写了一些函数,又在网上整理了一些精华的函数,字母、数字(10进制、16进制、浮点数。。。)、汉字(自己取模)、logo。。。。。。。
什么的都有,不扯了,直接上代码
工程上,先包含这些代码
  1. /************************************工程中请包含此部分代码******************************/
  2. /*
  3. * Stdint.h 该头文件 重定义了 unsigned char 、unsigned int 等等。。。
  4. */
  5. #include <stdint.h>
  6. /*
  7. * Macos : 系统延时,直接依据时钟定义
  8. */
  9. //#define CPU_F (1200000)                        //Normal
  10. #define CPU_F ((double)25000000)  //25Mhz

  11. #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0) )//x MHz----us
  12. #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
  13. #define delay_s(x)         __delay_cycles((long)(CPU_F*(double)x/1.0))
  14. /*******************End of*****工程中请包含此部分代码******************************/
函数:外设OLED (需包含Font.H 该头文件,提供自定义字库)

说明;该函数为OLED 模拟SPI驱动
           void LCD_Init(uint8_t Brightness);// 入口参数为屏幕亮度

硬件接口 定义在LCD.H里

先上源文件
  1. /*
  2. * LCD.c
  3. *
  4. *  Created on: 2015年7月23日
  5. *      Author: Clover
  6. */
  7. #include <LCD.h>//P1.2->D0 P1.3->D1 P1.4->RST P1.5->DC
  8. #include <msp430.h>
  9. #include "Font.h"
  10. const unsigned long numtab[]={
  11.                 1,10,100,1000,10000,100000,1000000,10000000
  12. };

  13. /*********************LCD写数据************************************/
  14. void LCD_WrDat(uint8_t dat)
  15. {
  16.     uint8_t i=8, temp=0;
  17.     PORT_OUT |= LCD_DC;
  18.     for(i=0;i<8;i++) //发送一个八位数据
  19.     {
  20.             PORT_OUT &=~ LCD_SCL;

  21.         temp = dat&0x80;
  22.         if (temp == 0)
  23.         {
  24.             PORT_OUT &=~ LCD_SDA;
  25.         }
  26.         else
  27.         {
  28.             PORT_OUT |= LCD_SDA;
  29.         }
  30.         PORT_OUT |= LCD_SCL;
  31.         dat<<=1;
  32.     }
  33. }
  34. /*********************LCD写命令************************************/
  35. void LCD_WrCmd(uint8_t cmd)
  36. {
  37.     uint8_t i=8, temp=0;
  38.     PORT_OUT &=~ LCD_DC;
  39.     for(i=0;i<8;i++) //发送一个八位数据
  40.     {
  41.         PORT_OUT &=~ LCD_SCL;

  42.         temp = cmd&0x80;
  43.         if (temp == 0)
  44.         {
  45.             PORT_OUT &=~ LCD_SDA;
  46.         }
  47.         else
  48.         {
  49.             PORT_OUT |= LCD_SDA;
  50.         }
  51.         PORT_OUT |= LCD_SCL;
  52.         cmd<<=1;;
  53.     }
  54. }
  55. /*********************LCD 设置坐标************************************/
  56. void LCD_Set_Pos(uint8_t x, uint8_t y)
  57. {
  58.     LCD_WrCmd(0xb0+y);
  59.     LCD_WrCmd(((x&0xf0)>>4)|0x10);
  60.     LCD_WrCmd((x&0x0f)|0x00); ////
  61. }
  62. /*********************LCD全屏************************************/
  63. void LCD_Fill(uint8_t bmp_dat)
  64. {
  65.     uint8_t y,x;
  66.     for(y=0;y<8;y++)
  67.     {
  68.         LCD_WrCmd(0xb0+y);
  69.         LCD_WrCmd(0x01);
  70.         LCD_WrCmd(0x10);
  71.         for(x=0;x<X_WIDTH;x++)
  72.         {
  73.             LCD_WrDat(bmp_dat);
  74.         }

  75.     }
  76. }
  77. /*********************LCD复位************************************/
  78. void LCD_CLS(void)
  79. {
  80.     uint8_t y,x;
  81.     for(y=0;y<8;y++)
  82.     {
  83.         LCD_WrCmd(0xb0+y);
  84.         LCD_WrCmd(0x01);
  85.         LCD_WrCmd(0x10);
  86.         for(x=0;x<X_WIDTH;x++)
  87.         {
  88.             LCD_WrDat(0);
  89.         }

  90.     }
  91. }
  92. /*********************LCD初始化************************************/
  93. void LCD_Init(uint8_t Brightness)
  94. {
  95.     P1DIR |=BIT2+BIT3+BIT4+BIT5;

  96.     PORT_OUT |= LCD_SCL;
  97.     PORT_OUT &=~ LCD_RST;
  98.     delay_us(100);
  99.     PORT_OUT |= LCD_RST;      //从上电到下面开始初始化要有足够的时间,即等待RC复位完毕
  100.     LCD_WrCmd(0xae);//--turn off oled panel
  101.     LCD_WrCmd(0x00);//---set low column address
  102.     LCD_WrCmd(0x10);//---set high column address
  103.     LCD_WrCmd(0x40);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  104.     LCD_WrCmd(0x81);//--set contrast control register
  105.     LCD_WrCmd(Brightness); // Set SEG Output Current Brightness 控制显示亮度
  106.     LCD_WrCmd(0xa1);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  107.     LCD_WrCmd(0xc8);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  108.     LCD_WrCmd(0xa6);//--set normal display
  109.     LCD_WrCmd(0xa8);//--set multiplex ratio(1 to 64)
  110.     LCD_WrCmd(0x3f);//--1/64 duty
  111.     LCD_WrCmd(0xd3);//-set display offset    Shift Mapping RAM Counter (0x00~0x3F)
  112.     LCD_WrCmd(0x00);//-not offset
  113.     LCD_WrCmd(0xd5);//--set display clock divide ratio/oscillator frequency
  114.     LCD_WrCmd(0x80);//--set divide ratio, Set Clock as 100 Frames/Sec
  115.     LCD_WrCmd(0xd9);//--set pre-charge period
  116.     LCD_WrCmd(0xf1);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  117.     LCD_WrCmd(0xda);//--set com pins hardware configuration
  118.     LCD_WrCmd(0x12);
  119.     LCD_WrCmd(0xdb);//--set vcomh
  120.     LCD_WrCmd(0x40);//Set VCOM Deselect Level
  121.     LCD_WrCmd(0x20);//-Set Page Addressing Mode (0x00/0x01/0x02)
  122.     LCD_WrCmd(0x02);//
  123.     LCD_WrCmd(0x8d);//--set Charge Pump enable/disable
  124.     LCD_WrCmd(0x14);//--set(0x10) disable
  125.     LCD_WrCmd(0xa4);// Disable Entire Display On (0xa4/0xa5)
  126.     LCD_WrCmd(0xa6);// Disable Inverse Display On (0xa6/a7)
  127.     LCD_WrCmd(0xaf);//--turn on oled panel
  128.     LCD_Fill(0x00);  //初始清屏
  129.     LCD_Set_Pos(0,0);     ////
  130. }
  131. /***************功能描述:显示6*8一组标准ASCII字符串    显示的坐标(x,y),y为页范围0~7****************/
  132. void LCD_P6x8Str(uint8_t x, uint8_t y,uint8_t ch[])
  133. {
  134.     uint8_t c=0,i=0,j=0;
  135.     while (ch[j]!='\0')
  136.     {
  137.         c =ch[j]-32;
  138.         if(x>126){x=0;y++;}
  139.         LCD_Set_Pos(x,y);
  140.         for(i=0;i<6;i++)
  141.         {
  142.             LCD_WrDat(F6x8[c][i]);
  143.         }

  144.         x+=6;
  145.         j++;
  146.     }
  147. }
  148. /*******************功能描述:显示8*16一组标准ASCII字符串     显示的坐标(x,y),y为页范围0~7****************/
  149. void LCD_P8x16Str(uint8_t x, uint8_t y,uint8_t ch[])
  150. {
  151.     uint8_t c=0,i=0,j=0;
  152.     while (ch[j]!='\0')
  153.     {
  154.         c =ch[j]-32;
  155.         if(x>120){x=0;y++;}
  156.         LCD_Set_Pos(x,y);
  157.         for(i=0;i<8;i++)
  158.         {
  159.                 LCD_WrDat(F8X16[c*16+i]);
  160.         }
  161.         LCD_Set_Pos(x,y+1);
  162.         for(i=0;i<8;i++)
  163.         {
  164.             LCD_WrDat(F8X16[c*16+i+8]);
  165.         }
  166.         x+=8;
  167.         j++;
  168.     }
  169. }
  170. /*****************功能描述:显示16*16点阵  显示的坐标(x,y),y为页范围0~7****************************/
  171. void LCD_P16x16Ch(uint8_t x, uint8_t y, uint8_t n)
  172. {
  173.     uint8_t wm=0;
  174.     unsigned int adder=32*n;  //
  175.     LCD_Set_Pos(x , y);
  176.     for(wm = 0;wm < 16;wm++)  //
  177.     {
  178.         LCD_WrDat(F16x16[adder]);
  179.         adder += 1;
  180.     }
  181.     LCD_Set_Pos(x,y + 1);
  182.     for(wm = 0;wm < 16;wm++) //
  183.     {
  184.         LCD_WrDat(F16x16[adder]);
  185.         adder += 1;
  186.     }
  187. }
  188. /***************功能描述:行填充, y为页范围0~7****************/
  189. //Eg: LCD_FillLine(1,1);
  190. void LCD_FillLine(unsigned char y,unsigned char ch)
  191. {
  192.     unsigned char x;
  193.     LCD_WrCmd(0xb0+y);
  194.     LCD_WrCmd(0x01);
  195.     LCD_WrCmd(0x10);
  196.     for(x=0;x<X_WIDTH;x++)
  197.     {
  198.             LCD_WrDat(ch);
  199.     }
  200. }
  201. /***********功能描述:显示一行ascii 码?无显示的点阵显示黑色,     y为页的范围0~7*****************/
  202. //Eg: Lcd_WriteLine(3,"www.ABC.com");
  203. void Lcd_WriteLine(unsigned char line, const char *pText)
  204. {
  205.     LCD_FillLine(line-1, 0);                            //先把这一行显示成黑色
  206.     LCD_P8x16Str(0, line-1, (unsigned char *)pText);
  207. }
  208. //======================================================
  209. // 函数名称:LCD_Dis_Minus
  210. // 格式:void LCD_Dis_Minus(uint8_t x, uint8_t y,int dat,uint8_t len);
  211. // 实现功能:        显示负数
  212. // 参数:
  213. // 返回值:                无
  214. //======================================================
  215. void LCD_Dis_Minus(uint8_t x, uint8_t y,int dat,uint8_t len)
  216. {
  217.         if(dat >= 0)
  218.         {
  219.                 DispDecAt(x, y, dat, len);
  220.         }
  221.         else
  222.         {
  223.                 dat*=-1;
  224.                 LCD_P8x16Str(x,y,"-");
  225.                 DispDecAt(x+8, y, dat, len);
  226.         }
  227. }
  228. /*显示10进制数
  229. * Eg:DispDecAt(80,1,123456,6);
  230. */
  231. void DispDecAt(uint8_t x,uint8_t y,int dat,uint8_t len)
  232. {
  233.         uint8_t str[12];
  234.         uint8_t i,dl;
  235.         str[len]='\0';
  236.         for(i=0;i<len;i++)
  237.         {
  238.                 dl=dat%10;
  239.                 dat/=10;
  240.                 str[len-i-1]=dl+'0';
  241.         }
  242.         LCD_P8x16Str(x,y,str);
  243. }
  244. /*显示16进制数
  245. * Eg:DispHexAt(80,1,0x1f3f6,5);
  246. */
  247. void DispHexAt(uint8_t x,uint8_t y,long dat,uint8_t len)
  248. {
  249.         uint8_t i,dl;
  250.         uint8_t str[12];
  251.         for(i=0;i<len;i++)
  252.         {
  253.                 dl=dat&0xf;
  254.                 dat=dat>>4;
  255.                 if(dl<10)
  256.         {
  257.             str[len-i-1]=dl+'0';
  258.         }
  259.                 else
  260.         {
  261.             str[len-i-1]=dl-10+'a';
  262.         }
  263.         }
  264.         LCD_P8x16Str(x,y,str);
  265. }
  266. /*显示浮点数
  267. * uint8_t x(坐标X),uint8_t y(坐标Y),float dat(待显示的数据),uint8_t len1(整数部分长度),uint8_t len2(小数部分长度) )
  268. */
  269. void DispFloatAt(uint8_t x,uint8_t y,float dat,uint8_t len1,uint8_t len2 )
  270. {
  271.         int dat1,dat2;
  272.         dat1=(int)dat;//整数部分
  273.         dat2=(int)((dat-dat1)*numtab[len2]);
  274.         DispDecAt(x,y,dat1,len1);
  275.         LCD_P8x16Str(x+8*len1,y,".");
  276.         DispDecAt(x+8*(len1+1),y,dat2,len2);
  277. }
  278. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  279. //void Draw_BMP(uint8_t x0, uint8_t y0,uint8_t x1, uint8_t y1,uint8_t BMP[])
  280. //{
  281. //    unsigned int j=0;
  282. //    uint8_t x,y;
  283. //
  284. //    if(y1%8==0) y=y1/8;
  285. //    else y=y1/8+1;
  286. //    for(y=y0;y<y1;y++)
  287. //    {
  288. //        LCD_Set_Pos(x0,y);
  289. //        for(x=x0;x<x1;x++)
  290. //        {
  291. //            LCD_WrDat(BMP[j++]);
  292. //        }
  293. //    }
  294. //}
  295. void Draw_Logo(void)
  296. {
  297.     uint16_t i=0;
  298.     uint8_t x,y;
  299.         for(y=0;y<8;y++)
  300.         {
  301.                 LCD_Set_Pos(34,y);
  302.         for(x=34;x<98;x++)
  303.         {
  304.                     LCD_WrDat(Clover_LOGO_64x64[i++]);
  305.         }
  306.         }
  307. }

头文件
  1. /*
  2. * LCD.h
  3. *
  4. *  Created on: 2015年7月23日
  5. *      Author: Clover
  6. */

  7. #ifndef LCD_H_
  8. #define LCD_H_
  9. #include <msp430.h>

  10. //Macros
  11. #define PORT_OUT        P1OUT
  12. #define PORT_IN         P1IN

  13. #define LCD_SCL (1<<5)                         //SCLK  时钟 D0(SCLK)  15
  14. #define LCD_SDA (1<<4)        //SDA   D1(MOSI) 数据  16
  15. #define LCD_RST (1<<3)        //_RES  hardware reset   复位  17
  16. #define LCD_DC  (1<<2)        //A0  H/L 命令数据选通端,H:数据,L:命令  12

  17. //#define Brightness     0xCF//最亮
  18. //#define Brightness     0x64//一半亮度
  19. #define X_WIDTH        128
  20. #define Y_WIDTH        64


  21. extern void LCD_Fill(uint8_t bmp_dat);//LCD全屏
  22. extern void LCD_CLS(void);//LCD复位
  23. extern void LCD_Init(uint8_t Brightness);//初始化 ,入口参数:亮度
  24. extern void LCD_P6x8Str(uint8_t x, uint8_t y,uint8_t ch[]);//显示6*8一组标准ASCII字符串
  25. extern void LCD_P8x16Str(uint8_t x, uint8_t y,uint8_t ch[]);//显示8*16一组标准ASCII字符串
  26. extern void LCD_P16x16Ch(uint8_t x, uint8_t y, uint8_t n);//显示16*16一组标准ASCII字符串
  27. extern void LCD_FillLine(unsigned char y,unsigned char ch);//行填充, y为页范围0~7
  28. extern void Lcd_WriteLine(unsigned char line, const char *pText);//显示一行ascii 码?无显示的点阵显示黑色
  29. extern void LCD_Dis_Minus(uint8_t x, uint8_t y,int dat,uint8_t len);
  30. extern void DispDecAt(uint8_t x,uint8_t y,int dat,uint8_t len);//显示10进制数
  31. extern void DispHexAt(uint8_t x,uint8_t y,long dat,uint8_t len);//显示16进制数
  32. extern void DispFloatAt(uint8_t x,uint8_t y,float dat,uint8_t len1,uint8_t len2 );//显示浮点数
  33. extern void Draw_Logo(void);

  34. #endif /* LCD_H_ */

专门说明一下,这个函数里边也有接口定义,发了发现。。。带在身上的OLED是坏的,宏定义就先不改了

extern void LCD_Init(uint8_t Brightness);//初始化 ,入口参数:亮度



游客,如果您要查看本帖隐藏内容请回复






回复评论 (9)

自己先顶一下
点赞  2015-8-24 22:56
赞一个,谢谢分享,是打算发一系列的5529的帖子吗,到时候可以来个汇总贴
点赞  2015-8-25 08:44
引用: maylove 发表于 2015-8-25 08:44
赞一个,谢谢分享,是打算发一系列的5529的帖子吗,到时候可以来个汇总贴

谢谢may姐支持
点赞  2015-8-25 17:42
点赞  2016-7-18 20:07
好东西吧
点赞  2016-7-18 22:25
不错,谢谢楼主
点赞  2016-7-25 11:32
请问7线的SPI,除了电源,为什么只有四个引脚定义了呀
点赞  2017-7-13 16:48
感谢分享!!!
点赞  2017-11-3 00:34
楼主oled图片没有 吗?
点赞  2018-1-9 17:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复