[原创] 我的newbit keil5--SDK编程 加个oled玩玩

ihalin   2017-4-19 22:29 楼主
NRF51822好东西,还是玩玩原汁原味的好,给nenbit 加块oled 0.96 iic P70419-221524.jpg

SCL--->30
SDA--->0

代码:

  1. #include "oled.h"
  2. #include "stdlib.h"
  3. #include "oledfont.h"           
  4. #include "nrf_delay.h"
  5. //OLED的显存
  6. //存放格式如下.
  7. //[0]0 1 2 3 ... 127       
  8. //[1]0 1 2 3 ... 127       
  9. //[2]0 1 2 3 ... 127       
  10. //[3]0 1 2 3 ... 127       
  11. //[4]0 1 2 3 ... 127       
  12. //[5]0 1 2 3 ... 127       
  13. //[6]0 1 2 3 ... 127       
  14. //[7]0 1 2 3 ... 127                           
  15. /**********************************************
  16. //IIC Start
  17. **********************************************/
  18. /**********************************************
  19. //IIC Start
  20. **********************************************/
  21. void IIC_Start()
  22. {

  23.         OLED_SCLK_Set() ;
  24.         OLED_SDIN_Set();
  25.         OLED_SDIN_Clr();
  26.         OLED_SCLK_Clr();
  27. }

  28. /**********************************************
  29. //IIC Stop
  30. **********************************************/
  31. void IIC_Stop()
  32. {
  33. OLED_SCLK_Set() ;
  34. //        OLED_SCLK_Clr();
  35.         OLED_SDIN_Clr();
  36.         OLED_SDIN_Set();
  37.        
  38. }

  39. void IIC_Wait_Ack()
  40. {

  41.         //GPIOB->CRH &= 0XFFF0FFFF;        //设置PB12为上拉输入模式
  42.         //GPIOB->CRH |= 0x00080000;
  43. //        OLED_SDA = 1;
  44. //        delay_us(1);
  45.         //OLED_SCL = 1;
  46.         //delay_us(50000);
  47. /*        while(1)
  48.         {
  49.                 if(!OLED_SDA)                                //判断是否接收到OLED 应答信号
  50.                 {
  51.                         //GPIOB->CRH &= 0XFFF0FFFF;        //设置PB12为通用推免输出模式
  52.                         //GPIOB->CRH |= 0x00030000;
  53.                         return;
  54.                 }
  55.         }
  56. */
  57.         OLED_SCLK_Set() ;
  58.         OLED_SCLK_Clr();
  59. }
  60. /**********************************************
  61. // IIC Write byte
  62. **********************************************/

  63. void Write_IIC_Byte(unsigned char IIC_Byte)
  64. {
  65.         unsigned char i;
  66.         unsigned char m,da;
  67.         da=IIC_Byte;
  68.         OLED_SCLK_Clr();
  69.         for(i=0;i<8;i++)               
  70.         {
  71.                         m=da;
  72.                 //        OLED_SCLK_Clr();
  73.                 m=m&0x80;
  74.                 if(m==0x80)
  75.                 {OLED_SDIN_Set();}
  76.                 else OLED_SDIN_Clr();
  77.                         da=da<<1;
  78.                 OLED_SCLK_Set();
  79.                 OLED_SCLK_Clr();
  80.                 }


  81. }
  82. /**********************************************
  83. // IIC Write Command
  84. **********************************************/
  85. void Write_IIC_Command(unsigned char IIC_Command)
  86. {
  87.    IIC_Start();
  88.    Write_IIC_Byte(0x78);            //Slave address,SA0=0
  89.         IIC_Wait_Ack();       
  90.    Write_IIC_Byte(0x00);                        //write command
  91.         IIC_Wait_Ack();       
  92.    Write_IIC_Byte(IIC_Command);
  93.         IIC_Wait_Ack();       
  94.    IIC_Stop();
  95. }
  96. /**********************************************
  97. // IIC Write Data
  98. **********************************************/
  99. void Write_IIC_Data(unsigned char IIC_Data)
  100. {
  101.    IIC_Start();
  102.    Write_IIC_Byte(0x78);                        //D/C#=0; R/W#=0
  103.         IIC_Wait_Ack();       
  104.    Write_IIC_Byte(0x40);                        //write data
  105.         IIC_Wait_Ack();       
  106.    Write_IIC_Byte(IIC_Data);
  107.         IIC_Wait_Ack();       
  108.    IIC_Stop();
  109. }
  110. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  111. {
  112.         if(cmd)
  113.                         {

  114.    Write_IIC_Data(dat);
  115.    
  116.                 }
  117.         else {
  118.    Write_IIC_Command(dat);
  119.                
  120.         }


  121. }


  122. /********************************************
  123. // fill_Picture
  124. ********************************************/
  125. void fill_picture(unsigned char fill_Data)
  126. {
  127.         unsigned char m,n;
  128.         for(m=0;m<8;m++)
  129.         {
  130.                 OLED_WR_Byte(0xb0+m,0);                //page0-page1
  131.                 OLED_WR_Byte(0x00,0);                //low column start address
  132.                 OLED_WR_Byte(0x10,0);                //high column start address
  133.                 for(n=0;n<128;n++)
  134.                         {
  135.                                 OLED_WR_Byte(fill_Data,1);
  136.                         }
  137.         }
  138. }


  139. /***********************Delay****************************************/
  140. void Delay_50ms(unsigned int Del_50ms)
  141. {
  142.         unsigned int m;
  143.         for(;Del_50ms>0;Del_50ms--)
  144.                 for(m=6245;m>0;m--);
  145. }

  146. void Delay_1ms(unsigned int Del_1ms)
  147. {
  148.         unsigned char j;
  149.         while(Del_1ms--)
  150.         {       
  151.                 for(j=0;j<123;j++);
  152.         }
  153. }

  154. //坐标设置

  155.         void OLED_Set_Pos(unsigned char x, unsigned char y)
  156. {         OLED_WR_Byte(0xb0+y,OLED_CMD);
  157.         OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
  158.         OLED_WR_Byte((x&0x0f),OLED_CMD);
  159. }             
  160. //开启OLED显示   
  161. void OLED_Display_On(void)
  162. {
  163.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  164.         OLED_WR_Byte(0X14,OLED_CMD);  //DCDC ON
  165.         OLED_WR_Byte(0XAF,OLED_CMD);  //DISPLAY ON
  166. }
  167. //关闭OLED显示     
  168. void OLED_Display_Off(void)
  169. {
  170.         OLED_WR_Byte(0X8D,OLED_CMD);  //SET DCDC命令
  171.         OLED_WR_Byte(0X10,OLED_CMD);  //DCDC OFF
  172.         OLED_WR_Byte(0XAE,OLED_CMD);  //DISPLAY OFF
  173. }                                            
  174. //清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样!!!          
  175. void OLED_Clear(void)  
  176. {  
  177.         u8 i,n;                    
  178.         for(i=0;i<8;i++)  
  179.         {  
  180.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  181.                 OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  182.                 OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  183.                 for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA);
  184.         } //更新显示
  185. }
  186. void OLED_On(void)  
  187. {  
  188.         u8 i,n;                    
  189.         for(i=0;i<8;i++)  
  190.         {  
  191.                 OLED_WR_Byte (0xb0+i,OLED_CMD);    //设置页地址(0~7)
  192.                 OLED_WR_Byte (0x00,OLED_CMD);      //设置显示位置—列低地址
  193.                 OLED_WR_Byte (0x10,OLED_CMD);      //设置显示位置—列高地址   
  194.                 for(n=0;n<128;n++)OLED_WR_Byte(1,OLED_DATA);
  195.         } //更新显示
  196. }
  197. //在指定位置显示一个字符,包括部分字符
  198. //x:0~127
  199. //y:0~63
  200. //mode:0,反白显示;1,正常显示                                 
  201. //size:选择字体 16/12
  202. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  203. {             
  204.         unsigned char c=0,i=0;       
  205.                 c=chr-' ';//得到偏移后的值                       
  206.                 if(x>Max_Column-1){x=0;y=y+2;}
  207.                 if(Char_Size ==16)
  208.                         {
  209.                         OLED_Set_Pos(x,y);       
  210.                         for(i=0;i<8;i++)
  211.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  212.                         OLED_Set_Pos(x,y+1);
  213.                         for(i=0;i<8;i++)
  214.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  215.                         }
  216.                         else {       
  217.                                 OLED_Set_Pos(x,y);
  218.                                 for(i=0;i<6;i++)
  219.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  220.                                
  221.                         }
  222. }
  223. //m^n函数
  224. u32 oled_pow(u8 m,u8 n)
  225. {
  226.         u32 result=1;         
  227.         while(n--)result*=m;   
  228.         return result;
  229. }                                  
  230. //显示2个数字
  231. //x,y :起点坐标         
  232. //len :数字的位数
  233. //size:字体大小
  234. //mode:模式        0,填充模式;1,叠加模式
  235. //num:数值(0~4294967295);                           
  236. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size2)
  237. {                
  238.         u8 t,temp;
  239.         u8 enshow=0;                                                  
  240.         for(t=0;t<len;t++)
  241.         {
  242.                 temp=(num/oled_pow(10,len-t-1))%10;
  243.                 if(enshow==0&&t<(len-1))
  244.                 {
  245.                         if(temp==0)
  246.                         {
  247.                                 OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
  248.                                 continue;
  249.                         }else enshow=1;
  250.                           
  251.                 }
  252.                  OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
  253.         }
  254. }
  255. //显示一个字符号串
  256. void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 Char_Size)
  257. {
  258.         unsigned char j=0;
  259.         while (chr[j]!='\0')
  260.         {                OLED_ShowChar(x,y,chr[j],Char_Size);
  261.                         x+=8;
  262.                 if(x>120){x=0;y+=2;}
  263.                         j++;
  264.         }
  265. }
  266. //显示汉字
  267. void OLED_ShowCHinese(u8 x,u8 y,u8 no)
  268. {                                  
  269.         u8 t,adder=0;
  270.         OLED_Set_Pos(x,y);       
  271.     for(t=0;t<16;t++)
  272.                 {
  273.                                 OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
  274.                                 adder+=1;
  275.      }       
  276.                 OLED_Set_Pos(x,y+1);       
  277.     for(t=0;t<16;t++)
  278.                         {       
  279.                                 OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
  280.                                 adder+=1;
  281.       }                                       
  282. }
  283. /***********功能描述:显示显示BMP图片128×64起始点坐标(x,y),x的范围0~127,y为页的范围0~7*****************/
  284. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
  285. {        
  286. unsigned int j=0;
  287. unsigned char x,y;
  288.   
  289.   if(y1%8==0) y=y1/8;      
  290.   else y=y1/8+1;
  291.         for(y=y0;y<y1;y++)
  292.         {
  293.                 OLED_Set_Pos(x0,y);
  294.     for(x=x0;x<x1;x++)
  295.             {      
  296.                     OLED_WR_Byte(BMP[j++],OLED_DATA);                   
  297.             }
  298.         }
  299. }

  300. //初始化SSD1306                                            
  301. void OLED_Init(void)
  302. {        
  303. nrf_gpio_cfg_output(CLK);
  304. nrf_gpio_cfg_output(SDA);


  305. nrf_delay_ms(200);

  306. OLED_WR_Byte(0xAE,OLED_CMD);//--display off
  307.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  308.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  309.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  
  310.         OLED_WR_Byte(0xB0,OLED_CMD);//--set page address
  311.         OLED_WR_Byte(0x81,OLED_CMD); // contract control
  312.         OLED_WR_Byte(0xFF,OLED_CMD);//--128   
  313.         OLED_WR_Byte(0xA1,OLED_CMD);//set segment remap
  314.         OLED_WR_Byte(0xA6,OLED_CMD);//--normal / reverse
  315.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  316.         OLED_WR_Byte(0x3F,OLED_CMD);//--1/32 duty
  317.         OLED_WR_Byte(0xC8,OLED_CMD);//Com scan direction
  318.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset
  319.         OLED_WR_Byte(0x00,OLED_CMD);//
  320.        
  321.         OLED_WR_Byte(0xD5,OLED_CMD);//set osc division
  322.         OLED_WR_Byte(0x80,OLED_CMD);//
  323.        
  324.         OLED_WR_Byte(0xD8,OLED_CMD);//set area color mode off
  325.         OLED_WR_Byte(0x05,OLED_CMD);//
  326.        
  327.         OLED_WR_Byte(0xD9,OLED_CMD);//Set Pre-Charge Period
  328.         OLED_WR_Byte(0xF1,OLED_CMD);//
  329.        
  330.         OLED_WR_Byte(0xDA,OLED_CMD);//set com pin configuartion
  331.         OLED_WR_Byte(0x12,OLED_CMD);//
  332.        
  333.         OLED_WR_Byte(0xDB,OLED_CMD);//set Vcomh
  334.         OLED_WR_Byte(0x30,OLED_CMD);//
  335.        
  336.         OLED_WR_Byte(0x8D,OLED_CMD);//set charge pump enable
  337.         OLED_WR_Byte(0x14,OLED_CMD);//
  338.        
  339.         OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panel
  340. }  

  1. #ifndef __OLED_H
  2. #define __OLED_H                                   
  3. #include "nrf_delay.h"
  4. #include "nrf_gpio.h"
  5. #include "stdlib.h"         

  6. typedef uint32_t  u32;
  7. typedef uint16_t u16;
  8. typedef uint8_t  u8;

  9. #define OLED_MODE 0
  10. #define SIZE 8
  11. #define XLevelL                0x00
  12. #define XLevelH                0x10
  13. #define Max_Column        128
  14. #define Max_Row                64
  15. #define        Brightness        0xFF
  16. #define X_WIDTH         128
  17. #define Y_WIDTH         64                                                              
  18. //-----------------OLED IIC端口定义----------------                                            
  19. #define CLK 30
  20. #define SDA 0

  21. #define OLED_SCLK_Clr() nrf_gpio_pin_clear(CLK)//CLK
  22. #define OLED_SCLK_Set() nrf_gpio_pin_set(CLK)

  23. #define OLED_SDIN_Clr() nrf_gpio_pin_clear(SDA)//SDA
  24. #define OLED_SDIN_Set() nrf_gpio_pin_set(SDA)

  25. //#define OLED_RST_Clr() nrf_gpio_pin_clear(GPIOB,GPIO_Pin_11)//RES
  26. //#define OLED_RST_Set() nrf_gpio_pin_set(GPIOB,GPIO_Pin_11)
  27.                      
  28. #define OLED_CMD  0        //写命令
  29. #define OLED_DATA 1        //写数据


  30. //OLED控制用函数
  31. void OLED_WR_Byte(unsigned dat,unsigned cmd);  
  32. void OLED_Display_On(void);
  33. void OLED_Display_Off(void);                                                                                          
  34. void OLED_Init(void);
  35. void OLED_Clear(void);
  36. void OLED_DrawPoint(u8 x,u8 y,u8 t);
  37. void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);
  38. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size);
  39. void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size);
  40. void OLED_ShowString(u8 x,u8 y, u8 *p,u8 Char_Size);         
  41. void OLED_Set_Pos(unsigned char x, unsigned char y);
  42. void OLED_ShowCHinese(u8 x,u8 y,u8 no);
  43. void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[]);
  44. void Delay_50ms(unsigned int Del_50ms);
  45. void Delay_1ms(unsigned int Del_1ms);
  46. void fill_picture(unsigned char fill_Data);
  47. void Picture();
  48. void IIC_Start();
  49. void IIC_Stop();
  50. void Write_IIC_Command(unsigned char IIC_Command);
  51. void Write_IIC_Data(unsigned char IIC_Data);
  52. void Write_IIC_Byte(unsigned char IIC_Byte);

  53. void IIC_Wait_Ack();
  54. #endif  




main:
  1. #include <stdbool.h>
  2. #include <stdint.h>
  3. #include "nrf_delay.h"
  4. #include "nrf_gpio.h"
  5. #include "led.h"
  6. #include "oled.h"
  7. #include "bmp.h"
  8. /**
  9. * [url=home.php?mod=space&uid=159083]@brief[/url] Function for application main entry.
  10. */
  11. int main(void)
  12. {
  13.         int t;
  14.   // Configure LED-pins as outputs
  15.   LED_Init();
  16.         OLED_Init();                        //初始化OLED  
  17.         OLED_Clear();
  18.   
  19.   // LED 0 and LED 1 blink alternately.
  20.   while(true)
  21.   {
  22.                
  23. //               
  24. //    LED1_Open();
  25. //    LED2_Close();
  26. //    nrf_nrf_nrf_delay_ms(500);  
  27. //    LED2_Open();
  28. //    LED1_Close();   
  29. //    nrf_nrf_nrf_delay_ms(500);
  30.                
  31.                 OLED_Clear();
  32.                 t++;
  33.                 if(t>'~')t=' ';
  34.                 OLED_ShowNum(103,6,t,3,16);//显示ASCII字符的码值
  35.                 OLED_DrawBMP(0,0,128,8,BMP1);  //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)
  36.                 nrf_delay_ms(8000);
  37.                                         nrf_delay_ms(8000);
  38.                 nrf_delay_ms(8000);
  39.                 nrf_delay_ms(8000);
  40.                 OLED_DrawBMP(0,0,128,8,BMP1);
  41.                 nrf_delay_ms(8000);
  42.                                         nrf_delay_ms(8000);
  43.                 nrf_delay_ms(8000);
  44.                 nrf_delay_ms(8000);
  45.   }
  46. }



此内容由EEWORLD论坛网友ihalin原创,如需转载或用于商业用途需征得作者同意并注明出处


回复评论 (1)

还是C++编程功能最强,适合高手使用。还可以试试mbed,也很方便。
点赞  2017-4-19 23:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复