找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2669|回复: 0
打印 上一主题 下一主题
收起左侧

msp432p401r单片机的oled显示函数

[复制链接]
跳转到指定楼层
楼主
ID:425145 发表于 2021-6-13 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请下载附件查看
  1. #include "oled.h"
  2. #include "font.h"

  3. //SSD1303 OLED 串行接口驱动代码
  4. //LCD显存存放格式如下
  5. //[0]0 1 2 3 ... 127       
  6. //[1]0 1 2 3 ... 127       
  7. //[2]0 1 2 3 ... 127       
  8. //[3]0 1 2 3 ... 127       
  9. //[4]0 1 2 3 ... 127       
  10. //[5]0 1 2 3 ... 127       
  11. //[6]0 1 2 3 ... 127       
  12. //[7]0 1 2 3 ... 127                   
  13. uint8_t LCD_GRAM[128][8];

  14. //更新显存到LCD                 
  15. void Refresh_Gram(void)
  16. {
  17.         uint8_t i,n;
  18.         for(i=0;i<8;i++)  
  19.         {  
  20.                 WriteCommand (0xb0+i);    //设置显示位置—行
  21.                 WriteCommand (0x02);      //设置显示位置—列低地址,偏移了2列
  22.                 WriteCommand (0x10);      //设置显示位置—列高地址   
  23.                 for(n=0;n<128;n++)WriteData(LCD_GRAM[n][i]);
  24.         }   
  25. }                   
  26. //SSD1303写命令
  27. //dat:要写入的字节          
  28. void WriteCommand(uint8_t cmd)
  29. {
  30.         uint8_t i;
  31.         OLED_DC_SET(0);   //写命令0,写数据1  
  32.         OLED_CS_SET(0);  
  33.         for(i=0x80;i>0;i>>=1)
  34.         {
  35.                 OLED_SCLK_SET(0);   //
  36.                 if(cmd&i)OLED_SDIN_SET(1);   //写1
  37.                 else OLED_SDIN_SET(0);   //写0
  38.                 OLED_SCLK_SET(1);   
  39.         }                                    
  40.         OLED_DC_SET(1);                  
  41.         OLED_CS_SET(1);
  42. }
  43. //SSD1303写数据
  44. //dat:要写入的字节       
  45. void WriteData( uint8_t dat)
  46. {
  47.         uint8_t i;
  48.         OLED_DC_SET(1);   //写命令0,写数据1  
  49.         OLED_CS_SET(0);  

  50.         for(i=0x80;i>0;i>>=1)
  51.         {
  52.                 OLED_SCLK_SET(0);   //
  53.                 if(dat&i)OLED_SDIN_SET(1);   //写1
  54.                 else OLED_SDIN_SET(0);   //写0
  55.                 OLED_SCLK_SET(1);   
  56.         }                                    
  57.         OLED_DC_SET(1);
  58.         OLED_CS_SET(1);
  59. }  
  60. //打开OLED     
  61. void LCD_Display_On(void)
  62. {
  63.         WriteCommand(0XAD);  //SET DCDC命令
  64.         WriteCommand(0X8B);         //DCDC ON
  65.         WriteCommand(0XAF);  //DISPLAY ON
  66. }
  67. //关闭OLED     
  68. void LCD_Display_Off(void)
  69. {
  70.         WriteCommand(0XAD);  //SET DCDC命令
  71.         WriteCommand(0X8A);         //DCDC OFF
  72.         WriteCommand(0XAE);  //DISPLAY OFF
  73. }                                            
  74. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!          
  75. void LCD_Clear(void)  
  76. {  
  77.          uint8_t i,n;
  78.         for(i=0;i<8;i++)for(n=0;n<128;n++)LCD_GRAM[n][i]=0X00;  
  79.         Refresh_Gram();//更新显示
  80. }
  81. //画点
  82. //x:0~127
  83. //y:0~63
  84. //t:1 填充 0,清空                                  
  85. void LCD_DrawPoint( uint8_t x, uint8_t y, uint8_t t)
  86. {
  87.          uint8_t pos,bx,temp=0;
  88.         if(x>127||y>63)return;//超出范围了.
  89.         pos=7-y/8;
  90.         bx=y%8;
  91.         temp=1<<(7-bx);
  92.         if(t)LCD_GRAM[x][pos]|=temp;
  93.         else LCD_GRAM[x][pos]&=~temp;            
  94. }
  95. //x1,y1,x2,y2 填充区域的对角坐标
  96. //确保x1<=x2;y1<=y2 0<=x1<=127 0<=y1<=63                  
  97. //dot:0,清空;1,填充          
  98. void LCD_Fill( uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint8_t dot)
  99. {  
  100.          uint8_t x,y;
  101.         for(x=x1;x<=x2;x++)
  102.         {
  103.                 for(y=y1;y<=y2;y++)LCD_DrawPoint(x,y,dot);
  104.         }                                                                                                            
  105.         Refresh_Gram();//更新显示
  106. }
  107. //在指定位置显示一个字符,包括部分字符
  108. //x:0~127
  109. //y:0~63
  110. //mode:0,反白显示;1,正常显示                                 
  111. //size:选择字体 16/12
  112. void LCD_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t size, uint8_t mode)
  113. {                                  
  114.          uint8_t temp,t,t1;
  115.          uint8_t y0=y;
  116.         chr=chr-' ';//得到偏移后的值                                  
  117.     for(t=0;t<size;t++)
  118.     {   
  119.                 if(size==12)temp=asc2_1206[chr][t];  //调用1206字体
  120.                 else temp=asc2_1608[chr][t];                 //调用1608字体                                   
  121.         for(t1=0;t1<8;t1++)
  122.                 {
  123.                         if(temp&0x80)LCD_DrawPoint(x,y,mode);
  124.                         else LCD_DrawPoint(x,y,!mode);
  125.                         temp<<=1;
  126.                         y++;
  127.                         if((y-y0)==size)
  128.                         {
  129.                                 y=y0;
  130.                                 x++;
  131.                                 break;
  132.                         }
  133.                 }           
  134.     }         
  135. }
  136. //m^n函数
  137. uint32_t mypow(uint8_t m, uint8_t n)
  138. {
  139.         uint32_t result=1;
  140.         while(n--)result*=m;   
  141.         return result;
  142. }                                  
  143. //显示2个数字
  144. //x,y :起点坐标         
  145. //len :数字的位数
  146. //size:字体大小
  147. //mode:模式        0,填充模式;1,叠加模式
  148. //num:数值(0~65536);         
  149. void LCD_ShowNum(uint8_t x, uint8_t y, uint16_t num, uint8_t len, uint8_t size)
  150. {                
  151.         uint8_t t,temp;
  152.         for(t=0;t<len;t++)
  153.         {
  154.                 temp=(num/mypow(10,len-t-1))%10;
  155.                  LCD_ShowChar(x+(size/2)*t,y,temp+'0',size,1);
  156.         }
  157. }
  158. //显示字符串
  159. //x,y:起点坐标  
  160. //*p:字符串起始地址
  161. //用16字体
  162. void LCD_ShowString(uint8_t x, uint8_t y, const uint8_t *p)
  163. {
  164. #define MAX_CHAR_POSX 122
  165. #define MAX_CHAR_POSY 58         
  166.     while(*p!='\0')
  167.     {      
  168.         if(x>MAX_CHAR_POSX){x=0;y+=16;}
  169.         if(y>MAX_CHAR_POSY){y=x=0;LCD_Clear();}
  170.         LCD_ShowChar(x,y,*p,16,1);
  171.         x+=8;
  172.         p++;
  173.     }  
  174. }

  175. void Oled_GPIO_Configuration(void)
  176. {
  177.         P3DIR |= OLED_DC + OLED_RST;
  178.         P5DIR |= OLED_SDIN + OLED_SCLK + OLED_CS;
  179. }

  180. //初始化SSD1303                                            
  181. void LCD_Init(void)
  182. {
  183.         uint32_t i;
  184.         Oled_GPIO_Configuration();
  185.        
  186.         OLED_RST_SET(0);
  187.         for(i=0;i<100000;i++);
  188.         OLED_RST_SET(1);
  189.                                                                                   
  190.         WriteCommand(0x00);//设置地位列地址,低四位数据           
  191.         WriteCommand(0x10);//设置高位列地址,低四位数据           
  192.         WriteCommand(0x40);//设置显示开始行地址,低五位有效 0~63   
  193.         //设置对比度
  194.         WriteCommand(0x81);  
  195.         WriteCommand(0x50);//对比度值:0x00~0xff
  196.         //重映射
  197.         WriteCommand(0xA1);//映射,A0:列0映射到SEG0;A1:列131映射到SEG0             
  198.         //全显示设置 ON/OFF
  199.         WriteCommand(0xA4);//A5:全部显示  A4:普通显示
  200.         //普通显示/反相显示
  201.         WriteCommand(0XA6); //A6:普通显示 A7:反相显示
  202.         //多元比率
  203.         WriteCommand(0xA8);//设置多元比率
  204.         WriteCommand(0x3f);//设置为0x3f;16~64
  205.         //设置DCDC
  206.         WriteCommand(0xAD);//设置DCDC
  207.         WriteCommand(0x8A);//8B=ON, 8A=Off
  208.         //显示设置
  209.         WriteCommand(0xAE);// AF=ON , AE=OFF
  210.         //显示偏移设置
  211.         WriteCommand(0xD3);//设置显示偏移
  212.         WriteCommand(0x00);//不偏移
  213.         //设置显示时钟分频因子 (刷新率)
  214.         WriteCommand(0xD5);//分频因子设置
  215.         WriteCommand(0xF0);
  216.         //区域颜色模式
  217.         WriteCommand(0xD8);//设置区域颜色模式
  218.         WriteCommand(0x00);//单色模式
  219.         //COM Pins Hardware Configuration
  220.         WriteCommand(0xDA);// Set Pins HardwareConfiguration
  221.         WriteCommand(0x12);
  222.         //VCOMH设置
  223.         WriteCommand(0xDB);//Set VCOMH
  224.         WriteCommand(0x00);
  225.         //VP设置
  226.         WriteCommand(0xD9);//Set VP
  227.         WriteCommand(0x22);//P1=2 , P2=2
  228.         WriteCommand(0xc0);//配置成标准应用          
  229.         LCD_Display_On();  //执行到这里,是看不到任何反应的!!
  230.         LCD_Clear();       //清屏幕
  231.         //LCD_Fill(0,0,128,64,1);//显示出来
  232. }
复制代码

代码工程下载: test_1.7z (676.46 KB, 下载次数: 35)

评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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